skins/AknSkins/src/AknsMaskedLayerBackgroundControlContext.cpp
changeset 0 05e9090e2422
--- /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 <AknsUtils.h>
+#include "AknsBackgroundLayout.h"
+#include "AknsDebug.h"
+
+#include "AknIconUtils.h"
+#include <AknsDrawUtils.h>
+#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<CAknsAppSkinInstance*>(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