diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10TextureManager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10TextureManager.cpp Tue Feb 02 07:56:43 2010 +0200 @@ -0,0 +1,176 @@ +/* +* Copyright (c) 2006-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: ?Description +* +*/ + + + +#include "HuiVg10TextureManager.h" // Class definition +#include "HuiVg10TextureProcessor.h" + + +CHuiVg10TextureManager* CHuiVg10TextureManager::NewL(CHuiEnv& aEnv) + { + CHuiVg10TextureManager* self = CHuiVg10TextureManager::NewLC(aEnv); + CleanupStack::Pop(self); + return self; + } + + +CHuiVg10TextureManager* CHuiVg10TextureManager::NewLC(CHuiEnv& aEnv) + { + CHuiVg10TextureManager* self = new (ELeave) CHuiVg10TextureManager(aEnv); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + + +CHuiVg10TextureManager::CHuiVg10TextureManager(CHuiEnv& aEnv) + : CHuiTextureManager(aEnv) + { + } + + +void CHuiVg10TextureManager::ConstructL() + { + CHuiTextureManager::BaseConstructL(); + + // Create a texture processor. + CHuiVg10TextureProcessor* proc = CHuiVg10TextureProcessor::NewL(Env()); + SetProcessor(proc); // ownership to base class + + iBitmap16MA = new (ELeave) CFbsBitmap; + iBitmap16MA->Create(TSize(1,1), EColor16MA); + iBitmap16MU = new (ELeave) CFbsBitmap; + iBitmap16MU->Create(TSize(1,1), EColor16MU); + iBitmap64K = new (ELeave) CFbsBitmap; + iBitmap64K->Create(TSize(1,1), EColor64K); + iBitmap256Gray = new (ELeave) CFbsBitmap; + iBitmap256Gray->Create(TSize(1,1), EGray256); + + iBitmapDevice16MA = CFbsBitmapDevice::NewL(iBitmap16MA); + iBitmapDevice16MU = CFbsBitmapDevice::NewL(iBitmap16MU); + iBitmapDevice64K = CFbsBitmapDevice::NewL(iBitmap64K); + iBitmapDevice256Gray = CFbsBitmapDevice::NewL(iBitmap256Gray); + } + + +CHuiVg10TextureManager::~CHuiVg10TextureManager() + { + delete iBitmap16MA; + delete iBitmap16MU; + delete iBitmap64K; + delete iBitmap256Gray; + delete iBitmapDevice16MA; + delete iBitmapDevice16MU; + delete iBitmapDevice64K; + delete iBitmapDevice256Gray; + delete iBitGc16MA; + delete iBitGc16MU; + delete iBitGc64K; + delete iBitGc256Gray; + } + +CFbsBitmap& CHuiVg10TextureManager::ConvertBitmapL(const CFbsBitmap& aBitmap, TDisplayMode aDisplayMode, TBitmapCopyMode aCopyMode, TSize aNewSize) + { + TSize newSize = aBitmap.SizeInPixels(); + if (aNewSize != TSize(0,0)) + { + newSize = aNewSize; + } + + // Select the correct Colormode bitmap & device + CFbsBitmap* bitmap = NULL; + CFbsBitmapDevice* bitmapDevice = NULL; + CFbsBitGc* bitGc = NULL; + // This is needed for storing the possibly recreated bitGc to a member variable + CFbsBitGc** bitGcMemberPtr = NULL; + switch(aDisplayMode) + { + case EColor16MA: + bitmap = iBitmap16MA; + bitmapDevice = iBitmapDevice16MA; + bitGc = iBitGc16MA; + bitGcMemberPtr = &iBitGc16MA; + break; + case EColor16MU: + bitmap = iBitmap16MU; + bitmapDevice = iBitmapDevice16MU; + bitGc = iBitGc16MU; + bitGcMemberPtr = &iBitGc16MU; + break; + case EColor64K: + bitmap = iBitmap64K; + bitmapDevice = iBitmapDevice64K; + bitGc = iBitGc64K; + bitGcMemberPtr = &iBitGc64K; + break; + case EGray256: + bitmap = iBitmap256Gray; + bitmapDevice = iBitmapDevice256Gray; + bitGc = iBitGc256Gray; + bitGcMemberPtr = &iBitGc256Gray; + break; + default: + // Not supported! Implement more cases if needed, otherwise this'll leave + User::Leave(KErrNotSupported); + break; + } + + // No conversion required? + if ( aCopyMode == EAllowDuplication && aBitmap.DisplayMode() == aDisplayMode && + !aBitmap.IsCompressedInRAM() && newSize == aBitmap.SizeInPixels() ) + { + // If the bitmap's color mode was already correct & sizes matched, + // and bmp isn't rombitmap, no conversion was required and we can return + // the same bitmap that was given as a parameter + CFbsBitmap& bmp = const_cast(aBitmap); + return bmp; + } + + // If needed, Resize the bitmap & bitmapDevice to correct dimensions, + // instead of recreating them always + if (newSize != bitmap->SizeInPixels() || !bitGc) + { + // Try to resize the bitmap & bmpDevice, leave, if e.g. out of memory + User::LeaveIfError(bitmap->Resize(newSize)); + + delete bitGc; + bitGc = 0; + *bitGcMemberPtr = 0; + + User::LeaveIfError(bitmapDevice->Resize(newSize)); + + // The BitGc has to be created every time separately + User::LeaveIfError(bitmapDevice->CreateContext(bitGc)); + // Store the newly created context to a correct member variable + *bitGcMemberPtr = bitGc; + } + + if (aDisplayMode == EColor16MA && bitGc) + { + bitGc->SetDrawMode(CGraphicsContext::EDrawModeWriteAlpha); + } + + if (bitGc) + { + bitGc->BitBlt(TPoint(0, 0), &aBitmap); + } + return *bitmap; + } + +// End of file +