diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/Client/src/alfskinnableimage.cpp --- /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 +#include "alfskinnableimage.h" +#include "alf/alfimageloaderutil.h" +#include "alf/alftexturemanager.h" +#include "alf/alftexture.h" +#include "alf/alfenv.h" +#include "alfclient.h" + +#include + +// --------------------------------------------------------------------------- +// 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; + } +