skins/AknSkins/srvsrc/AknsSrvWallpaperCache.cpp
changeset 0 05e9090e2422
child 38 a10f447f38bd
--- /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