uiacceltk/hitchcock/coretoolkit/rendervg10/src/HuiVg10TextureManager.cpp
changeset 0 15bf7259bb7c
--- /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<CFbsBitmap&>(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
+