diff -r 000000000000 -r 05e9090e2422 skins/AknSkins/srvsrc/AknsSrvWallpaperCache.cpp --- /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 +#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