diff -r 000000000000 -r 05e9090e2422 skins/AknSkins/src/AknsMaskedLayerBackgroundControlContext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/skins/AknSkins/src/AknsMaskedLayerBackgroundControlContext.cpp Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,244 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Layered background control context with mask bitmap. +* +*/ + +#include "AknsCppPreface.h" +#include "AknsMaskedLayerBackgroundControlContext.h" + +#include +#include "AknsBackgroundLayout.h" +#include "AknsDebug.h" + +#include "AknIconUtils.h" +#include +#include "AknsAppSkinInstance.h" + +// ======== MEMBER FUNCTIONS ======== +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::CAknsMaskedLayerBackgroundControlContext +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CAknsMaskedLayerBackgroundControlContext::CAknsMaskedLayerBackgroundControlContext() : + CAknsLayeredBackgroundControlContext() + // CBase initializes: iLayoutArray(NULL), iLayoutArraySize(0) + { + } + +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CAknsMaskedLayerBackgroundControlContext::ConstructL( + const TRect& aRect, const TBool aParentAbsolute, + const TAknsItemID& aImageID, const TInt aNumberOfLayers ) + { + CAknsLayeredBackgroundControlContext::ConstructL( aRect, aParentAbsolute, + aImageID, aNumberOfLayers ); + } + +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +AKNS_EXPORTED_METHOD(CAknsMaskedLayerBackgroundControlContext::NewL) +EXPORT_C CAknsMaskedLayerBackgroundControlContext* + CAknsMaskedLayerBackgroundControlContext::NewL( + const TAknsItemID& aImageID, const TRect& aRect, + const TBool aParentAbsolute, const TInt aNumberOfLayers ) + { +#ifndef RD_FULLSCREEN_WALLPAPER + User::Leave( KErrNotSupported ); +#endif //RD_FULLSCREEN_WALLPAPER + CAknsMaskedLayerBackgroundControlContext* self = + new( ELeave ) CAknsMaskedLayerBackgroundControlContext(); + + CleanupStack::PushL( self ); + self->ConstructL( aRect, aParentAbsolute, aImageID, aNumberOfLayers ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor. +// ----------------------------------------------------------------------------- +// +CAknsMaskedLayerBackgroundControlContext::~CAknsMaskedLayerBackgroundControlContext() + { +#ifndef RD_FULLSCREEN_WALLPAPER + return; +#else + delete iOffScreenDevice; + delete iOffScreenGc; + delete iOffScreenBmp; + delete iLayerMask; +#endif //RD_FULLSCREEN_WALLPAPER + } + +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::SetLayerImage +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +AKNS_EXPORTED_METHOD(CAknsMaskedLayerBackgroundControlContext::SetLayerImage) +EXPORT_C void CAknsMaskedLayerBackgroundControlContext::SetLayerImage( + const TInt aLayer, const TAknsItemID& aID ) + { +#ifndef RD_FULLSCREEN_WALLPAPER + return; +#else + CAknsLayeredBackgroundControlContext::SetLayerImage( + aLayer, + aID ); +#endif //RD_FULLSCREEN_WALLPAPER + } + +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::SetLayerRect +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +AKNS_EXPORTED_METHOD(CAknsMaskedLayerBackgroundControlContext::SetLayerRect) +EXPORT_C void CAknsMaskedLayerBackgroundControlContext::SetLayerRect( + const TInt aLayer, const TRect& aRect ) + { +#ifndef RD_FULLSCREEN_WALLPAPER + return; +#else + CAknsLayeredBackgroundControlContext::SetLayerRect( + aLayer, + aRect ); +#endif //RD_FULLSCREEN_WALLPAPER + } + +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::SetLayerMaskAndSizeL +// (other items were commented in a header). +// By default layer depth is set to one. +// ----------------------------------------------------------------------------- +// +AKNS_EXPORTED_METHOD(CAknsMaskedLayerBackgroundControlContext::SetLayerMaskAndSizeL) +EXPORT_C void CAknsMaskedLayerBackgroundControlContext::SetLayerMaskAndSizeL( + const TAknsItemID& aIID, const TRect& aMaskRect ) + { +#ifndef RD_FULLSCREEN_WALLPAPER + User::Leave( KErrNotSupported ); + return; +#else + if ( iOffScreenDevice ) + { + delete iOffScreenDevice; + iOffScreenDevice = NULL; + } + + if ( iOffScreenGc ) + { + delete iOffScreenGc; + iOffScreenGc = NULL; + } + + if ( iLayerMask ) + { + delete iLayerMask; + iLayerMask = NULL; + } + + if ( iOffScreenBmp ) + { + delete iOffScreenBmp; + iOffScreenBmp = NULL; + } + + // Client did not set mask - previous mask & offscreen bitmap + // deleted, just return. + if ( aIID == KAknsIIDNone ) + { + return; + } + + // Only do this if layer 0 is actually available. + CAknsItemData* itemData = NULL; + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + if ( skinInstance ) + { + TRAP_IGNORE( + itemData = skinInstance->CreateUncachedItemDataL( + iLayout->iImageID, EAknsITUnknown ) ); + } + + if ( itemData ) + { + // Create layer mask item. + AknsUtils::CreateIconL(AknsUtils::SkinInstance(), aIID, iLayerMask, KNullDesC, 0); + User::LeaveIfError(AknIconUtils::SetSize(iLayerMask, aMaskRect.Size(),EAspectRatioNotPreserved)); + + // Create offscreen bitmap. + iOffScreenBmp = new (ELeave) CFbsBitmap; + + CAknsAppSkinInstance* appInstance = + static_cast(skinInstance); + + if ( appInstance && appInstance->AnimBackgroundState() ) + iOffScreenBmp->Create(aMaskRect.Size(), EColor16MA); + else + iOffScreenBmp->Create(aMaskRect.Size(), EColor64K); + + iOffScreenDevice = CFbsBitmapDevice::NewL(iOffScreenBmp); + User::LeaveIfError(iOffScreenDevice->CreateContext(iOffScreenGc)); + TPoint myPoint( 0, 0 ); + + // Draw the upper layers to offscreen bitmap. + AknsDrawUtils::DrawBackground( + AknsUtils::SkinInstance(), + this, + NULL, + *iOffScreenGc, + myPoint, + aMaskRect, + KAknsDrawParamIgnoreLayerMask ); + } + + if (itemData) + { + delete itemData; + } +#endif //RD_FULLSCREEN_WALLPAPER + } + +// ----------------------------------------------------------------------------- +// CAknsMaskedLayerBackgroundControlContext::IsCompatibleWithType +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CAknsMaskedLayerBackgroundControlContext::IsCompatibleWithType( + const TAknsControlContextType aType ) const + { +#ifndef RD_FULLSCREEN_WALLPAPER + return EFalse; +#else + if ( aType == EAknsControlContextTypeMasked ) + { + return ETrue; + } + return EFalse; +#endif //RD_FULLSCREEN_WALLPAPER + } + +// End of file