uifw/AvKon/AknExtendedFader/src/AknExtendedFaderImpl.cpp
changeset 0 2f259fa3e83a
--- /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;
+	}
+