diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/AknExtendedFader/src/AknExtendedFaderImpl.cpp --- /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 +#include +#include +#include +#include + +#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(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(ptr); + + TUint32* dataAddress = const_cast(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 %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(ptr); + + TUint32* dataAddress = const_cast(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 %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(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; + } +