uiacceltk/hitchcock/coretoolkit/src/huigifanimationtexture.cpp
changeset 0 15bf7259bb7c
child 3 d8a3531bc6b8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiacceltk/hitchcock/coretoolkit/src/huigifanimationtexture.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,262 @@
+/*
+* Copyright (c) 2006-2007 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:   ?Description
+*
+*/
+
+
+
+#include <uiacceltk/huigifanimationtexture.h>
+#include <uiacceltk/HuiStatic.h>
+#include <driveinfo.h>
+
+CHuiGifAnimationTexture::TAnimationState SetFlag(TInt aValue, TInt aFlag)
+    {
+    return CHuiGifAnimationTexture::TAnimationState(aValue|aFlag);
+    }
+
+CHuiGifAnimationTexture::TAnimationState ClearFlag(TInt aValue, TInt aFlag)
+    {      
+    return CHuiGifAnimationTexture::TAnimationState(aValue^aFlag);
+    }
+
+
+EXPORT_C CHuiGifAnimationTexture* CHuiGifAnimationTexture::NewL(const TDesC& aFilename, 
+                                                                CHuiTextureManager& aManager,
+                                                                TInt aID,
+                                                                THuiTextureUploadFlags aFlags)
+    {
+    CHuiGifAnimationTexture* self = new(ELeave) CHuiGifAnimationTexture(aManager,aFlags, aID);
+    CleanupStack::PushL(self);
+    self->ConstructL(aFilename);
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+EXPORT_C void CHuiGifAnimationTexture::Start()
+    {
+    iAnimationState = SetFlag(TInt(iAnimationState), TInt(ERunning));        
+    if (iAnimationState&EStopped)
+        {
+        iAnimationState=ClearFlag(TInt(iAnimationState), TInt(EStopped));
+        }
+    
+    if (iTexture)
+        {
+        iTexture->SetTextureChanged(ETrue);        
+        }
+    }
+
+EXPORT_C void CHuiGifAnimationTexture::Stop()
+    {
+    if (iAnimationState&ERunning)
+        {
+        iAnimationState=ClearFlag(TInt(iAnimationState), TInt(ERunning));
+        }
+    iAnimationState = SetFlag(TInt(iAnimationState), TInt(EStopped));
+    }
+    
+
+EXPORT_C void CHuiGifAnimationTexture::EnableAnimation(TBool aEnable)
+    { 
+    if (aEnable)
+    	{
+    	iAnimationState = SetFlag(TInt(iAnimationState), TInt(EEnabled));	
+    	}
+    else 
+    	{
+    	iAnimationState = ClearFlag(TInt(iAnimationState), TInt(EEnabled));
+    	}
+    }
+
+EXPORT_C TInt CHuiGifAnimationTexture::Id() 
+    {
+    return iId;
+    }
+    
+void CHuiGifAnimationTexture::AdvanceTime(TReal32 aElapsedTime) __SOFTFP
+    {
+    if (((iAnimationState & EInitializing) || (iFrameInterval == -1)) || (iAnimationState & EStopped)
+    	|| !(iAnimationState & EEnabled))
+        {
+        return;
+        }
+
+    iElapsedTime+=aElapsedTime;
+                                             
+    TReal32 time = (TReal(iFrameInterval))/1000000.0f;
+    if (iElapsedTime >= time)
+        {
+        const TInt loadingTextureId = iCurrentTexture ? iTextureId1 : iTextureId2;
+        if ( !iManager.IsLoaded( loadingTextureId ) )
+            {
+            return;
+            }
+
+        iCurrentTexture^=1;
+    
+        if (iCurrentTexture)
+            // use texture 2
+            {
+            iTexture = iTexture2;
+            TInt nextToLoad = iTexture2->iFrameNumber+1;
+            if (nextToLoad >= iFrameCount)
+                {
+                nextToLoad = 0;
+                }
+            
+            delete iTexture1;
+            iTexture1 = 0;   
+                       
+            TRAP_IGNORE(iTexture1 = &iManager.LoadTextureL(*iFilename,EHuiTextureUploadFlagDefault, iTextureId1, nextToLoad))
+            }
+        else
+            // use texture 1    
+            {
+            iTexture = iTexture1;
+            TInt nextToLoad = iTexture1->iFrameNumber+1;
+            if (nextToLoad >= iFrameCount)
+                {
+                nextToLoad = 0;
+                }
+            
+            delete iTexture2;
+            iTexture2 = 0;   
+ 
+            TRAP_IGNORE(iTexture2 = &iManager.LoadTextureL(*iFilename,EHuiTextureUploadFlagDefault, iTextureId2, nextToLoad))
+
+            }
+        iElapsedTime = 0.0f;
+        
+        } 
+    }
+    
+
+void CHuiGifAnimationTexture::TextureLoadingCompleted(CHuiTexture& aTexture,
+                             TInt aTextureId,
+                             TInt /*aErrorCode*/)
+    {
+    if ((iAnimationState & EInitializing) && aTexture.iFrameCount > 1 && aTextureId == iTextureId1)
+        {
+        iTexture = iTexture1;
+        TRAP_IGNORE(iTexture2 = &iManager.LoadTextureL(*iFilename,EHuiTextureUploadFlagDefault, iTextureId2, 1))
+        iFrameInterval = aTexture.iFrameInterval;
+        iFrameCount = aTexture.iFrameCount;
+        return;
+        }
+    if ((iAnimationState & EInitializing) && aTextureId == iTextureId2)
+        {
+        iAnimationState = SetFlag(TInt(iAnimationState),TInt(ERunning));
+        iAnimationState = ClearFlag(TInt(iAnimationState), TInt(EInitializing));
+        }
+    }
+
+
+CHuiGifAnimationTexture::CHuiGifAnimationTexture(CHuiTextureManager& aManager,THuiTextureUploadFlags aFlags,TInt aId) : 
+    CHuiAnimatedTexture(aManager),
+    iTexture2(NULL),
+    iCurrentTexture(0),
+    iAnimationState(EInitializing),
+    iFrameInterval(-1),
+    iFrameCount(0),
+    iFlags(aFlags),
+    iId(aId)
+    {
+    }
+
+void CHuiGifAnimationTexture::ConstructL(const TDesC& aFilename)
+    {
+    CHuiAnimatedTexture::BaseConstructL();
+    iTextureId1 = CHuiStatic::GenerateId();
+    iTextureId2 = CHuiStatic::GenerateId();
+    
+    // To load GIF animation, you should load textures in sequence - 
+    // previous state is needed. Thus, this group indicates that
+    // previous state can be shared between these textures.
+    RArray<TInt> groupIds;
+    CleanupClosePushL( groupIds );
+    groupIds.AppendL( iTextureId1 );
+    groupIds.AppendL( iTextureId2 );
+    iAnimatedTextureGroupId = iManager.AddAnimatedTextureGroupL( groupIds );
+    CleanupStack::PopAndDestroy( &groupIds );
+    
+	// Alf locks the file while drawing textures hence preventing any other operations on this file
+	// so copy file to RAM and use that instead.
+    TParse parse;
+    parse.Set(aFilename, NULL, NULL);
+    parse.NameAndExt();
+    
+    TChar drive;
+    User::LeaveIfError( DriveInfo::GetDefaultDrive(DriveInfo::EDefaultRam, drive ) );
+        
+    iFilename = HBufC::NewL(parse.NameAndExt().Size() + 4);
+    TPtr ptr = iFilename->Des();
+    
+    ptr.Append(drive);
+    ptr.Append(_L(":\\"));
+    ptr.Append(parse.NameAndExt());
+    
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    
+    CFileMan* fileman = CFileMan::NewL(fs);
+    CleanupStack::PushL(fileman);
+    TInt err = fileman->Copy(aFilename, iFilename->Des());
+    
+    CleanupStack::PopAndDestroy();
+    
+    if(err != KErrNone)
+	{
+	delete iFilename;    
+    iFilename = aFilename.AllocL();
+	}
+    
+    
+    iTexture1 = &iManager.LoadTextureL(
+        *iFilename,EHuiTextureUploadFlagDefault, iTextureId1, 0);     
+    iManager.iLoadObservers.AppendL(*this);
+    
+   	iAnimationState = SetFlag(TInt(iAnimationState), TInt(EEnabled));	
+    }
+
+EXPORT_C CHuiGifAnimationTexture::~CHuiGifAnimationTexture()
+    {
+    if ( iAnimatedTextureGroupId )
+        {
+        iManager.RemoveAnimatedTextureGroup( iAnimatedTextureGroupId );
+        }
+    iManager.iLoadObservers.RemoveIfFound(*this);
+
+    delete iTexture1;
+    delete iTexture2;
+
+    iTexture = 0;    
+    
+    RFs fs;
+    TInt err = fs.Connect();
+    if(err == KErrNone)    
+        {
+        CFileMan* fileman = 0;
+        TRAP(err, fileman = CFileMan::NewL(fs));
+        if(err == KErrNone)
+            {
+            fileman->Delete(iFilename->Des());
+            }
+        }
+    
+
+    delete iFilename;
+    }
+
+