uiacceltk/hitchcock/Client/src/alfskinnableimage.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/Client/src/alfskinnableimage.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,238 @@
+/*
+* Copyright (c) 2006 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:   Skinnable image
+*
+*/
+
+
+
+#include <alf/alfconstants.h>
+#include "alfskinnableimage.h"
+#include "alf/alfimageloaderutil.h"
+#include "alf/alftexturemanager.h"
+#include "alf/alftexture.h"
+#include "alf/alfenv.h"
+#include "alfclient.h"
+
+#include <uiacceltk/HuiUtil.h>
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CAlfSkinnableImage::CAlfSkinnableImage(CAlfEnv* aEnv)
+    {
+    iEnv = aEnv;    
+    }
+    
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//    
+CAlfSkinnableImage::~CAlfSkinnableImage()
+    {
+    if (Image().HasTexture())
+        {
+        CAlfTextureManager& oldManager = ImageTextureManager(Image());
+        oldManager.DecRefcount(iId);        
+        }
+    
+    DeleteTexture();
+
+    // Remove size observer if needed
+    if (iSkinnedImageUtil)
+       {
+       CAlfTextureManager& manager = ImageTextureManager(iSkinnedImageTextureManagerId);        
+       manager.RemoveAutoSizeObserver(iSkinnedImageUtil);
+       }
+       
+    delete iSkinnedImageUtil; 
+    }
+        
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+
+void CAlfSkinnableImage::SetImage(const TAlfImage& aImage)
+    {    
+    CAlfTextureManager& oldManager = ImageTextureManager(Image());
+    CAlfTextureManager& newManager = ImageTextureManager(aImage);
+    
+    if (Image().HasTexture())
+        {
+        oldManager.DecRefcount(iId);        
+        }
+        
+    if ( iSkinnedImageUtil )
+        {
+        oldManager.RemoveAutoSizeObserver(iSkinnedImageUtil);   
+        delete iSkinnedImageUtil;
+        iSkinnedImageUtil = NULL;
+        } 
+    
+    iImage = aImage;
+    TRAP_IGNORE(CreateTextureL()); // Creates texture from skin id if needed           
+
+    if (Image().HasTexture())
+        {
+        CAlfTexture* texture = (CAlfTexture*)&Image().Texture();
+        iId = texture->Id();        
+        newManager.IncRefcount(iId);        
+        
+        // If texture does not have content and it has been released because of
+        // ref counting try to restore content.
+        if (!texture->HasContent())        
+            {
+            TInt releaseFlags = texture->ReleaseFlags();  
+            if (releaseFlags & CAlfTexture::EReleaseFromRefCounting)
+                {
+                // Clear release flag 
+                releaseFlags &= ~CAlfTexture::EReleaseFromRefCounting;    
+                texture->SetReleaseFlags(releaseFlags);
+            
+                // If there are no more release flags, try to restore content.
+                if (!releaseFlags)
+                    {                                        
+                     if (texture->BitmapProvider())
+                        {
+                        TRAP_IGNORE(newManager.UpdateTextureFromBitmapL(iId))    
+                        }
+                    else
+                        {
+                        TRAP_IGNORE(newManager.UpdateTextureFromFileL(iId))                        
+                        }    
+                    }
+                }
+            }
+        }
+    else
+        {
+        iId = 0;
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+TAlfImage& CAlfSkinnableImage::Image()
+    {
+    return iImage;    
+    }
+    
+// ---------------------------------------------------------------------------
+// 
+// ---------------------------------------------------------------------------
+//    
+void CAlfSkinnableImage::CreateTextureL()
+    {
+    if (iImage.SkinnableImage())
+        {      
+        // old iSkinnedImageUtil should be freed already
+        __ASSERT_DEBUG( !iSkinnedImageUtil, USER_INVARIANT() );
+        iSkinnedImageUtil = new (ELeave) CAlfAutoSizeImageLoaderUtil;
+        
+        CAlfTextureManager& tm = ImageTextureManager(iImage);
+        
+        // Add size observer if needed
+        if (iImage.TextureFlags() & EAlfTextureFlagAutoSize)
+            {
+            tm.AddAutoSizeObserverL(iSkinnedImageUtil);        
+            }        
+
+        CAlfTexture* texture = NULL;
+        iSkinnedImageUtil->SetSize(iImage.PreferredSize(), iImage.PreferredScaleMode());
+        
+        MAlfBitmapProvider* imageprovider = NULL;
+        if (iImage.AppIconUid() != TUid::Uid(0))
+            {
+            imageprovider = iSkinnedImageUtil->CreateImageLoaderL(iImage.AppIconUid(), 
+                iImage.AppIconType());                
+            }
+        else
+            {
+            imageprovider = iSkinnedImageUtil->CreateImageLoaderL(iImage.SkinID(), 
+                *iImage.FallbackFileName(),
+                iImage.FallbackBitmapId(),
+                iImage.FallbackMaskId());                
+            }    
+        
+        texture = &tm.CreateTextureL(iImage.PreferredTextureId(), imageprovider, iImage.TextureFlags());                     
+        iImage.SetTexture(*texture);
+        
+        // Delete old texture if we managed to create new one 
+        if (texture)
+            {
+            // Check that the new one is really a new one, not just reusing old id.
+            if (texture->Id() != iSkinnedImageTextureId || tm.ManagerUid() != iSkinnedImageTextureManagerId)
+                {
+                DeleteTexture();
+                iSkinnedImageTextureId = texture->Id();
+                iSkinnedImageTextureManagerId = tm.ManagerUid();                    
+                }            
+            }                    
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// This function deletes texture associated to image, but does not delete
+// the bitmapprovider (it is left to support release/restore).
+// ---------------------------------------------------------------------------
+//    
+void CAlfSkinnableImage::DeleteTexture()
+    {
+    if (iSkinnedImageTextureId != 0)
+        {
+        CAlfTextureManager& manager = ImageTextureManager(iSkinnedImageTextureManagerId);        
+        const CAlfTexture* oldtexture = manager.Texture(iSkinnedImageTextureId);
+        if (oldtexture && oldtexture->Id() == iSkinnedImageTextureId)
+            {
+            delete oldtexture;    
+            iSkinnedImageTextureId = 0;
+            iSkinnedImageTextureManagerId = TUid::Uid(0);                               
+            }                                        
+        }                
+    }
+    
+// ---------------------------------------------------------------------------
+// Gets the texturemanager for the texture inside given image. Defaults
+// to default texture manager.
+// ---------------------------------------------------------------------------
+//    
+CAlfTextureManager& CAlfSkinnableImage::ImageTextureManager(const TAlfImage& aImage)
+    {
+    CAlfTextureManager* tm = aImage.PreferredTextureManager();
+    if (!tm)
+        {
+        tm = &iEnv->TextureManager();                    
+        }
+    return *tm;        
+    }
+    
+// ---------------------------------------------------------------------------
+// Gets the texturemanager based on texturemanager uid. Defaults
+// to default texture manager.
+// ---------------------------------------------------------------------------
+//    
+CAlfTextureManager& CAlfSkinnableImage::ImageTextureManager(TUid aManagerUid)
+    {
+    CAlfTextureManager* tm = &iEnv->TextureManager();
+    if (iSkinnedImageTextureManagerId != TUid::Uid(0))
+        {
+        tm = iEnv->SharedTextureManager(aManagerUid);
+        }
+    return *tm;             
+    }
+