--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/AknExtendedFader/src/AknExtendedFaderImpl.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,296 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#define GRAPHICS_BUILD_WSERV2 1
+
+#include <e32std.h>
+#include <bitdev.h>
+#include <bitdraw.h>
+#include <bitdrawinterfaceid.h>
+#include <bmalphablend.h>
+
+#include "AknExtendedFaderImpl.h"
+#include "AknExtendedFaderGfx.h"
+#include "AknExtendedFaderTraces.h"
+
+
+_LIT(KAknExtendedFaderName, "AknExtendedFader");
+
+
+class CHelperFbsDevice : public CFbsBitmapDevice
+{
+public:
+ CFbsDrawDevice* DrawDevice() { return iDrawDevice; }
+};
+
+CAknExtendedFader* CAknExtendedFader::CreateL()
+ {
+ TRACE("CAknExtendedFader::CreateL");
+ return new (ELeave) CAknExtendedFader;
+ }
+
+void CAknExtendedFader::ConstructL(MWsGraphicDrawerEnvironment& aEnv,const TDesC8& /*aData*/)
+ {
+ TRACE("CAknExtendedFader::ConstructL >>");
+
+ BaseConstructL(aEnv);
+
+ // Start P&S watchers
+ //iStartupWatcher = CAknExtendedFaderStartupWatcher::NewL(*this); <-- Can be added if needs to watch startup, but probably not needed
+ iColorSchemeWatcher = CAknExtendedFaderColorSchemeWatcher::NewL(*this);
+
+ TRACE("CAknExtendedFader::ConstructL <<");
+ }
+
+// By default do white fader
+CAknExtendedFader::CAknExtendedFader() :
+ iColorOverlayR(0xFF), iColorOverlayG(0x00), iColorOverlayB(0x00),
+ iBlackMap(16), iWhiteMap(140)
+ {
+ }
+
+CAknExtendedFader::~CAknExtendedFader()
+ {
+ TRACE("CAknExtendedFader::~CAknExtendedFader");
+
+ delete iStartupWatcher; iStartupWatcher = 0;
+ delete iColorSchemeWatcher; iColorSchemeWatcher = 0;
+
+ TRACE("CAknExtendedFader::~CAknExtendedFader <<");
+ }
+
+TBool CAknExtendedFader::DoFastFading(CFbsBitGc* aBitGc, const TRegion * aRegion)
+ {
+ TRACE("CAknExtendedFader::DoFastFading >>");
+
+ // Get the drawdevice
+ CHelperFbsDevice* device = static_cast<CHelperFbsDevice*>(aBitGc->Device());
+ if(!device)
+ {
+ TRACE("CAknExtendedFader::DoFastFading: !device");
+ return EFalse;
+ }
+
+ CFbsDrawDevice* drawDevice = device->DrawDevice();
+ if(!drawDevice)
+ {
+ TRACE("CAknExtendedFader::DoFastFading: !drawDevice");
+ return EFalse;
+ }
+
+ device->DrawingBegin();
+
+ // Display mode
+ TDisplayMode displayMode = drawDevice->DisplayMode();
+ TRACE1("CAknExtendedFader::DoFastFading: display mode = %d", displayMode);
+
+ TBool ret = EFalse;
+ switch(displayMode)
+ {
+ case EColor64K:
+ ret = DoFastFading64K(drawDevice, aRegion);
+ break;
+
+ case EColor16MU:
+ // fall-through
+
+ case EColor16MA:
+ ret = DoFastFading16MX(drawDevice, aRegion);
+ break;
+
+ default:
+ // Other modes not supported
+ ret = EFalse;
+ break;
+ }
+
+ device->DrawingEnd();
+
+ TRACE("CAknExtendedFader::DoFastFading <<");
+ return ret;
+ }
+
+TBool CAknExtendedFader::DoFastFading16MX(CFbsDrawDevice* aDrawDevice, const TRegion * aRegion)
+ {
+ // Do fast fading for 32-bit graphics
+ TRACE("CAknExtendedFader::DoFastFading16MX >>");
+
+ TAny* ptr = NULL;
+ TInt ret = aDrawDevice->GetInterface(KFastBlit2InterfaceID, ptr);
+ if(ret!=KErrNone)
+ {
+ // We need to get the fastblit2 interface to access the image data
+ TRACE("CAknExtendedFader::DoFastFading16MX: !fastblit2");
+ return EFalse;
+ }
+
+ MFastBlit2* interface = static_cast<MFastBlit2*>(ptr);
+
+ TUint32* dataAddress = const_cast<TUint32*>(interface->Bits());
+ if(!dataAddress)
+ {
+ TRACE("CAknExtendedFader::DoFastFading16MX: !dataAddress");
+ return EFalse;
+ }
+
+ // Image width often != scanline length
+ TSize size(aDrawDevice->SizeInPixels());
+ TInt strideInPixels = aDrawDevice->ScanLineBytes() >> 2;
+
+ TInt rectCount = aRegion->Count();
+
+ TInt fadeMapFactor = iWhiteMap - iBlackMap;
+ TInt fadeMapOffset = iBlackMap;
+
+ for(TInt i=0; i<rectCount; i++)
+ {
+ const TRect& rect((*aRegion)[i]);
+
+ TRACE5("CAknExtendedFader::DoFastFading16MX: rect %d = %d.%d -> %d.%d", i+1, rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY);
+
+ TAknExtendedFaderGfx::FadeRect_GrayColorize_16MX(dataAddress, strideInPixels, rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY, fadeMapFactor, fadeMapOffset, iColorOverlayR, iColorOverlayG, iColorOverlayB);
+
+ // Ensure screen device is informed of area to update
+ aDrawDevice->UpdateRegion(rect);
+ }
+
+ TRACE("CAknExtendedFader::DoFastFading16MX <<");
+ return ETrue;
+ }
+
+TBool CAknExtendedFader::DoFastFading64K(CFbsDrawDevice* aDrawDevice, const TRegion * aRegion)
+ {
+ // Do fast fading for 16-bit graphics
+ TRACE("CAknExtendedFader::DoFastFading64K >>");
+
+ TAny* ptr = NULL;
+ TInt ret = aDrawDevice->GetInterface(KFastBlit2InterfaceID, ptr);
+ if(ret!=KErrNone)
+ {
+ // We need to get the fastblit2 interface to access the image data
+ TRACE("CAknExtendedFader::DoFastFading64K: !fastblit2");
+ return EFalse;
+ }
+
+ MFastBlit2* interface = static_cast<MFastBlit2*>(ptr);
+
+ TUint32* dataAddress = const_cast<TUint32*>(interface->Bits());
+ if(!dataAddress)
+ {
+ TRACE("CAknExtendedFader::DoFastFading64K: !dataAddress");
+ return EFalse;
+ }
+
+ // Image width often != scanline length
+ TSize size(aDrawDevice->SizeInPixels());
+ TInt strideInPixels = aDrawDevice->ScanLineBytes() >> 1;
+
+ TInt rectCount = aRegion->Count();
+
+ TInt fadeMapFactor = iWhiteMap - iBlackMap;
+ TInt fadeMapOffset = iBlackMap;
+
+ for(TInt i=0; i<rectCount; i++)
+ {
+ const TRect& rect((*aRegion)[i]);
+
+ TRACE5("CAknExtendedFader::DoFastFading64K: rect %d = %d.%d -> %d.%d", i+1, rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY);
+
+ TAknExtendedFaderGfx::FadeRect_GrayColorize_64K((TUint16*)dataAddress, strideInPixels, rect.iTl.iX, rect.iTl.iY, rect.iBr.iX, rect.iBr.iY, fadeMapFactor, fadeMapOffset, iColorOverlayR, iColorOverlayG, iColorOverlayB);
+
+ // Ensure screen device is informed of area to update
+ aDrawDevice->UpdateRegion(rect);
+ }
+
+ TRACE("CAknExtendedFader::DoFastFading64K <<");
+ return ETrue;
+ }
+
+void CAknExtendedFader::FadeArea(CFbsBitGc* aBitGc,const TRegion * aRegion)
+ {
+ if(!aBitGc || !aRegion)
+ {
+ return;
+ }
+
+ TRACE("CAknExtendedFader::FadeArea >>");
+
+ TInt rectCount = aRegion->Count();
+ if(!rectCount)
+ {
+ // Quick bailout if there is nothing to fade
+ return;
+ }
+
+ aBitGc->Reset();
+ if(!DoFastFading(aBitGc, aRegion))
+ {
+ // For some reason fast fading was not possible (wrong display mode?), use legacy fading.
+ TRACE("CAknExtendedFader::FadeArea: Do traditional fading");
+ aBitGc->SetFadingParameters(iBlackMap,iWhiteMap);
+ aBitGc->FadeArea(aRegion);
+ }
+
+ TRACE("CAknExtendedFader::FadeArea <<");
+ }
+
+void CAknExtendedFader::SetFadingParameters(const TDesC8& /*aData*/)
+ {
+ // No implementation needed
+ }
+
+TAny* CAknExtendedFader::ResolveObjectInterface(TUint aTypeId)
+ {
+ switch (aTypeId)
+ {
+ case MWsFader::EWsObjectInterfaceId:
+ return static_cast<MWsFader*>(this);
+ }
+
+ return NULL;
+ }
+
+const TDesC& CAknExtendedFader::PluginName() const
+ {
+ return KAknExtendedFaderName;
+ }
+
+void CAknExtendedFader::GlobalSystemStateChangedL(TPSGlobalSystemState aState)
+ {
+ TRACE1("CAknExtendedFader::GlobalSystemStateChangedL: aState = %d", aState);
+ }
+
+void CAknExtendedFader::ColorSchemeChanged(const TUint32 &aNewColor, const TUint8& aNewBlackMap, const TUint8& aNewWhiteMap)
+ {
+ TRACE3("CAknExtendedFader::ColorSchemeChanged: aNewColor=%08X, aNewBlackMap=%08X, aNewWhiteMap=%08X", aNewColor, aNewBlackMap, aNewWhiteMap);
+
+ // Save fader values
+ iBlackMap = aNewBlackMap;
+ iWhiteMap = aNewWhiteMap;
+
+ // Save color scheme as separate R,G,B
+ iColorOverlayR = (aNewColor>>16)&0xFF;
+ iColorOverlayG = (aNewColor>>8)&0xFF;
+ iColorOverlayB = aNewColor&0xFF;
+
+ //iBlackMap = 16;
+ //iWhiteMap = 140;
+
+ //iColorOverlayR = 0xFF;
+ //iColorOverlayG = 0x00;
+ //iColorOverlayB = 0x00;
+ }
+