williamr@2: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: /** williamr@2: @file williamr@2: @internalComponent williamr@2: */ williamr@2: williamr@2: #if !defined(__BMPANSRV_H__) williamr@2: #define __BMPANSRV_H__ williamr@2: williamr@2: #include williamr@2: #include williamr@4: #include "bmpanconsts.h" williamr@2: #include "bmpancli.h" williamr@2: #include williamr@2: williamr@2: williamr@2: williamr@2: enum TBitmapAnimServerPanic williamr@2: { williamr@2: EAnimationServerPanicIndexOutOfRange, williamr@2: EAnimationServerPanicFrameIntervalNegative williamr@2: }; williamr@2: williamr@2: // For packaging the new animation position offset williamr@2: struct SBitmapAnimNewPosition williamr@2: { williamr@2: TPoint iPosition; williamr@2: }; williamr@2: williamr@2: // For packaging the new animation index williamr@2: struct SBitmapAnimIndexFrame williamr@2: { williamr@2: TInt iIndex; williamr@2: }; williamr@2: williamr@2: // For packaging the number of cycles williamr@2: struct SBitmapAnimNumberOfCycles williamr@2: { williamr@2: TInt iCycles; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: TFrameData williamr@2: williamr@2: This class is used for packaging the data of one frame. williamr@2: */ williamr@2: class TFrameData williamr@2: { williamr@2: public: williamr@2: TInt iBitmapHandle; williamr@2: TInt iMaskBitmapHandle; williamr@2: TPoint iPosition; williamr@2: TInt iIntervalInMilliSeconds; // the time is expressed in ms williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: TBmpAnimAttributes williamr@2: williamr@2: This class is used for packaging the attriutes of the animation. williamr@2: */ williamr@2: class TBmpAnimAttributes williamr@2: { williamr@2: public: williamr@2: TBool iFlash; williamr@2: TInt iFrameIntervalInMilliSeconds; williamr@2: CBitmapAnimClientData::TPlayMode iPlayMode; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: class MBitmapAnimTimerObserver williamr@2: */ williamr@2: class MBitmapAnimTimerObserver williamr@2: { williamr@2: public: williamr@2: virtual void DisplayNextFrameL()=0; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: class CBitmapAnimTimer williamr@2: williamr@2: This class is used to determine when to swap the current frame with the next one. williamr@2: */ williamr@2: class CBitmapAnimTimer : public CTimer williamr@2: { williamr@2: public: williamr@2: ~CBitmapAnimTimer(); williamr@2: static CBitmapAnimTimer* NewL(MBitmapAnimTimerObserver* aObserver); williamr@2: void RunL(); williamr@2: private: williamr@2: CBitmapAnimTimer(MBitmapAnimTimerObserver* aObserver); williamr@2: void ConstructL(); williamr@2: private: williamr@2: MBitmapAnimTimerObserver* iAnimate; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: class MBitmapAnimFlashTimerObserver williamr@2: */ williamr@2: williamr@2: class MBitmapAnimFlashTimerObserver williamr@2: { williamr@2: public: williamr@2: virtual void FlashFrame(TBool aFlash)=0; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: class CBitmapAnimFlashTimer williamr@2: */ williamr@2: williamr@2: class CBitmapAnimFlashTimer : public CTimer williamr@2: { williamr@2: public: williamr@2: ~CBitmapAnimFlashTimer(); williamr@2: static CBitmapAnimFlashTimer* NewL(MBitmapAnimFlashTimerObserver* aObserver); williamr@2: void DoCancel(); williamr@2: void RunL(); williamr@2: private: williamr@2: CBitmapAnimFlashTimer(MBitmapAnimFlashTimerObserver* aObserver); williamr@2: void ConstructL(); williamr@2: private: williamr@2: MBitmapAnimFlashTimerObserver* iAnimate; williamr@2: TBool iFlash; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: class CBitmapAnimFrameData williamr@2: williamr@2: This class encapsulates the information of one frame. williamr@2: */ williamr@2: williamr@2: class CBitmapAnimFrameData : public CBase williamr@2: { williamr@2: public: williamr@2: static CBitmapAnimFrameData* NewL(); williamr@2: static CBitmapAnimFrameData* NewLC(); williamr@2: ~CBitmapAnimFrameData(); williamr@2: void FillFrameDataL(const TFrameData& aFrameDataArg); williamr@2: void CheckAndCreateBitmapsL(); williamr@2: williamr@2: private: williamr@2: CBitmapAnimFrameData(); williamr@2: void InitialiseMembers(); williamr@2: williamr@2: public: williamr@2: CFbsBitmap* iBitmap; williamr@2: CFbsBitmap* iMaskBitmap; williamr@2: TPoint iPosition; williamr@2: TTimeIntervalMicroSeconds32 iInterval; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: class CBitmapAnim williamr@2: williamr@2: This class encapsulates the enire animation: attributes and frames. williamr@2: */ williamr@2: williamr@2: class CBitmapAnim : public CFreeTimerWindowAnim, MBitmapAnimTimerObserver//, MBitmapAnimFlashTimerObserver williamr@2: { williamr@2: public: williamr@2: ~CBitmapAnim(); williamr@2: static CBitmapAnim* NewL(); williamr@2: private: williamr@2: CBitmapAnim(); williamr@2: private: williamr@2: enum TAnimateFlags williamr@2: { williamr@2: // State williamr@2: ERunning = 0x0001, williamr@2: EFlashing = 0x0002, williamr@2: EFrozen = 0x0004, williamr@2: // Play mode williamr@2: EPlayModeCycle = 0x0010, williamr@2: EPlayModeBounce = 0x0020, williamr@2: EPlayForwards = 0x0040, williamr@2: EPlayBackwards = 0x0080, williamr@2: // General williamr@2: EFlash = 0x0100, williamr@2: ENoBitmapWindowRestoring = 0x0800, williamr@2: EDisplayLastFrameWhenFinished = 0x4000, williamr@2: }; williamr@2: williamr@2: private: //Pure Virtual function from CAnim williamr@2: virtual void ConstructL(TAny *aArgs, TBool aHasFocus); williamr@2: virtual void Command(TInt aOpcode, TAny* aArgs); williamr@2: virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); williamr@2: virtual void Animate(TDateTime* aDateTime); williamr@2: virtual void Redraw(); williamr@2: virtual void FocusChanged(TBool aState); williamr@2: private: //Pure Virtual function from MEventHandler williamr@2: virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); williamr@2: private: //Pure Virtual function from MBitmapAnimTimerObserver williamr@2: virtual void DisplayNextFrameL(); williamr@2: private: //Pure Virtual function from MBitmapAnimFlashTimerObserver williamr@2: virtual void FlashFrame(TBool aFlash); williamr@2: private: williamr@2: void AppendFrameL(const TFrameData& aFrameData); williamr@2: inline TInt Count() const; williamr@2: void DisplayFrame(TInt aPreviousIndex=-1); williamr@2: void DrawBitmap(TInt aPreviousIndex=-1, TBool aRedraw=EFalse); williamr@2: inline TBool IsFrameDisplayable() const; williamr@2: inline TBool IsRunning() const; williamr@2: inline TBool IsFrozen() const; williamr@2: void ResetAnimation(); williamr@2: void ClearFrameNow(TInt aIndex); williamr@2: void RenderFrameBackground(TInt aIndex); williamr@2: TRect CalcFrameRect(TInt aIndex); williamr@2: void SetBackgroundFrameL(TFrameData aFrameDataArg); williamr@2: void SetFlash(TBmpAnimAttributes aFlash); williamr@2: void SetFrameInterval(TBmpAnimAttributes aFrameInterval); williamr@2: TInt SetIndexFrame(SBitmapAnimIndexFrame aIndexFrame); williamr@2: void SetNumberOfCycles(SBitmapAnimNumberOfCycles aNumberOfCycles); williamr@2: void SetPlayMode(TBmpAnimAttributes aPlayMode); williamr@2: void SetPosition(SBitmapAnimNewPosition aNewPosition); williamr@2: void StartAnimationL(); williamr@2: void StopAnimation(); williamr@2: void UpdateCurrentIndex(); williamr@2: inline TRect WindowRect() const; williamr@2: static TBool FrameNeedsRedrawing(const TRegion* aRedrawRegion, TRect aFrameScreenRect); williamr@2: void ResetFrameArray(); williamr@2: void ClearFrameData(); williamr@2: williamr@2: private: williamr@2: RPointerArray iBitmapAnimFrameDataArray; williamr@2: CBitmapAnimTimer* iAnimTimer; williamr@2: CBitmapAnimFlashTimer* iFlashTimer; williamr@2: CBitmapAnimFrameData* iBackgroundFrame; williamr@2: williamr@2: // williamr@2: TInt iDummy; williamr@2: TInt iFlags; williamr@2: TInt iIndex; williamr@2: TInt iNumberOfCycles; williamr@2: TPoint iPosition; williamr@2: TInt iWindowConfig; williamr@4: TTimeIntervalMicroSeconds32 iFrameInterval; williamr@2: }; williamr@2: williamr@2: // Returns the number of frames store in the frame array. williamr@2: inline TInt CBitmapAnim::Count() const williamr@2: { return iBitmapAnimFrameDataArray.Count(); } williamr@2: williamr@2: // Returns ETrue every time the index frame is valid, otherwise it returns EFalse. williamr@2: inline TBool CBitmapAnim::IsFrameDisplayable() const williamr@2: { return ( (iIndex >= 0) && iBitmapAnimFrameDataArray[iIndex]->iBitmap ); } williamr@2: williamr@2: // Returns ETrue if the animation is running, otherwise it returns EFalse. williamr@2: inline TBool CBitmapAnim::IsRunning() const williamr@2: { return iFlags&ERunning; } williamr@2: williamr@2: //Returns ETrue if the animation is frozen (app is not in the foreground) williamr@2: inline TBool CBitmapAnim::IsFrozen() const williamr@2: { return iFlags&EFrozen; } williamr@2: williamr@2: // Returns the available window rect. williamr@2: inline TRect CBitmapAnim::WindowRect() const williamr@2: { return TRect(TPoint(0, 0), iWindowFunctions->WindowSize()); } williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: CBitmapAnimDll class williamr@2: */ williamr@2: williamr@2: class CBitmapAnimDll : public CAnimDll williamr@2: { williamr@2: public: williamr@2: CBitmapAnimDll(); williamr@2: virtual CAnim* CreateInstanceL(TInt aType); williamr@2: }; williamr@2: williamr@2: williamr@2: /** williamr@2: global functions williamr@2: */ williamr@2: GLREF_C void Panic(TBitmapAnimServerPanic aReason); williamr@2: williamr@2: williamr@2: #endif williamr@4: