--- /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;
+ }
+