--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/skins/AknSkins/srvsrc/AknsSrvWallpaperCache.cpp Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2003-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: Wallpaper Cache
+*/
+
+// INCLUDE FILES
+#include <e32base.h>
+#include "AknsSrvWallpaperCache.h"
+#include "aknssrvwallpaperscaling.h"
+
+
+/**
+* Symbian constructor.
+*/
+CAknsSrvWallpaperCache* CAknsSrvWallpaperCache::NewL( TInt aCacheSize )
+ {
+ CAknsSrvWallpaperCache* self = new(ELeave) CAknsSrvWallpaperCache( );
+ CleanupStack::PushL( self );
+ self->ConstructL( aCacheSize );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+/**
+* Constructor.
+*/
+CAknsSrvWallpaperCache::CAknsSrvWallpaperCache( )
+ {
+ }
+
+/**
+* Symbian 2nd phase constructor.
+*/
+void CAknsSrvWallpaperCache::ConstructL( TInt aCacheSize )
+ {
+ iCacheSize = aCacheSize;
+ }
+
+/**
+* Destructor.
+*/
+CAknsSrvWallpaperCache::~CAknsSrvWallpaperCache( )
+ {
+ ResetAndDestory();
+ }
+
+/**
+* Add a image to wallpaper cache
+*/
+TAknsSrvWallpaper* CAknsSrvWallpaperCache::AddL( RFs& aRFs, const TDesC& aFileName,
+ const TSize aTrgSize, const TSize aMaxSize )
+ {
+ if ( aTrgSize == TSize(-1, -1) )
+ {
+ TryDecodeImageL( aRFs,aFileName );
+ return NULL;
+ }
+
+ TBool cached = EFalse;
+ TAknsSrvWallpaper* wp = NULL;
+
+ wp = CachedImage( aFileName );
+ if ( !wp )
+ {
+ wp = new TAknsSrvWallpaper;
+ ZeroItem ( *wp );
+ }
+ else
+ {
+ cached = ETrue;
+ }
+
+
+ _LIT( KSvgFileExt, ".svg" );
+ TBool isSvgFormat = aFileName.Right(4).CompareF( KSvgFileExt ) == 0;
+
+ TBool needDecodePortrait = EFalse;
+ TBool needDecodeLandscape = EFalse;
+
+ if( aTrgSize.iHeight >= aTrgSize.iWidth ) //Portait
+ {
+ if ( aTrgSize != iPrtSize || ( !wp->iPortrait && !wp->iPortraitMask) )
+ {
+ needDecodePortrait = ETrue;
+ iPrtSize = aTrgSize;
+ }
+ }
+ else //Landscape
+ {
+ if ( aTrgSize != iLscSize || ( !wp->iLandscape && !wp->iLandscapeMask ) )
+ {
+ needDecodeLandscape = ETrue;
+ iLscSize = aTrgSize;
+ }
+ }
+
+ if( isSvgFormat )
+ {
+ if( needDecodePortrait )
+ {
+ CAknsSrvSVGImageDecoder* svgdecoder = CAknsSrvSVGImageDecoder::NewL();
+ CleanupStack::PushL( svgdecoder );
+ svgdecoder->DecodeImageL(
+ aFileName,
+ aTrgSize,
+ wp->iPortrait,
+ wp->iPortraitMask );
+ CleanupStack::PopAndDestroy( svgdecoder );
+ }
+ if( needDecodeLandscape )
+ {
+ CAknsSrvSVGImageDecoder* svgdecoder = CAknsSrvSVGImageDecoder::NewL();
+ CleanupStack::PushL( svgdecoder );
+ svgdecoder->DecodeImageL(
+ aFileName,
+ aTrgSize,
+ wp->iLandscape,
+ wp->iLandscapeMask );
+ CleanupStack::PopAndDestroy( svgdecoder );
+ }
+ }
+ else
+ {
+ if( needDecodePortrait )
+ {
+ CAknsSrvImageConverter::DecodeImageL(
+ aRFs,
+ aFileName,
+ aTrgSize,
+ wp->iPortrait,
+ wp->iPortraitMask,
+ aMaxSize );
+ }
+ if( needDecodeLandscape )
+ {
+ CAknsSrvImageConverter::DecodeImageL(
+ aRFs,
+ aFileName,
+ aTrgSize,
+ wp->iLandscape,
+ wp->iLandscapeMask,
+ aMaxSize );
+ }
+ }
+ wp->iName.Copy( aFileName );
+ if ( !cached )
+ {
+ RemoveOldestItem();
+ iCache.Append( wp );
+ }
+ return wp;
+ }
+
+/**
+* Try Decode image
+*/
+void CAknsSrvWallpaperCache::TryDecodeImageL( RFs& aRFs,const TDesC& aFileName )
+ {
+ if ( CachedImage( aFileName ) )
+ {
+ return;
+ }
+ _LIT( KSvgFileExt, ".svg" );
+ TBool isSvgFormat = (aFileName.Right(4).CompareF( KSvgFileExt ) == 0);
+ if ( !isSvgFormat )
+ {
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+ CAknsSrvImageConverter::DecodeImageL(
+ aRFs,
+ aFileName,
+ TSize(-1,-1),
+ bitmap,
+ mask,
+ TSize(4000,4000) );
+ delete bitmap;
+ delete mask;
+ }
+ }
+
+/**
+* Remove a image from wallpaper cache
+*/
+void CAknsSrvWallpaperCache::Remove( const TDesC& aFileName )
+ {
+ for ( int i =0;i < iCache.Count();i++ )
+ {
+ if ( !iCache[i]->iName.Compare( aFileName ) )
+ {
+ DestoryItem( *iCache[i] );
+ iCache.Remove(i);
+ }
+ }
+ }
+
+/**
+* Reset wallpaper cache
+*/
+void CAknsSrvWallpaperCache::ResetAndDestory( )
+ {
+ for ( int i =0; i < iCache.Count(); i++ )
+ {
+ DestoryItem( *iCache[i] );
+ }
+ iCache.Reset();
+ }
+
+/**
+* Destory one TAknsSrvWallpaper item
+*/
+void CAknsSrvWallpaperCache::DestoryItem( TAknsSrvWallpaper& aItem )
+ {
+ delete aItem.iPortrait;
+ delete aItem.iPortraitMask;
+ delete aItem.iLandscape;
+ delete aItem.iLandscapeMask;
+
+ ZeroItem( aItem );
+ }
+
+/**
+* Reset one TAknsSrvWallpaper item
+*/
+void CAknsSrvWallpaperCache::ZeroItem( TAknsSrvWallpaper& aItem )
+ {
+ aItem.iPortrait = NULL;
+ aItem.iPortraitMask = NULL;
+ aItem.iLandscape = NULL;
+ aItem.iLandscapeMask = NULL;
+
+ aItem.iName.Zero();
+ }
+
+/**
+* Remove the oldest wallpaper from cache
+*/
+void CAknsSrvWallpaperCache::RemoveOldestItem()
+ {
+ if ( iCache.Count()>0 && iCache.Count() == iCacheSize )
+ {
+ DestoryItem( *iCache[0] );
+ iCache.Remove(0);
+ }
+ }
+
+/**
+* Check if a image is in wallpaper cache
+*/
+TBool CAknsSrvWallpaperCache::IsCached( const TDesC& aFileName )
+ {
+ if ( CachedImage( aFileName ) )
+ {
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+/**
+* Find in cache
+*/
+TAknsSrvWallpaper* CAknsSrvWallpaperCache::CachedImage( const TDesC& aFileName )
+ {
+ TAknsSrvWallpaper* ret = NULL;
+ for ( int i =0;i < iCache.Count();i++ )
+ {
+ if ( !iCache[i]->iName.Compare( aFileName ))
+ {
+ ret = iCache[i];
+ }
+ }
+ return ret;
+ }
+
+
+// End of File