diff -r 000000000000 -r 15bf7259bb7c uiacceltk/hitchcock/coretoolkit/src/huigifanimationtexture.cpp --- /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 +#include +#include + +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 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; + } + +