diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tauto/AUTODLL.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/tauto/AUTODLL.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,2858 @@ +// Copyright (c) 1996-2009 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: +// Auto test Animated DLL functions +// +// + +#include +#include +#include +#include +#include "AUTODLL.H" +#include "TAnimDraw.h" +#include "eventdd.h" +#include +#include + +union TAnimArgUnion + { + const TAny* any; + const TBool* Bool; + const TInt* Int; + const TPoint* Point; + const TSize* Size; + const TRect* Rect; + const TSpriteMemberInfo* SpriteMemberInfo; + const TShadowDrawTest* ShadowDrawTest; + const TDrawTestScreen* DrawTestScreen; + const TSyncTests* SyncTests; + const TTimeChangeTest* TimeChangeTest; + const TAnimRawEvent* AnimRawEvent; + const TWindowGroupInfoParms* WindowGroupInfoParms; + const TSetOrdinalParms* SetOrdinalParms; + const TFrameData* FrameData; + const TRawEvent* RawEvent; + }; + +class CPanicAnim : public CWindowAnim + { + enum TSyncState + { + ESyncStateNull, + ESyncStateStarting, + ESyncStateCounting, + ESyncLeave, + ESyncStateTimeChange1, + ESyncStateTimeChange2, + ESyncStateTimeChange3 + }; + enum {ESyncCount=8}; +public: + ~CPanicAnim(); + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Animate(TDateTime *aDateTime); + virtual void Redraw(); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + void StartSyncTest(MAnimGeneralFunctions::TAnimSync aSync); + void StartTimeChangeTest(); + void DoLeaveInActiveCallback(); + static TInt LeaveInActiveCallback(TAny *aThis); +private: + TRequestStatus *iStatusPtr; + TRequestStatus *iStatusPtr2; + TTime iTime; + TInt iSyncCount; + TSyncState iSyncState; + MAnimGeneralFunctions::TAnimSync iSyncMode; + TBool iLeaveInRedraw; + CIdle* iActivePanicIdle; + }; + +class CPanicAnim2 : public CWindowAnim +// +// Simply panics in the ConstructL() +// + { +public: + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Animate(TDateTime *aDateTime); + virtual void Redraw(); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); + }; + +class CAutoAnim3 : public CWindowAnim +// +// test drawing/redrawing +// + { +public: + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Animate(TDateTime *aDateTime); + virtual void Redraw(); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + virtual void FocusChanged(TBool aState); + void Draw(const TRect &aRect); + void DrawTestScreenL(const TDrawTestScreen* aParams); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + TRequestStatus *iStatusPtr; + CFbsFont *iFont; + TRect iRect; + TRect iBaseRect; + TInt iMode; + }; + +class CAutoAnimScrBack : public CWindowAnim +// +// test anim drawing behind a backed up window +// + { +public: + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Animate(TDateTime *aDateTime); + virtual void Redraw(); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + virtual void FocusChanged(TBool aState); + void Draw(); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + TRect iRect; + TInt iMode; + }; + +class CTestSpriteAnim : public CSpriteAnim + { +public: + virtual void ConstructL(TAny *aArgs); + virtual void Animate(TDateTime *aDateTime); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + TBool CheckMember(const TSpriteMemberInfo& aMemInfo); + void DrawMemberL(TInt aMember); + void DrawMemberL(); + }; + +/** +Used by CAnimTimer below +*/ +class MAnimTimerObserver + { +public: + virtual void DisplayNextFrameL()=0; + }; + +/** +This class is used by CTestFreeTimerAnim to determine when to swap the current frame with the next one. +*/ +class CAnimTimer : public CTimer + { +public: + ~CAnimTimer(); + static CAnimTimer* NewL(MAnimTimerObserver& aObserver); + void RunL(); +private: + CAnimTimer(MAnimTimerObserver& aObserver); + void ConstructL(); +private: + MAnimTimerObserver& iAnim; + }; + +class CTestFreeTimerAnim : public CFreeTimerWindowAnim, public MAnimTimerObserver + { +public: + //from CBase + ~CTestFreeTimerAnim(); + //from CAnim + void Animate(TDateTime *aDateTime); + void Command(TInt aOpcode, TAny *aArgs); + TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //from CWindowAnim + void ConstructL(TAny *aArgs, TBool aHasFocus); + void Redraw(); + void FocusChanged(TBool aState); + //from MEventHandler + TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + void DisplayNextFrameL(); +private: + CAnimTimer* iTimer; + TInt iFrameTime; + TRgb iColour; + TRect iRect; + }; + +class CEventTestAnimBase : public CWindowAnim + { + enum {EEventBufferSize=40}; +public: + virtual ~CEventTestAnimBase(); + //Pure virtual functions from CAnim + virtual void Animate(TDateTime *aDateTime); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //Pure virtual functions from CWindowAnim + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Redraw(); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +protected: + void Fail(); + TBool IsIgnorableEvent(const TRawEvent& aRawEvent) const; + TBool GetNextExpectedEvent(TAnimRawEvent& aRawEvent); + TBool CompareEvents(const TRawEvent& aExpectedEvent, const TRawEvent& aActualEvent) const; + TBool HandleRecursiveEvent(const TRawEvent& aRawEvent); + + TInt Error() const; + TInt EventCount() const; + void ResetEventCount(); + TInt TotalExpectedEvents() const; + TInt AddEvent(const TAnimRawEvent* event); +private: + virtual TInt AddExpectedEvent(const TAnimRawEvent* event)=0; +private: + CCirBuf iExpectedEvents; + TInt iError; + TInt iEventCount; + }; + +class CEventTestAnim : public CEventTestAnimBase + { +public: + ~CEventTestAnim(); + //Pure virtual functions from CWindowAnim overridden in CEventTestAnimBase + void ConstructL(TAny* aArgs,TBool aHasFocus); + //Pure virtual functions from CAnim overridden in CEventTestAnimBase + TInt CommandReplyL(TInt aOpcode,TAny* aArgs); + void Command(TInt aOpcode,TAny* aArgs); +private: + TInt UnloadDeviceDriver(); + //Pure virtual function from CEventTestAnimBase + TInt AddExpectedEvent(const TAnimRawEvent* event); +private: + TBool iDevDriverLoaded; + REventDD iLdd; + }; + +class CEventPostingAnim : public CEventTestAnimBase + { +public: + ~CEventPostingAnim(); + //Virtual functions from CEventTestAnimBase + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + //Virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + //Pure virtual function from CEventTestAnimBase + virtual TInt AddExpectedEvent(const TAnimRawEvent* event); + }; + +class CRemovableAnim : public CEventTestAnimBase + { +public: + ~CRemovableAnim(); + //Virtual functions from CEventTestAnimBase + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + //Pure virtual function from CEventTestAnimBase + virtual TInt AddExpectedEvent(const TAnimRawEvent* event); +private: + TInt iLifetime; + }; + +class CTimerTestAnim : public CWindowAnim + { +public: + ~CTimerTestAnim(); + //Pure virtual functions from CAnim + virtual void Animate(TDateTime *aDateTime); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //Pure virtual functions from CWindowAnim + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Redraw(); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + TInt iTimerCount; + TBool iExpectingTicks; + TBool iFail; + }; + +class CWinFunctionTestAnim : public CWindowAnim + { + //enum {EEventBufferSize=40}; +public: + ~CWinFunctionTestAnim(); + //Pure virtual functions from CAnim + virtual void Animate(TDateTime *aDateTime); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //Pure virtual functions from CWindowAnim + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Redraw(); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + MAnimGeneralFunctionsWindowExtension* iWinFunctions; + }; + +class CNotificationTestAnim : public CWindowAnim + { +public: + CNotificationTestAnim(); + ~CNotificationTestAnim(); + //Pure virtual functions from CAnim + virtual void HandleNotification(const TWsEvent& aEvent); + virtual void Animate(TDateTime *aDateTime); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //Pure virtual functions from CWindowAnim + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Redraw(); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + TFixedArray iDSA; + TBool iHeartbeatState; + TBool iScreenDeviceChanged; + TTime iLastAnimTime; + }; + +class CTransAnim : public CWindowAnim +// +// Test drawing/redrawing in Transparent window. +// + { +public: + //Implementaion for pure virtual functions from CAnim + void ConstructL(TAny* aArgs, TBool aHasFocus); + void Animate(TDateTime* aDateTime); + void Redraw(); + void Command(TInt aOpcode, TAny* aArgs); + TInt CommandReplyL(TInt aOpcode, TAny* aArgs); + void FocusChanged(TBool aState); + TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + CFbsFont* iFont; + TRect iRect; + TInt iMode; + TInt iDraw; + TRgb iColor; + TInt iCount; + }; + +class CTestHandlerAnim : public CWindowAnim + { + public: + ~CTestHandlerAnim(); + void ConstructL(TAny* aArgs, TBool aHasFocus); + void Redraw(); + void FocusChanged(TBool aState); + TInt CommandReplyL(TInt aOpcode, TAny* aArgs); + void Command(TInt aOpcode, TAny* aArgs); + void Animate(TDateTime* aDateTime); + TBool OfferRawEvent(const TRawEvent &aRawEvent); + private: + }; + +class CCoverageAnim : public CWindowAnim +/** + This class adds functional coverage to CWsAnimGc. + The actual work is handled by the 'Draw' method which calls + each method in turn. + Mostly copied from CAutoAnimScrBack and CAutoAnim3. + @SYMTestCaseID + @SYMPREQ 1841 Add Coverage tests. + @SYMTestCaseDesc Functional coverage. + @SYMTestActions Run functional coverage test on CWsAnimGc. + */ + { +public: + ~CCoverageAnim(); + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Animate(TDateTime *aDateTime); + virtual void Redraw(); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + virtual void FocusChanged(TBool aState); + void Draw(); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +private: + TRect iRect; /** rectangle used for all draw ops that require one */ + CFbsFont* iFont; + }; + +class CMultiPointerAnim : public CWindowAnim + { + enum {EEventBufferSize=40}; +public: + virtual ~CMultiPointerAnim(); + //Pure virtual functions from CAnim + virtual void Animate(TDateTime *aDateTime); + virtual void Command(TInt aOpcode, TAny *aArgs); + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs); + //Pure virtual functions from CWindowAnim + virtual void ConstructL(TAny *aArgs, TBool aHasFocus); + virtual void Redraw(); + virtual void FocusChanged(TBool aState); + //Pure virtual function from MEventHandler + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent); +protected: + TInt AddEvent(const TAnimRawEvent* aEvent); + TBool CompareEvents(const TRawEvent& aExpectedEvent, const TRawEvent& aActualEvent); +private: + CCirBuf iExpectedEvents; + TBuf<255> iErrorDes; + TInt iEventCount; + TInt iError; + }; + +class CTestAnimDll : public CAnimDll + { +public: + CAnim *CreateInstanceL(TInt aType); +private: + }; + +/*#if defined(__WINS__) +#pragma data_seg(".E32_UID") +__WINS_UID(0, KWservAnimDllUidValue, 0) +#pragma data_seg() +#endif*/ + +EXPORT_C CAnimDll *CreateCAnimDllL() + { + return(new(ELeave) CTestAnimDll()); + } + + +// Panic Tests // +void CPanicAnim::ConstructL(TAny *, TBool ) + { + iWindowFunctions->SetRect(TRect(0,0,1,1)); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + if (iFunctions->Sync()!=MAnimGeneralFunctions::ESyncSecond) + User::Leave(KErrGeneral); +// Check the anim time is not ahead of and not more than 2 secs behind the system time + TTime now; + now.UniversalTime(); + TDateTime dt=now.DateTime(); + TDateTime adt=iFunctions->SystemTime(); + if (adt.Day()!=dt.Day()) + User::Leave(KErrGeneral); + + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + if (iFunctions->Sync()!=MAnimGeneralFunctions::ESyncNone) + User::Leave(KErrGeneral); + } + +CPanicAnim::~CPanicAnim() + { + delete iActivePanicIdle; + } + +void CPanicAnim::Animate(TDateTime *aDateTime) + { + switch(iSyncState) + { + case ESyncStateNull: + break; + case ESyncStateStarting: + iTime=iFunctions->SystemTime(); + iSyncState=ESyncStateCounting; + iSyncCount=0; + break; + case ESyncStateCounting: + if (aDateTime) + { + TTimeIntervalSeconds interval; + TTime(*aDateTime).SecondsFrom(iTime, interval); + iSyncCount=interval.Int(); + } + else + iSyncCount++; + if (iSyncCount==ESyncCount) + { + TTimeIntervalMicroSeconds minInterval(0); + TTimeIntervalMicroSeconds maxInterval(0); + iSyncState=ESyncStateNull; + switch(iSyncMode) + { + case MAnimGeneralFunctions::ESyncSecond: + minInterval=iSyncCount*1000000-100000; + maxInterval=iSyncCount*1000000+100000; + break; + default:; + } + TTime time(iFunctions->SystemTime()); + TTimeIntervalMicroSeconds interval=time.MicroSecondsFrom(iTime); + TInt ret=KErrNone; + if (intervalmaxInterval) + ret=KErrGeneral; + iFunctions->Client().RequestComplete(iStatusPtr,ret); + } + break; + case ESyncLeave: + User::Leave(KErrGeneral); // Test: Not allowed to leave, will cause a panic + break; + case ESyncStateTimeChange1: + if (!aDateTime) + { + iFunctions->Client().RequestComplete(iStatusPtr,KErrNone); + iSyncState=ESyncStateTimeChange2; + } + break; + case ESyncStateTimeChange2: + if (!aDateTime) + { + iSyncState=ESyncStateTimeChange3; + break; + } + case ESyncStateTimeChange3: + iFunctions->Client().RequestComplete(iStatusPtr2,aDateTime ? KErrNone : KErrGeneral); + iSyncState=ESyncStateNull; + break; + } + } + +void CPanicAnim::Redraw() + { + if (iLeaveInRedraw) + User::Leave(KErrGeneral); //Test: Not allowed to leave, will cause a panic + } + +void CPanicAnim::Command(TInt aOpcode, TAny *) + { + switch(aOpcode) + { + case EADllPanicCallPanic: + iFunctions->Panic(); + break; + case EADllPanicSetInterval: + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + iFunctions->SetInterval(1); + break; + case EADllPanicSetNextInterval: + iFunctions->SetSync(MAnimGeneralFunctions::ESyncMinute); + iFunctions->SetNextInterval(1); + break; + case EADllPanicDoubleActivateGC: + iWindowFunctions->ActivateGc(); + iWindowFunctions->ActivateGc(); + break; + case EADllPanicDrawRectWithNoGc: + iGc->DrawRect(TRect(0,0,10,10)); + break; + case EADllPanicDrawTextWithNoFont: + iWindowFunctions->ActivateGc(); + iGc->DrawText(_L("Panic"),TPoint(20,20)); + break; + case EADllPanicLeaveInAnimate: + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + iSyncState=ESyncLeave; + break; + case EADllPanicLeaveInRedraw: + iLeaveInRedraw=ETrue; + iWindowFunctions->Invalidate(TRect(0,0,10,10)); + break; + case EADllPanicLeave: + //tests a leaving function in a non-leaving function and should not be moved to CommandReplyL as it leaves + User::Leave(KErrGeneral); //LeaveScan: intentional test + break; + case EADllPanicSetVisWithGcActive: + iWindowFunctions->ActivateGc(); + iWindowFunctions->SetVisible(EFalse); + iWindowFunctions->SetVisible(ETrue); + break; + case EADllPanicLeaveInActiveCallback: + iActivePanicIdle=CIdle::NewL(EPriorityHigh); + iActivePanicIdle->Start(TCallBack(CPanicAnim::LeaveInActiveCallback,this)); + break; + case EADllPanicSetClippingRectWithNoGc: + { + // currently this test fails because when deactivated iWin is also NULL and is deferenced in function + TRect rect(20,20,20,20); + iGc->SetClippingRect(rect); + } + break; + case EADllPanicCancelClippingRegionWithNoGc: + // currently this test fails because when deactivated iWin is NULL and function leaves + iGc->CancelClippingRegion(); + break; + case EADllPanicCancelClippingRectWithNoGc: + // currently this test fails because when deactivated iWin is also NULL and is deferenced in function + iGc->CancelClippingRect(); + break; + case EADllPanicSetDrawModeWithNoGc: + iGc->SetDrawMode(CGraphicsContext::EDrawModeAND); + break; + case EADllPanicUseFontWithNoGc: + { + // currently this test fails because does not check for NULL font + CFbsFont* font = NULL; + iGc->UseFont(font); + } + break; + case EADllPanicDiscardFontWithNoGc: + iGc->DiscardFont(); + break; + case EADllPanicSetUnderlineStyleWithNoGc: + iGc->SetUnderlineStyle(EUnderlineOff); + break; + case EADllPanicSetStrikeThoughStyleWithNoGc: + iGc->SetStrikethroughStyle(EStrikethroughOff); + break; + case EADllPanicSetWordJustificationWithNoGc: + iGc->SetWordJustification(0,0); + break; + case EADllPanicSetCharJustificationWithNoGc: + iGc->SetCharJustification(0,0); + break; + case EADllPanicSetPenColorWithNoGc: + { + TRgb rgbs; + iGc->SetPenColor(rgbs); + } + break; + case EADllPanicSetPenStyleWithNoGc: + iGc->SetPenStyle(CGraphicsContext::ESolidPen); + break; + case EADllPanicSetPenSizeWithNoGc: + { + const TSize size; + iGc->SetPenSize(size); + } + break; + case EADllPanicSetBrushColorWithNoGc: + { + TRgb rgbs; + iGc->SetBrushColor(rgbs); + } + break; + case EADllPanicSetBrushStyleWithNoGc: + iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + break; + case EADllPanicSetBrushOriginWithNoGc: + { + TPoint point; + iGc->SetBrushOrigin(point); + } + break; + case EADllPanicUseBrushPatterWithNoGc: + { + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + iGc->UseBrushPattern(bitmap); + CleanupStack::PopAndDestroy(bitmap); + } + break; + case EADllPanicDiscardBrushPatternWithNoGc: + iGc->DiscardBrushPattern(); + break; + case EADllPanicSetFadedWithNoGc: + iGc->SetFaded(EFalse); + break; + case EADllPanicSetFadingParametersWithNoGc: + iGc->SetFadingParameters(1,1); + break; + case EADllPanicDrawArcWithNoGc: + { + TRect rect; + iGc->DrawArc(rect, + TPoint(rect.Center().iX, rect.iTl.iY), + TPoint(rect.iBr.iX, rect.Center().iY)); + } + break; + case EADllPanicDrawPieWithNoGc: + { + TRect rect; + iGc->DrawPie(rect, TPoint(rect.Center().iX, rect.iTl.iY), TPoint(rect.iBr.iX, rect.Center().iY)); + } + break; + case EADllPanicDrawLineWithNoGc: + { + const TPoint point1; + const TPoint point2; + iGc->DrawLine(point1, point2); + } + break; + case EADllPanicDrawLineToWithNoGc: + { + const TPoint point; + iGc->DrawLineTo(point); + } + break; + case EADllPanicDrawLineByWithNoGc: + { + const TPoint point; + iGc->DrawLineBy(point); + } + break; + case EADllPanicDrawEllipseWithNoGc: + { + TRect rect(20,20,20,20); + iGc->DrawEllipse(rect); + } + break; + case EADllPanicDrawRoundedRecWithNoGc: + { + TRect rect; + iGc->DrawRoundRect(rect, TSize(rect.Width()/8, rect.Height()/8)); + } + break; + case EADllPanicClearWithRectWithNoGc: + { + TRect rect(20,20,20,20); + iGc->Clear(rect); + } + break; + case EADllPanicClearWithNoGc: + iGc->Clear(); + break; + case EADllPanicBitBltWithNoGc: + { + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + iGc->BitBlt(TPoint(0, 0), bitmap); + CleanupStack::PopAndDestroy(bitmap); + } + break; + case EADllPanicBitBltWithRectWithNoGc: + { + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + TRect rect; + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + iGc->BitBlt(TPoint(0, 0), bitmap, rect); + CleanupStack::PopAndDestroy(bitmap); + } + break; + case EADllPanicBitBltMaskedWithNoGc: + { + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + TRect rect; + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + iGc->BitBltMasked(TPoint(0, 0), bitmap, rect, bitmap, EFalse); + CleanupStack::PopAndDestroy(bitmap); + } + break; + case EADllPanicDrawBitmapMaskedFbsBitmapWithNoGc: + { + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + TRect rect; + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + iGc->DrawBitmapMasked(rect, bitmap, rect, bitmap, ETrue); + CleanupStack::PopAndDestroy(bitmap); + } + break; + case EADllPanicDrawBitmapMaskedWsBitmapWithNoGc: + { + CWsBitmap* bitmap = NULL; + TRect rect; + iGc->DrawBitmapMasked(rect, bitmap, rect, bitmap, ETrue); + } + break; + case EADllPanicDrawBitmapPointWithNoGc: + { + CWsBitmap* bitmap = NULL; + TRect rect; + iGc->DrawBitmap(rect.iTl, bitmap); + } + break; + case EADllPanicDrawBitmapWithNoGc: + { + CWsBitmap* bitmap = NULL; + TRect rect; + iGc->DrawBitmap(rect, bitmap); + } + break; + case EADllPanicDrawBitmapRectWithNoGc: + { + CWsBitmap* bitmap = NULL; + TRect rect; + iGc->DrawBitmap(rect, bitmap, TRect(0, 0, 16, 16)); + } + break; + case EADllPanicDrawPolyLinePointsWithNoGc: + { + TRect rect; + CArrayFixFlat* polyPoints = new(ELeave) CArrayFixFlat(3); //CArrayFixFlat + CleanupStack::PushL(polyPoints); + polyPoints->AppendL(rect.iTl); + polyPoints->AppendL(rect.Center()); + polyPoints->AppendL(TPoint(rect.iBr.iX, rect.iTl.iY)); + iGc->DrawPolyLine(&polyPoints->At(0), 3); + CleanupStack::PopAndDestroy(polyPoints); + } + break; + case EADllPanicDrawPolyLineArrayWithNoGc: + { + TRect rect; + CArrayFixFlat* polyPoints = new(ELeave) CArrayFixFlat(3); //CArrayFixFlat + CleanupStack::PushL(polyPoints); + polyPoints->AppendL(rect.iTl); + polyPoints->AppendL(rect.Center()); + polyPoints->AppendL(TPoint(rect.iBr.iX, rect.iTl.iY)); + iGc->DrawPolyLine(polyPoints); + CleanupStack::PopAndDestroy(polyPoints); + } + break; + case EADllPanicMoveToWithNoGc: + { + TPoint point; + iGc->MoveTo(point); + } + break; + case EADllPanicMoveByWithNoGc: + { + TPoint point; + iGc->MoveBy(point); + } + break; + case EADllPanicPlotWithNoGc: + { + TPoint point; + iGc->Plot(point); + } + break; + case EADllPanicSetOriginWithNoGc: + { + TPoint point; + iGc->SetOrigin(point); + } + break; + case EADllPanicCopyRectWithNoGc: + { + TPoint point; + TRect rect; + iGc->CopyRect(point, rect); + } + break; + case EADllPanicResetWithNoGc: + iGc->Reset(); + break; + case EADllPanicMapColorsWithNoGc: + { + TRgb rgbs[2]; + TRect rect; + iGc->MapColors(rect, rgbs, 1, ETrue); + } + break; + case EADllPanicDrawTextWithRectWithNoFont: + iWindowFunctions->ActivateGc(); + iGc->DrawText(_L("Panic"),TRect(20,20,20,20),0); + break; + case EADllPanicDrawTextVerticalWithNoFont: + iWindowFunctions->ActivateGc(); + iGc->DrawTextVertical(_L("Panic"),TPoint(20,20), EFalse); + break; + case EADllPanicDrawTextVerticalWithRectWithNoFont: + iWindowFunctions->ActivateGc(); + iGc->DrawTextVertical(_L("Panic"),TRect(20,20,20,20), 0, EFalse); + break; + case EADllPanicInvalidFocusScreenTooBig: + (static_cast(iFunctions->ExtendedInterface(MAnimGeneralFunctions::EWindowExtensionInterface)))->SetFocusScreen(3000); + break; + case EADllPanicInvalidFocusScreenNegative: + (static_cast(iFunctions->ExtendedInterface(MAnimGeneralFunctions::EWindowExtensionInterface)))->SetFocusScreen(-1); + break; + default: + iFunctions->Panic(); + } + } + +void CPanicAnim::DoLeaveInActiveCallback() + { + iWindowFunctions->ActivateGc(); + User::Leave(KErrUnknown); + } + +TInt CPanicAnim::LeaveInActiveCallback(TAny *aThis) + { + CPanicAnim* panicAnim=(CPanicAnim*)aThis; + panicAnim->DoLeaveInActiveCallback(); + return(KErrNone); + } + +void CPanicAnim::StartSyncTest(MAnimGeneralFunctions::TAnimSync aSync) + { + iFunctions->SetSync(aSync); + iSyncMode=aSync; + iSyncState=ESyncStateStarting; + } + +void CPanicAnim::StartTimeChangeTest() + { + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + iSyncMode=MAnimGeneralFunctions::ESyncSecond; + iSyncState=ESyncStateTimeChange1; + } + +TInt CPanicAnim::CommandReplyL(TInt aOpcode,TAny* aParams) + { + TAnimArgUnion pData; + pData.any=aParams; + switch(aOpcode) + { + case EADllPanicBadFont: + iFunctions->DuplicateFontL(123); + break; + case EADllPanicBadBitmap: + iFunctions->DuplicateBitmapL(123); + break; + case EADllPanicCallPanic: + iFunctions->Panic(); + break; + case EADllReadRemoteDescriptor: + { + TInt ret=0; + const RMessagePtr2& message=*iFunctions->Message(); + TInt bufLength = message.GetDesLength(KIpcSlot); + TUint16* heapCell=static_cast(User::AllocL(bufLength*2)); + TPtr buf(heapCell,bufLength*2,bufLength*2); + const TInt theError=message.Read(KIpcSlot,buf); + if(theError == KErrNone) + { + for (TInt index=0;indexWindowSize()); + case EADllSyncTests: + iStatusPtr=pData.SyncTests->status; + StartSyncTest(pData.SyncTests->syncMode); + break; + case EADllTimeChangedTest: + iStatusPtr=pData.TimeChangeTest->status; + iStatusPtr2=pData.TimeChangeTest->status2; + StartTimeChangeTest(); + break; + case EADllTestSetVisible: + if (iWindowFunctions->IsHidden()) + goto setVisFailed; + iWindowFunctions->SetVisible(EFalse); + if (!iWindowFunctions->IsHidden()) + goto setVisFailed; + iWindowFunctions->SetVisible(ETrue); + if (iWindowFunctions->IsHidden()) +setVisFailed: return(EFalse); + return(ETrue); + case EADllPanicSetVisWithGcActiveReply: + iWindowFunctions->ActivateGc(); + iWindowFunctions->SetVisible(EFalse); + iWindowFunctions->SetVisible(ETrue); + break; + case EADllPanicSetClippingRegionWithNoGc: + { + // currently this test fails because when deactivated iWin is also NULL and is deferenced in function + RRegion region; + TBool err = iGc->SetClippingRegion(region); + } + break; + case EADllPanicDrawPolygonPointsWithNoGc: + { + TRect rect(20,20,20,20); + CArrayFixFlat* polyPoints = new(ELeave) CArrayFixFlat(3); //CArrayFixFlat + CleanupStack::PushL(polyPoints); + polyPoints->AppendL(rect.iTl); + polyPoints->AppendL(rect.Center()); + polyPoints->AppendL(TPoint(rect.iBr.iX, rect.iTl.iY)); + iGc->DrawPolygon(polyPoints, CGraphicsContext::EWinding); + CleanupStack::PopAndDestroy(polyPoints); + } + break; + case EADllPanicDrawPolygonArrayWithNoGc: + { + TRect rect(20,20,20,20); + CArrayFixFlat* polyPoints = new(ELeave) CArrayFixFlat(3); //CArrayFixFlat + CleanupStack::PushL(polyPoints); + polyPoints->AppendL(rect.iTl); + polyPoints->AppendL(rect.Center()); + polyPoints->AppendL(TPoint(rect.iBr.iX, rect.iTl.iY)); + iGc->DrawPolygon(&polyPoints->At(0), 3, CGraphicsContext::EAlternate); + CleanupStack::PopAndDestroy(polyPoints); + } + break; + case EADllPanicAlphaBlendingBitmapsFbsBitmapWithNoGc: + { + TRect rect(20,20,20,20); + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + iGc->AlphaBlendBitmaps(TPoint(0, 0), bitmap, rect, bitmap, TPoint(0,0)); + CleanupStack::PopAndDestroy(bitmap); + } + break; + case EADllPanicDevice: + { + CGraphicsDevice *device = iGc->Device(); + } + break; + default: + iFunctions->Panic(); + } + return(KErrNone); + } + +void CPanicAnim::FocusChanged(TBool ) + { + } + +TBool CPanicAnim::OfferRawEvent(const TRawEvent &/*aRawEvent*/) + { + return EFalse; + } + + +// CPanicAnim2 simply panics in the construct // +void CPanicAnim2::ConstructL(TAny *, TBool ) + { + iFunctions->Panic(); + } + +void CPanicAnim2::Animate(TDateTime *) + {} + +void CPanicAnim2::Redraw() + {} + +void CPanicAnim2::Command(TInt , TAny *) + {} + +TInt CPanicAnim2::CommandReplyL(TInt , TAny *) + {return(0);} + +void CPanicAnim2::FocusChanged(TBool ) + {} + +TBool CPanicAnim2::OfferRawEvent(const TRawEvent &/*aRawEvent*/) + { + return EFalse; + } + + +// CAutoAnim3 test drawing/redrawing // +void CAutoAnim3::ConstructL(TAny *aParam, TBool ) + { + iRect=*((TRect *)aParam); + iWindowFunctions->SetRect(iRect); + iMode=0; + iWindowFunctions->Invalidate(iRect); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + } + +void CAutoAnim3::Animate(TDateTime *) + { + iWindowFunctions->ActivateGc(); + if (iMode==1) + { + Draw(iRect); + if (iRect.Width()>20 && iRect.Height()>20) + iRect.Shrink(TSize(20,20)); + else + iRect=iBaseRect; + Draw(iRect); + } + else if (iMode==2) + { + Draw(iRect); + iFunctions->Client().RequestComplete(iStatusPtr,KErrNone); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + } + else if (iMode==3) + { + // flip between two sizes + if (iRect.iTl.iX == 10) + iRect.SetRect(40,40,80,80); + else + iRect.SetRect(10,10,110,110); + Draw(iRect); + } + } + +void CAutoAnim3::Draw(const TRect &aRect) + { + switch(iMode) + { + case 0: + iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR); + iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + iGc->SetBrushColor(TRgb::Gray256(85)); + iGc->SetPenColor(TRgb::Gray256(170)); + iGc->DrawEllipse(aRect); + iGc->SetBrushStyle(CGraphicsContext::ENullBrush); + break; + case 1: // Shrinking box + iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR); + iGc->SetPenColor(TRgb::Gray256(255)); + iGc->DrawRect(aRect); + break; + case 2: + case 3: + iGc->SetDrawMode(CGraphicsContext::EDrawModePEN); + iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + iGc->SetBrushColor(TRgb::Gray256(85)); + iGc->SetPenColor(TRgb::Gray256(170)); + iGc->DrawEllipse(aRect); + iGc->SetBrushStyle(CGraphicsContext::ENullBrush); + break; + default: + break; + } + } + +void CAutoAnim3::Redraw() + { + Draw(iRect); + } + +void CAutoAnim3::Command(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch(aOpcode) + { + case EADllSetRect: + iWindowFunctions->ActivateGc(); + Draw(iRect); + iRect=*pData.Rect; + iWindowFunctions->SetRect(iRect); + Draw(iRect); + { //Do more extensive testing + TWindowInfo data; + iWindowFunctions->Parameters(data); + } + break; + case EADllStartAnimate: + iWindowFunctions->ActivateGc(); + Draw(iRect); + iMode=1; + iBaseRect=*pData.Rect; + iRect=iBaseRect; + iWindowFunctions->SetRect(iRect); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + Draw(iRect); + break; + case EADllCancelAnimate: + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + iWindowFunctions->ActivateGc(); + Draw(iRect); + iMode=-1; + break; + case EADllSetVisible: + iWindowFunctions->SetVisible(*pData.Bool); + break; + case EADllSetShadowDrawMode: + iMode=2; + break; + case EADllDrawTestScreen: + DrawTestScreenL(pData.DrawTestScreen); //Should move to CommandReplyL as it leaves + break; + case EADllSetMode: + iMode = *pData.Int; + break; + } + } + +TInt CAutoAnim3::CommandReplyL(TInt aOpcode, TAny *aParam) + { + TAnimArgUnion pData; + pData.any = aParam; + TInt ret=0; + switch(aOpcode) + { + case EADllShadowAnimTest: + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + iStatusPtr=((TShadowDrawTest *)aParam)->status; + break; + case EADllParameterRectValueTest: + { + TWindowInfo wininf; + iWindowFunctions->Parameters(wininf); + TRect comp = *(pData.Rect); + ret=(comp==wininf.iScreenPos); + } + break; + case EADllDoSetSync: + iFunctions->SetSync(static_cast(*pData.Int)); + break; + case EADllSetInterval: + iFunctions->SetInterval(*pData.Int); + break; + } + return(ret); + } + +void CAutoAnim3::FocusChanged(TBool ) + {} + +//void CAutoAnim3::DrawTestScreen(TDrawTestScreen *aParams) +//Function now at bottom of file + +TBool CAutoAnim3::OfferRawEvent(const TRawEvent &/*aRawEvent*/) + { + return EFalse; + } + + +// CAutoAnimScrBack test drawing/redrawing // +void CAutoAnimScrBack::ConstructL(TAny *aParam, TBool ) + { + iRect=*((TRect *)aParam); + iWindowFunctions->SetRect(iRect); + iMode=1; + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + } + +void CAutoAnimScrBack::Animate(TDateTime *) + { + iWindowFunctions->ActivateGc(); + Draw(); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + } + +void CAutoAnimScrBack::Draw() + { + iGc->SetDrawMode(CGraphicsContext::EDrawModePEN); + if (iMode==2) + iGc->SetPenSize(TSize(3,3)); + iGc->SetPenColor(TRgb::Gray4(iMode==1 ? 2 : 3)); + iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + iGc->SetBrushColor(TRgb::Gray4(iMode==1 ? 1 : 0)); + iGc->DrawRect(iRect); + } + +void CAutoAnimScrBack::Redraw() + { + Draw(); + } + +void CAutoAnimScrBack::Command(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch(aOpcode) + { + case EADllDrawOtherRect: + { + TRect oldRect(iRect); + if (iMode==2) + oldRect.Grow(1,1); // To allow for 3x3 pen size + iMode=2; + iRect=*pData.Rect; + TRect fullRect(iRect); + fullRect.Grow(1,1); // To allow for 3x3 pen size + iWindowFunctions->Invalidate(oldRect); + iWindowFunctions->SetRect(fullRect); + iWindowFunctions->Invalidate(fullRect); + } +// iFunctions->ActivateGc(); +// Draw(); + break; + } + } + +TInt CAutoAnimScrBack::CommandReplyL(TInt aOpcode, TAny *) + { + switch(aOpcode) + { + case EADllIsHidden: + return iWindowFunctions->IsHidden(); + } + return(0); + } + +void CAutoAnimScrBack::FocusChanged(TBool ) + {} + +TBool CAutoAnimScrBack::OfferRawEvent(const TRawEvent &/*aRawEvent*/) + { + return EFalse; + } + + +// CTestSpriteAnim test sprite access // +void CTestSpriteAnim::ConstructL(TAny* /*aParam*/) + { + iSpriteFunctions->SizeChangedL(); + iSpriteFunctions->Activate(ETrue); + } + +void CTestSpriteAnim::Animate(TDateTime*) + { + } + +void CTestSpriteAnim::Command(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch (aOpcode) + { + case EADllSizeChanged: + iSpriteFunctions->Activate(EFalse); + iSpriteFunctions->SizeChangedL(); //Should move to CommandReplyL as it leaves + case EADllActivate: + iSpriteFunctions->Activate(ETrue); + break; + case EADllDeactivate: + iSpriteFunctions->Activate(EFalse); + break; + case EADllSetPos: + iSpriteFunctions->SetPosition(*pData.Point); + break; + case EADllDraw1: + case EADllDraw2: + case EADllDraw3: + DrawMemberL(aOpcode-EADllDraw1); //Should move to CommandReplyL as it leaves + break; + case EADllIncDraw: + DrawMemberL(); //Should move to CommandReplyL as it leaves + break; + default:; + } + } + +TInt CTestSpriteAnim::CommandReplyL(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch (aOpcode) + { + case EADllCheckMember: + return CheckMember(*pData.SpriteMemberInfo); + default:; + } + return(KErrNone); + } + +TBool CTestSpriteAnim::OfferRawEvent(const TRawEvent& /*aRawEvent*/) + { + return EFalse; + } + +TBool CTestSpriteAnim::CheckMember(const TSpriteMemberInfo& aMemInfo) + { + TSpriteMember spriteMember=*iSpriteFunctions->GetSpriteMember(aMemInfo.iMember); + if (spriteMember.iBitmap->Handle()!=aMemInfo.iBitmapHandle) + return EFalse; + if (aMemInfo.iMaskBitmapHandle==0) + { + if (spriteMember.iMaskBitmap!=NULL) + return EFalse; + } + else + { + if (spriteMember.iMaskBitmap->Handle()!=aMemInfo.iMaskBitmapHandle) + return EFalse; + } + if (spriteMember.iInvertMask!=aMemInfo.iInvertMask) + return EFalse; + if (spriteMember.iDrawMode!=aMemInfo.iDrawMode) + return EFalse; + if (spriteMember.iOffset!=aMemInfo.iOffset) + return EFalse; + if (spriteMember.iInterval!=aMemInfo.iInterval) + return EFalse; + return ETrue; + } + +void CTestSpriteAnim::DrawMemberL(TInt aMember) + { + CFbsBitmap *bitmap=iSpriteFunctions->GetSpriteMember(aMember)->iBitmap; + CFbsBitmapDevice *device=CFbsBitmapDevice::NewL(bitmap); + CleanupStack::PushL(device); + CFbsBitGc *gc; + User::LeaveIfError(device->CreateContext(gc)); + CleanupStack::PushL(gc); + //gc->SetBrushColor(TRgb::Gray4((aMember+1)%3)); + gc->SetBrushStyle(CGraphicsContext::ESolidBrush); + gc->SetPenSize(TSize()); + TSize size=bitmap->SizeInPixels(); + size.SetSize(size.iWidth/2,size.iHeight/2); + TPoint point=size.AsPoint(); + gc->SetBrushColor(TRgb::Gray4(0)); + //TRect rect=bitmap->SizeInPixels(); + gc->DrawRect(TRect(TPoint(),size)); + gc->SetBrushColor(TRgb::Gray4(1)); + gc->DrawRect(TRect(TPoint(point.iX,0),size)); + gc->SetBrushColor(TRgb::Gray4(2)); + gc->DrawRect(TRect(TPoint(0,point.iY),size)); + gc->SetBrushColor(TRgb::Gray4(3)); + gc->DrawRect(TRect(point,size)); + iSpriteFunctions->UpdateMember(aMember,TRect(bitmap->SizeInPixels()),ETrue); + CleanupStack::PopAndDestroy(2); + } + +void CTestSpriteAnim::DrawMemberL() + { + CFbsBitmap *bitmap=iSpriteFunctions->GetSpriteMember(0)->iBitmap; + CFbsBitmapDevice *device=CFbsBitmapDevice::NewL(bitmap); + CleanupStack::PushL(device); + CFbsBitGc *gc; + User::LeaveIfError(device->CreateContext(gc)); + CleanupStack::PushL(gc); + gc->SetPenSize(TSize(3,3)); + gc->SetPenColor(TRgb::Gray4(1)); + TPoint corner=bitmap->SizeInPixels().AsPoint(); + gc->DrawLine(TPoint(),corner); + gc->DrawLine(TPoint(0,corner.iY),TPoint(corner.iX,0)); + iSpriteFunctions->UpdateMember(0,TRect(bitmap->SizeInPixels()),EFalse); + CleanupStack::PopAndDestroy(2); + } + + +// CTestFreeTimerAnim test drawing off own timer // +CTestFreeTimerAnim::~CTestFreeTimerAnim() + { + iTimer->Cancel(); + delete iTimer; + } + +void CTestFreeTimerAnim::ConstructL(TAny* /*aParam*/, TBool ) + { + User::LeaveIfNull(iFunctions); + User::LeaveIfNull(iWindowFunctions); + + //Configure free-timer anim (these values should be the default ones) + iFunctions->SetSync( MAnimGeneralFunctions::ESyncNone ); + iFunctions->SetInterval(0); + + iFrameTime = 100000; //default frametime 0.1s + iTimer = CAnimTimer::NewL(*this); + iRect = iWindowFunctions->WindowSize(); + } + +#define MAX(a,b) (((a)>(b))?(a):(b)) + +void CTestFreeTimerAnim::Animate(TDateTime*) + { + TInt max = MAX(iRect.Width(), iRect.Height()); + if(max <= 0) + { + iRect = iWindowFunctions->WindowSize(); + } + else + { + iRect.Shrink(1,1); + } + + //change colour + switch(iColour.Value()) + { + case 0x000000: //black + case 0xffffff: //white + iColour = KRgbRed; + break; + case 0x0000ff: //red + iColour = KRgbGreen; + break; + case 0x00ff00: //green + iColour = KRgbBlue; + break; + case 0xff0000: //blue + iColour = KRgbBlack; + break; + } + } + +void CTestFreeTimerAnim::Redraw() + { + //draw something in the animated colour + iGc->SetBrushColor(iColour); + iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + iGc->SetPenColor(KRgbBlack); + iGc->DrawRect(iRect); + } + +void CTestFreeTimerAnim::Command(TInt aOpcode, TAny* aArgs) + { + switch(aOpcode) + { + case EStartAnimation: + DisplayNextFrameL(); + break; + case EStopAnimation: + iTimer->Cancel(); + break; + case ESetFrameTime: + ASSERT(aArgs); + iFrameTime = *reinterpret_cast(aArgs); + break; + default: + ASSERT(0); + } + } + +TInt CTestFreeTimerAnim::CommandReplyL(TInt aOpcode, TAny* aArgs) + { + switch(aOpcode) + { + case EStartAnimation: + DisplayNextFrameL(); + break; + case EStopAnimation: + iTimer->Cancel(); + break; + case ESetFrameTime: + ASSERT(aArgs); + iFrameTime = *reinterpret_cast(aArgs); + break; + default: + ASSERT(0); + } + return(KErrNone); + } + +void CTestFreeTimerAnim::FocusChanged(TBool /*aState*/) + { + } + +TBool CTestFreeTimerAnim::OfferRawEvent(const TRawEvent& /*aRawEvent*/) + { + return EFalse; + } + + +void CTestFreeTimerAnim::DisplayNextFrameL() + { + //Reschedule timer callback + iTimer->Cancel(); + iTimer->After(iFrameTime); + + Animate(NULL); //wserv don't animate free-timer animations + + //Schedule wserv redraw + MAnimFreeTimerWindowFunctions* windowFunctions = WindowFunctions(); + ASSERT(windowFunctions); + windowFunctions->ActivateGc(); + windowFunctions->DeactivateGc(); + windowFunctions->Update(); + } + +// +// CAnimTimer class +// + +/** + Constructs a new bitmap animation timer object,and adds the specified active object to the current active scheduler. + +@param aObserver a pointer to MAnimTimerObserver +*/ +CAnimTimer::CAnimTimer(MAnimTimerObserver& aObserver) + :CTimer(EPriorityStandard), + iAnim(aObserver) + { + CActiveScheduler::Add(this); + } + +/** + Frees resources owned by the object prior to deletion. +*/ +CAnimTimer::~CAnimTimer() + { + } + +/** + Creates a new bitmap animation timer object. + +@param aObserver A pointer to the MAnimTimerObserver +@return A pointer to the new bitmap animation timer object. +*/ +CAnimTimer* CAnimTimer::NewL(MAnimTimerObserver& aObserver) + { + CAnimTimer* timer=new(ELeave) CAnimTimer(aObserver); + CleanupStack::PushL(timer); + timer->ConstructL(); + CleanupStack::Pop(); + return timer; + } + +/** + Completes construction of the bitmap animation timer object and + constructs a new asynchronous timer. +*/ +void CAnimTimer::ConstructL() + { + CTimer::ConstructL(); + } + +/** + Handles an active object's request completion event. + Invokes the function to draw the next frame +*/ +void CAnimTimer::RunL() + { + iAnim.DisplayNextFrameL(); + } + +// CEventTestAnimBase base class for event test anims // +CEventTestAnimBase::~CEventTestAnimBase() + { + iFunctions->GetRawEvents(EFalse); + } + +void CEventTestAnimBase::ConstructL(TAny* /*aParam*/, TBool ) + { + iExpectedEvents.SetLengthL(EEventBufferSize); + } + +void CEventTestAnimBase::Animate(TDateTime*) + { + } + +void CEventTestAnimBase::Redraw() + { + } + +void CEventTestAnimBase::Command(TInt /*aOpcode*/, TAny* /*aParam*/) + { + /*switch (aOpcode) + { + default:; + }*/ + } + +void CEventTestAnimBase::FocusChanged(TBool /*aState*/) + { + } + +// Base class common client server interface +TInt CEventTestAnimBase::CommandReplyL(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch (aOpcode) + { + case EADllAddExpectedEvent: + return AddExpectedEvent(pData.AnimRawEvent); + case EADllNumberOfEventsReceived: + return iEventCount; + case EADllErrorCode: + return iError; + case EADllReset: + iExpectedEvents.Reset(); + iError = 0; + iEventCount = 0; + return KErrNone; + default:; + } + return(KErrNone); + } + +TBool CEventTestAnimBase::HandleRecursiveEvent(const TRawEvent& aRawEvent) + { + if (aRawEvent.ScanCode() == 60) + { + TRawEvent rawEvent; + rawEvent.Set(TRawEvent::EKeyUp, 34); + iFunctions->PostRawEvent(rawEvent); + rawEvent.Set(TRawEvent::EKeyUp, 35); + iFunctions->PostRawEvent(rawEvent); + return ETrue; + } + return EFalse; + } + +TBool CEventTestAnimBase::OfferRawEvent(const TRawEvent& aRawEvent) + { + // Do not consume the following types of events + if (IsIgnorableEvent(aRawEvent)) + { + return EFalse; + } + + // Increment event count if not in an error state + if (!Error()) + { + iEventCount++; + } + + // For anim which generates recursive events + if (aRawEvent.Type() == TRawEvent::EKeyDown && aRawEvent.ScanCode() == 60) + { + return HandleRecursiveEvent(aRawEvent); + } + + TAnimRawEvent event; + + if (!GetNextExpectedEvent(event)) + { + Fail(); + return EFalse; + } + + // Fail if wrong event type + if (!CompareEvents(event.iRawEvent, aRawEvent)) + { + Fail(); + } + + return event.iEat; + } + +TBool CEventTestAnimBase::GetNextExpectedEvent(TAnimRawEvent& aRawEvent) + { + // Get next expected event + if (iExpectedEvents.Remove(&aRawEvent)<1) + { + Fail(); + return EFalse; + } + else + { + return ETrue; + } + } + +TBool CEventTestAnimBase::IsIgnorableEvent(const TRawEvent& aRawEvent) const + { + TRawEvent::TType aType=aRawEvent.Type(); + TBool result = (aType==TRawEvent::EActive || aType==TRawEvent::EInactive || aType==TRawEvent::ERedraw + || (iExpectedEvents.Count()==0 && aType==TRawEvent::EPointerMove)); + + return result; + } + +TBool CEventTestAnimBase::CompareEvents(const TRawEvent& aExpectedEvent, const TRawEvent& aActualEvent) const + { + TRawEvent::TType eType=aExpectedEvent.Type(); + TRawEvent::TType aType=aActualEvent.Type(); + if (eType!=aType) + { + return EFalse; + } + else + { + switch (aType) + { + case TRawEvent::EUpdateModifiers: + { + TInt eMod=aExpectedEvent.Modifiers(),aMod=aActualEvent.Modifiers(); + if (eMod!=aMod) + { + return EFalse; + } + break; + } + case TRawEvent::EKeyDown: + case TRawEvent::EKeyUp: + { + TInt eScan=aExpectedEvent.ScanCode(),aScan=aActualEvent.ScanCode(); + if (eScan!=aScan) + { + return EFalse; + } + break; + } + case TRawEvent::EPointerMove: + case TRawEvent::EPointerSwitchOn: + case TRawEvent::EButton1Down: + case TRawEvent::EButton1Up: + case TRawEvent::EButton2Down: + case TRawEvent::EButton2Up: + case TRawEvent::EButton3Down: + case TRawEvent::EButton3Up: + { + TPoint ePoint=aExpectedEvent.Pos(),aPoint=aActualEvent.Pos(); + if (ePoint!=aPoint) + { + return EFalse; + } + break; + } + default:; + } + } + return ETrue; + } + +void CEventTestAnimBase::Fail() + { + if (iError==0) + { + iError=iEventCount; + } + } + +inline TInt CEventTestAnimBase::Error() const + { + return iError; + } + +inline TInt CEventTestAnimBase::EventCount() const + { + return iEventCount; + } + +inline void CEventTestAnimBase::ResetEventCount() + { + iEventCount = 0; + } + +inline TInt CEventTestAnimBase::TotalExpectedEvents() const + { + return iExpectedEvents.Count(); + } + +inline TInt CEventTestAnimBase::AddEvent(const TAnimRawEvent* aEvent) + { + return iExpectedEvents.Add(aEvent); + } + +// CEventTestAnim test drawing off own timer // +CEventTestAnim::~CEventTestAnim() + { + UnloadDeviceDriver(); + } + +void CEventTestAnim::ConstructL(TAny* aParam, TBool aBool) + { + CEventTestAnimBase::ConstructL(aParam, aBool); + iFunctions->GetRawEvents(ETrue); + iDevDriverLoaded=EFalse; + } + +TInt CEventTestAnim::UnloadDeviceDriver() + { + TInt err=KErrNone; + iLdd.Close(); + if (iDevDriverLoaded) + { + err=User::FreeLogicalDevice(REventDD::BinaryName()); + if (err==KErrNone) + iDevDriverLoaded=EFalse; + } + return err; + } + +TInt CEventTestAnim::AddExpectedEvent(const TAnimRawEvent* aEvent) + { + return (AddEvent(aEvent) ? KErrNone : KErrOverflow); + } + +TInt CEventTestAnim::CommandReplyL(TInt aOpcode,TAny* aParam) + { + switch (aOpcode) + { + case EADllNoEventsAndReset: + { + TInt events=EventCount(); + ResetEventCount(); + return events; + } + case EADllLoadDeviceDriver: + { + TInt err=User::LoadLogicalDevice(REventDD::BinaryName()); + if (err==KErrNone || err==KErrAlreadyExists) + { + TInt err2=iLdd.Open(); + if (err==KErrNone) + { + if (err2==KErrNone) + iDevDriverLoaded=ETrue; + else //Only unload if we loaded it + User::FreeLogicalDevice(REventDD::BinaryName()); + } + err=err2; + } + return err; + } + case EADllUnloadDeviceDriver: + return UnloadDeviceDriver(); + case EADllSendEvent: + { + TAnimRawEvent event; + TInt events=*static_cast(aParam); + TInt err=KErrNone; + TInt ii; + for (ii=events;ii>0;--ii) + { + event.iRawEvent.Set(ii/2==0 ? TRawEvent::ECaseOpen : TRawEvent::ECaseClose); + //TInt err=UserSvr::AddEvent(event.iRawEvent); + //Need to do the above line here, but don't have enough capability + //so call a device driver to do it instead + err=iLdd.SendEvent(event.iRawEvent); + if (err!=KErrNone) + return err; + event.iEat=ETrue; + AddExpectedEvent(&event); + } + return KErrNone; + } + default:; + return CEventTestAnimBase::CommandReplyL(aOpcode, aParam); + } + } + +void CEventTestAnim::Command(TInt aOpcode,TAny* /*aParam*/) + { + switch (aOpcode) + { + case EADllAfterEvent: + if (TotalExpectedEvents()>0) + Fail(); + break; + default:; + } + } + +// CEventPostingAnim test posting of anim events // +CEventPostingAnim::~CEventPostingAnim() + { + } + +void CEventPostingAnim::ConstructL(TAny* aParam, TBool aBool) + { + CEventTestAnimBase::ConstructL(aParam, aBool); + iFunctions->GetRawEvents(ETrue); + } + +TInt CEventPostingAnim::AddExpectedEvent(const TAnimRawEvent* aEvent) + { + return (AddEvent(aEvent) ? KErrNone : KErrOverflow); + } + +TBool CEventPostingAnim::OfferRawEvent(const TRawEvent &aRawEvent) + { + // Call PostRawEvent or PostKeyEvent according to type of the event + TBool ret = CEventTestAnimBase::OfferRawEvent(aRawEvent); + if (ret) + { + if (aRawEvent.Type() == TRawEvent::EKeyDown && aRawEvent.ScanCode() == 45) + { + TKeyEvent event; + event.iCode='J'; + event.iScanCode=0; + event.iModifiers=0; + + // This is to check the normal PostKeyEvent API + iFunctions->PostKeyEvent(event); + + // This is to check the newly added API + iFunctions->EventExtension()->PostKeyEvent(event, 2); + } + else + { + iFunctions->PostRawEvent(aRawEvent); + } + } + return ret; + } + +// CTimerTestAnim check that timer events stop // +CTimerTestAnim::~CTimerTestAnim() + { + } + +void CTimerTestAnim::ConstructL(TAny* /*aParam*/, TBool ) + { + iWindowFunctions->SetRect(TRect(0,0,1,1)); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + iExpectingTicks=ETrue; + iFail=EFalse; + } + +void CTimerTestAnim::Animate(TDateTime*) + { + ++iTimerCount; + if (!iExpectingTicks) + iFail=iTimerCount; + } + +void CTimerTestAnim::Redraw() + { + } + +void CTimerTestAnim::Command(TInt aOpcode, TAny* /*aParam*/) + { + switch (aOpcode) + { + case EADllResetCount: + iTimerCount=0; + break; + case EADllNoTimer: + iExpectingTicks=EFalse; + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + break; + case EADllTimerStarted: + iExpectingTicks=ETrue; + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + break; + default:; + } + } + +TInt CTimerTestAnim::CommandReplyL(TInt aOpcode, TAny* /*aParam*/) + { + switch (aOpcode) + { + case EADllCurrentCount: + return iTimerCount; + case EADllFailed: + return iFail; + default:; + } + return(KErrNone); + } + +void CTimerTestAnim::FocusChanged(TBool /*aState*/) + { + } + +TBool CTimerTestAnim::OfferRawEvent(const TRawEvent& /*aRawEvent*/) + { + return EFalse; + } + + +// CWinFunctionTestAnim test drawing off own timer // +CWinFunctionTestAnim::~CWinFunctionTestAnim() + {} + +void CWinFunctionTestAnim::ConstructL(TAny* /*aParam*/,TBool) + { + iWinFunctions=static_cast + (iFunctions->ExtendedInterface(MAnimGeneralFunctions::EWindowExtensionInterface)); + } + +void CWinFunctionTestAnim::Animate(TDateTime*) + {} + +void CWinFunctionTestAnim::Redraw() + {} + +void CWinFunctionTestAnim::Command(TInt /*aOpcode*/,TAny* /*aParam*/) + { + /*switch (aOpcode) + { + default:; + }*/ + } + +TInt CWinFunctionTestAnim::CommandReplyL(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch (aOpcode) + { + case EADllScreen: + return iWinFunctions->Screens(); + case EADllFocusScreen: + return iWinFunctions->FocusScreens(); + case EADllWindowGroups: + return iWinFunctions->WindowGroups(*pData.Int); + case EADllWindowGroupInfo: + { + const TWindowGroupInfoParms& params=*pData.WindowGroupInfoParms; + TPckgBuf info; + TBool ret=iWinFunctions->WindowGroupInfo(info(),params.iScreen,params.iOrdinalPosition); + /*const TInt theError=*/(*iFunctions->Message()).Write(KIpcSlot,info); + return ret; + } + case EADllWindowGroupName: + { + const TWindowGroupInfoParms& params=*pData.WindowGroupInfoParms; + TPtrC name; + TBool ret=iWinFunctions->WindowGroupName(name,params.iScreen,params.iOrdinalPosition); + /*const TInt theError=*/(*iFunctions->Message()).Write(KIpcSlot,name); + return ret; + } + case EADllSetOrdinalPosition: + { + const TSetOrdinalParms& params=*pData.SetOrdinalParms; + return iWinFunctions->SetOrdinalPosition(params.iIdentifier,params.iOrdinalPosition,params.iOrdinalPriority); + } + case EADllSetFocusScreen: + { + const TInt& params=*pData.Int; + iWinFunctions->SetFocusScreen(params); + break; + } + default:; + } + return(KErrNone); + } + +void CWinFunctionTestAnim::FocusChanged(TBool /*aState*/) + {} + +TBool CWinFunctionTestAnim::OfferRawEvent(const TRawEvent& /*aRawEvent*/) + { + return EFalse; + } + + +// CNotificationTestAnim +CNotificationTestAnim::CNotificationTestAnim() : iHeartbeatState(EFalse) , iScreenDeviceChanged(ETrue) + { + } + +CNotificationTestAnim::~CNotificationTestAnim() + { +// Removed for test case GRAPHICS-WSERV-0139 for DEF12220 +// iFunctions->RegisterForNotifications(EFalse); + } + +void CNotificationTestAnim::ConstructL(TAny* /*aParam*/, TBool ) + { + iWindowFunctions->SetRect(TRect(0,0,1,1)); + iFunctions->RegisterForNotifications(EDirectScreenAccess|EHeartbeatTimer|EScreenDeviceChange); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + iLastAnimTime.UniversalTime(); + } + +void CNotificationTestAnim::HandleNotification(const TWsEvent& aEvent) + { + switch (aEvent.Type()) + { + case EEventDirectScreenAccessBegin: + { + TInt screenNum = *(aEvent.Int()); + iDSA[screenNum] = ETrue; + } + break; + case EEventDirectScreenAccessEnd: + { + TInt screenNum = *(aEvent.Int()); + iDSA[screenNum] = EFalse; + } + break; + case EEventHeartbeatTimerStateChange: + { + iHeartbeatState=*aEvent.Int(); + } + break; + case EEventScreenDeviceChanged: + { + iScreenDeviceChanged=!iScreenDeviceChanged; + } + break; + default: + break; + } + } + +void CNotificationTestAnim::Animate(TDateTime*) + { + iLastAnimTime.UniversalTime(); + } + +void CNotificationTestAnim::Redraw() + { + } + +void CNotificationTestAnim::Command(TInt /*aOpcode*/, TAny* /*aParam*/) + { + } + +TInt CNotificationTestAnim::CommandReplyL(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch (aOpcode) + { + case EADllQueryDSA: + { + TInt screenNum = *pData.Int; + return iDSA[screenNum]; + } + case EADllQueryHeartbeatState: + { + return iHeartbeatState; + } + case EADllIsAnimating: + { + // Check if the anim DLL is currently animating by comparing + // the current time with the last anim time - if this is greater than a second + // then we are not animating + TTime timeNow; + timeNow.UniversalTime(); + TTimeIntervalMicroSeconds microSecs = timeNow.MicroSecondsFrom(iLastAnimTime); + if(microSecs > TTimeIntervalMicroSeconds(1200000)) // 1 sec plus 0.2 secs to cope with any latency + { + return EFalse; + } + else + { + return ETrue; + } + } + default:; + } + return(KErrNone); + } + +void CNotificationTestAnim::FocusChanged(TBool /*aState*/) + { + } + +TBool CNotificationTestAnim::OfferRawEvent(const TRawEvent& /*aRawEvent*/) + { + return EFalse; + } + +// CTransAnim test drawing// +void CTransAnim::ConstructL(TAny* aParam, TBool) + { + iRect=*static_cast(aParam);//Assigns the animation area + iWindowFunctions->SetRect(iRect); + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + iFont=NULL; + iColor=TRgb(0,0,0); + } + +void CTransAnim::Animate(TDateTime*) + { + iWindowFunctions->ActivateGc(); + if(iMode==1) //Draw line mode + { + DoDraw(iDraw,*iGc,iColor,iRect); + } + else if(iMode==2) //Draw text mode + { + DoDraw(iDraw,*iGc,iColor,iRect,iFont,iCount); + } + } + +void CTransAnim::Redraw() + { + DoDraw(iDraw,*iGc,iColor,iRect,iFont,iCount); + } + +void CTransAnim::Command(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch(aOpcode) + { + case EADllDrawNow: //Used to draw a single frame + iWindowFunctions->ActivateGc(); + iMode=1; + iDraw=36; + iColor=TRgb(0,0,0); + DoDraw(iDraw,*iGc,iColor,iRect); + break; + case EADllNextFrame: //Used to draw a continous frame + iMode=2; + iColor=pData.FrameData->color; + iDraw=pData.FrameData->draw; + iCount=pData.FrameData->text; + break; + case EADllStartAnimText: //Used to start text animate + iWindowFunctions->ActivateGc(); + iMode=2; + iDraw=37; + iFont=iFunctions->DuplicateFontL(pData.FrameData->font); + iColor=pData.FrameData->color; + iCount=pData.FrameData->text; + if(pData.FrameData->sync==EStateFlash) + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + else if(pData.FrameData->sync==EStateSecond) + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + DoDraw(iDraw,*iGc,iColor,iRect,iFont,iCount); + break; + case EADllEndAnimText: //Used to end text animate + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + iWindowFunctions->ActivateGc(); + iCount=0; + iMode=0; + iFunctions->CloseFont(iFont); + iFont=NULL; + break; + } + } + +TInt CTransAnim::CommandReplyL(TInt /*aOpcode*/, TAny* /*aParam*/) + { + return(0); + } + +void CTransAnim::FocusChanged(TBool /*aState*/) + {} + +TBool CTransAnim::OfferRawEvent(const TRawEvent& /*aRawEvent*/) + { + return EFalse; + } + +// an anim dll that doesn't remove itself from the event handler list +CTestHandlerAnim::~CTestHandlerAnim() + { + } + +void CTestHandlerAnim::ConstructL(TAny* /*aArgs*/, TBool /*aHasFocus*/) + { + iFunctions->GetRawEvents(ETrue); + } + +void CTestHandlerAnim::Redraw() + { + } + +void CTestHandlerAnim::FocusChanged(TBool /*aState*/) + { + } + +TInt CTestHandlerAnim::CommandReplyL(TInt /*aOpcode*/, TAny* /*aArgs*/) + { + return KErrNone; + } + +void CTestHandlerAnim::Command(TInt /*aOpcode*/, TAny* /*aArgs*/) + { + } + +void CTestHandlerAnim::Animate(TDateTime* /*aDateTime*/) + { + } + +TBool CTestHandlerAnim::OfferRawEvent(const TRawEvent &/*aRawEvent*/) + { + return EFalse; + } + +// CRemovableAnim Test removal of anim during event handling // +CRemovableAnim::~CRemovableAnim() + { + } + +TInt CRemovableAnim::AddExpectedEvent(const TAnimRawEvent* aEvent) + { + if (TotalExpectedEvents() + EventCount() < iLifetime) + { + return (AddEvent(aEvent) ? KErrNone : KErrOverflow); + } + else + { + return KErrNone; + } + } + +TInt CRemovableAnim::CommandReplyL(TInt aOpcode,TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch (aOpcode) + { + case EADllSetEventHandlerLifetime: + iLifetime = *pData.Int; + return iLifetime; + case EADllEventHandlerLifetime: + return iLifetime; + case EADllAddToEventHandlers: + iFunctions->GetRawEvents(ETrue); + return KErrNone; + case EADllRemoveFromEventHandlers: + iFunctions->GetRawEvents(EFalse); + return KErrNone; + case EADllTestPassed: + { + // If any unexpected events are received, then Error() > 0 + // If fewer than the number of expected events are received, then TotalExpectedEvents() > 0 + TBool passed = (Error() == 0) && (TotalExpectedEvents() == 0); + return passed; + } + default: + return CEventTestAnimBase::CommandReplyL(aOpcode, aParam); + } + } + + +TBool CRemovableAnim::OfferRawEvent(const TRawEvent& aRawEvent) + { + TBool eat = CEventTestAnimBase::OfferRawEvent(aRawEvent); + + // Remove anim from event handlers if lifetime has been exceeded + if (EventCount() >= iLifetime) + { + iFunctions->GetRawEvents(EFalse); + } + return eat; + } + +// CMultiPointerAnim for Testing multipointerevents for anims // +CMultiPointerAnim::~CMultiPointerAnim() + { + iFunctions->GetRawEvents(EFalse); + } + +// Important thing here is to call GetRawEvents() which Switches animation raw event handling on +void CMultiPointerAnim::ConstructL(TAny */*aArgs*/, TBool /*aHasFocus*/) + { + iExpectedEvents.SetLengthL(EEventBufferSize); + iFunctions->GetRawEvents(ETrue); + } + +void CMultiPointerAnim::Animate(TDateTime */*aDateTime*/) + { + } + +void CMultiPointerAnim::Command(TInt /*aOpcode*/, TAny */*aArgs*/) + { + } + +TInt CMultiPointerAnim::CommandReplyL(TInt aOpcode, TAny *aArgs) + { + TAnimArgUnion pData; + pData.any=aArgs; + switch (aOpcode) + { + case EADllAddExpectedMultiPtrEvent: + return AddEvent(pData.AnimRawEvent); + case EADllMultiPtrEventError: + return iError; + case EADllMultiPtrEventErrorDesc: + if (iError != KErrNone) + { + // returns the error description which gets displayed in logs if test failed + const RMessagePtr2& message=*iFunctions->Message(); + const TInt error=message.Write(KIpcSlot, iErrorDes); + if (error != KErrNone) + { + return error; + } + } + break; + case EADllMultiPtrEventReset: + iExpectedEvents.Reset(); + iError = 0; + iEventCount = 0; + break; + default:; + } + return(KErrNone); + } + +void CMultiPointerAnim::Redraw() + { + } + +void CMultiPointerAnim::FocusChanged(TBool /*aState*/) + { + } + +TBool CMultiPointerAnim::OfferRawEvent(const TRawEvent &aRawEvent) + { + // Ignore following raw events + TRawEvent::TType aType=aRawEvent.Type(); + if (aType==TRawEvent::EActive || aType==TRawEvent::EInactive || aType==TRawEvent::ERedraw + || aType==TRawEvent::EPointerSwitchOn || aType==TRawEvent::EUpdateModifiers) + { + return EFalse; + } + + // If it has already failed then do not test other events becasue the error value + // and its descriptor will be over written + if (iError) + { + return EFalse;; + } + + TAnimRawEvent expectedEvent; + if (iExpectedEvents.Remove(&expectedEvent)<1) + { + return EFalse; + } + + // Increment event count + iEventCount++; + + // Call compare events function passing in both the events + if (!CompareEvents(expectedEvent.iRawEvent, aRawEvent)) + { + iError = iEventCount; + } + + return expectedEvent.iEat; + } + +TInt CMultiPointerAnim::AddEvent(const TAnimRawEvent* aEvent) + { + return iExpectedEvents.Add(aEvent); + } + +TBool CMultiPointerAnim::CompareEvents(const TRawEvent& aExpectedEvent, const TRawEvent& aActualEvent) + { + // Check pointer type + if (aExpectedEvent.Type() != aActualEvent.Type()) + { + _LIT(KEventType, "Actual Event type = %d Expected Event Type = %d "); + iErrorDes.Format(KEventType, aActualEvent.Type(), aExpectedEvent.Type()); + return EFalse; + } + + // Here for EOutOfRange we cannot query Pos or Pos3D... + if (aExpectedEvent.Type() != TRawEvent::EPointer3DOutOfRange) + { + // Check 3d position + TPoint3D expected3DPos = aExpectedEvent.Pos3D(); + TPoint3D actual3DPos = aActualEvent.Pos3D(); + if (expected3DPos.iX != actual3DPos.iX) + { + _LIT(KXPosition, "Actual X coordinate = %d Expected X coordinate = %d "); + iErrorDes.Format(KXPosition, actual3DPos.iX, expected3DPos.iX); + return EFalse; + } + if (expected3DPos.iY != actual3DPos.iY) + { + _LIT(KYPosition, "Actual Y coordinate = %d Expected Y coordinate = %d "); + iErrorDes.Format(KYPosition, actual3DPos.iY, expected3DPos.iY); + return EFalse; + } + if (expected3DPos.iZ != actual3DPos.iZ) + { + _LIT(KZPosition, "Actual Z coordinate = %d Expected Z coordinate = %d "); + iErrorDes.Format(KZPosition, actual3DPos.iZ, expected3DPos.iZ); + return EFalse; + } + } + + // Check pointer number + if (aExpectedEvent.PointerNumber() != aActualEvent.PointerNumber()) + { + _LIT(KPointerNumber, "Actual Pointer number = %d Expected Pointer number = %d "); + iErrorDes.Copy(KPointerNumber); + iErrorDes.Format(KPointerNumber, aActualEvent.PointerNumber(), aExpectedEvent.PointerNumber()); + return EFalse; + } + return ETrue; + } + +// CCoverageAnim test drawing/redrawing // +CCoverageAnim::~CCoverageAnim() + { + if(iFont && iFunctions) + iFunctions->CloseFont(iFont); + } + +/** + Initializes members. + */ +void CCoverageAnim::ConstructL(TAny *aParam, TBool ) + { + iRect=*static_cast(aParam); + iWindowFunctions->SetRect(iRect); + iWindowFunctions->Invalidate(iRect); + + iFunctions->SetSync(MAnimGeneralFunctions::ESyncDay); + if (iFunctions->Sync() != MAnimGeneralFunctions::ESyncDay) + User::Leave(KErrGeneral); + + iFunctions->SetSync(MAnimGeneralFunctions::ESyncMinute); + if (iFunctions->Sync() != MAnimGeneralFunctions::ESyncMinute) + User::Leave(KErrGeneral); + + iFunctions->SetSync(MAnimGeneralFunctions::ESyncSecond); + if (iFunctions->Sync() != MAnimGeneralFunctions::ESyncSecond) + User::Leave(KErrGeneral); + + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + if (iFunctions->Sync() != MAnimGeneralFunctions::ESyncFlash) + User::Leave(KErrGeneral); + + iFunctions->SetSync(MAnimGeneralFunctions::ESyncNone); + if (iFunctions->Sync() != MAnimGeneralFunctions::ESyncNone) + User::Leave(KErrGeneral); + + iFunctions->SetInterval(1); + iFunctions->SetInterval(0); + iFunctions->SetNextInterval(0); + + User::LeaveIfNull(iFunctions->ExtendedInterface(MAnimGeneralFunctions::ENumberOfExtendedInterfaces)); + User::LeaveIfNull(iFunctions->ExtendedInterface(MAnimGeneralFunctions::EWindowExtensionInterface)); + User::LeaveIfNull(iFunctions->ExtendedInterface(MAnimGeneralFunctions::EEventExtentionInterface)); + User::LeaveIfError(iFunctions->ExtendedInterface(MAnimGeneralFunctions::EInterfaceCount) != NULL); + + #if !defined(SYMBIAN_GRAPHICS_GCE) + // Deprecated in NGA but needs to be tested in NONNGA + User::LeaveIfNull((TAny*)iFunctions->ScreenDevice()); + #endif + + iFunctions->Client(); + } + +/** + Copied from CAutoAnimScrBack. + */ +void CCoverageAnim::Animate(TDateTime *) + { + iWindowFunctions->ActivateGc(); + Draw(); + } + +/** + All methods of the graphic-context are executed one by one. + */ +void CCoverageAnim::Draw() + { + iGc->SetClippingRect(iRect); + iGc->Clear(); + iGc->Clear(iRect); + + iGc->SetDrawMode(CGraphicsContext::EDrawModeAND); + iGc->SetBrushStyle(CGraphicsContext::ENullBrush); + iGc->SetBrushColor(TRgb::Gray256(85)); + iGc->SetBrushOrigin(TPoint(0,0)); + iGc->SetPenColor(TRgb::Gray256(170)); + + //primitive method calls + iGc->SetFaded(ETrue); + iGc->SetFadingParameters(1, 1); + + iGc->SetPenStyle(CGraphicsContext::ESolidPen); + iGc->SetStrikethroughStyle(EStrikethroughOff); + iGc->SetUnderlineStyle(EUnderlineOff); + iGc->SetWordJustification(2, 1); + + if(iFont) + iGc->UseFont(iFont); + + iGc->DrawArc(iRect, + TPoint(iRect.Center().iX, iRect.iTl.iY), + TPoint(iRect.iBr.iX, iRect.Center().iY)); + iGc->DrawLine(iRect.iTl,iRect.Center()); + iGc->DrawLineTo(TPoint(iRect.iBr.iX, iRect.iTl.iY)); + + iGc->DrawLineBy(TPoint(iRect.iTl.iX, iRect.iBr.iY)); + iGc->MoveBy(iRect.iTl + TPoint(1,1)); + iGc->MoveTo(iRect.iTl + TPoint(0,0)); + iGc->SetPenSize(TSize(10,10)); + iGc->Plot(iRect.iTl + TPoint(2,2)); + iGc->SetPenSize(TSize(1,1)); + + CArrayFixFlat* polyPoints = new(ELeave) CArrayFixFlat(3); //CArrayFixFlat + CleanupStack::PushL(polyPoints); + polyPoints->AppendL(iRect.iTl); + polyPoints->AppendL(iRect.Center()); + polyPoints->AppendL(TPoint(iRect.iBr.iX, iRect.iTl.iY)); + + iGc->DrawPolyLine(polyPoints); + iGc->DrawPolyLine(&polyPoints->At(0), 3); + iGc->DrawPolygon(polyPoints, CGraphicsContext::EWinding); + iGc->DrawPolygon(&polyPoints->At(0), 3, CGraphicsContext::EAlternate); + + iGc->DrawPie(iRect, TPoint(iRect.Center().iX, iRect.iTl.iY), TPoint(iRect.iBr.iX, iRect.Center().iY)); + iGc->DrawEllipse(iRect); + iGc->DrawRect(iRect); + iGc->DrawRoundRect(iRect, TSize(iRect.Width()/8, iRect.Height()/8)); + + CleanupStack::PopAndDestroy(polyPoints); + + iGc->CopyRect(TPoint(10, 10), iRect); + + CFbsBitmap* bitmap = new(ELeave) CFbsBitmap(); + CleanupStack::PushL(bitmap); + User::LeaveIfError(bitmap->Create(TSize(16,16),EGray4)); + + iGc->UseBrushPattern(bitmap); + iGc->DrawBitmap(iRect.iTl, bitmap); + iGc->DrawBitmap(iRect, bitmap); + iGc->DrawBitmap(iRect, bitmap, TRect(0, 0, 16, 16)); + iGc->DrawBitmapMasked(iRect, bitmap, TRect(0, 0, 16, 16), bitmap, ETrue); + + iGc->BitBlt(TPoint(0, 0), bitmap); + iGc->BitBlt(TPoint(0, 0), bitmap, iRect); + iGc->BitBltMasked(TPoint(0, 0), bitmap, iRect, bitmap, ETrue); + iGc->AlphaBlendBitmaps(TPoint(0, 0), bitmap, iRect, bitmap, TPoint(0,0)); + + CleanupStack::PopAndDestroy(bitmap); + + iGc->SetCharJustification(1,1); + iGc->SetClippingRect(iRect); + if(iFont) + { + _LIT(KHelloWorld,"Hello World"); + iGc->DrawText(*&KHelloWorld, iRect.iTl); + iGc->DrawText(*&KHelloWorld, iRect, 0, CGraphicsContext::ELeft, 0); + iGc->DrawTextVertical(*&KHelloWorld, iRect.iBr, ETrue); + iGc->DrawTextVertical(*&KHelloWorld, iRect, 0, ETrue, CGraphicsContext::ELeft, 0); + } + + TRgb rgbs[2]; + iGc->MapColors(iRect, rgbs, 1, ETrue); + iGc->DiscardBrushPattern(); + + if(iFont) + iGc->DiscardFont(); + + iFunctions->CloseFont(0); + + TDateTime dt = iFunctions->SystemTime(); + } + +/** + Copied from CAutoAnim3. + */ +void CCoverageAnim::Redraw() + { + Draw(); + } + +/** + Copied from CAutoAnim3. + */ +void CCoverageAnim::Command(TInt ,TAny*) + { + } + +/** + Copied from CAutoAnim3. + */ +TInt CCoverageAnim::CommandReplyL(TInt aOpcode , TAny* aParam) + { + TAnimArgUnion pData; + pData.any=aParam; + switch(aOpcode) + { + case EADllDrawNow: + iFunctions->SetSync(MAnimGeneralFunctions::ESyncFlash); + break; + case EADllSetFont: + if(iFont) + { + iFunctions->CloseFont(iFont); + iFont = NULL; + } + iFont = iFunctions->DuplicateFontL(*pData.Int); + break; + } + return(KErrNone); + } + +/** + Copied from CAutoAnim3. + */ +void CCoverageAnim::FocusChanged(TBool ) + {} + +/** + Copied from CAutoAnim3. + */ +TBool CCoverageAnim::OfferRawEvent(const TRawEvent &/*aRawEvent*/) + { + return EFalse; + } + + +// DLL code // + +CAnim *CTestAnimDll::CreateInstanceL(TInt aType) + { + CAnim *anim=NULL; + switch(aType) + { + case EAnimTypeTest1: + anim=new(ELeave) CPanicAnim(); + break; + case EAnimTypeTest2: + anim=new(ELeave) CPanicAnim2(); + break; + case EAnimTypeTest3: + anim=new(ELeave) CAutoAnim3(); + break; + case EAnimTypeScrBackTest: + anim=new(ELeave) CAutoAnimScrBack(); + break; + case EAnimTypeSprite: + anim=new(ELeave) CTestSpriteAnim(); + break; + case EAnimTypeFreeTimer: + anim=new(ELeave) CTestFreeTimerAnim(); + break; + case EAnimTypeEventTest: + anim=new(ELeave) CEventTestAnim(); + break; + case EAnimTypeNotificationTest: + anim=new(ELeave) CNotificationTestAnim(); + break; + case EAnimTypeTimer: + anim=new(ELeave) CTimerTestAnim(); + break; + case EAnimTypeWindowFunctions: + anim=new(ELeave) CWinFunctionTestAnim(); + break; + case EAnimTypeTrans: + anim=new(ELeave) CTransAnim(); + break; + case EAnimTypeEventHandler: + anim = new (ELeave) CTestHandlerAnim(); + break; + case EAnimTypeRemovableAnim: + anim=new(ELeave) CRemovableAnim(); + break; + case EAnimTypeEventPostingTest: + anim=new(ELeave) CEventPostingAnim(); + break; + case EAnimTypeCoverage: + anim=new(ELeave) CCoverageAnim(); + break; + case EAnimTypeMultiPointer: + anim=new(ELeave) CMultiPointerAnim(); + break; + } + return(anim); + } + +// Dummy E32Dll needed by E32 to build // + +void CAutoAnim3::DrawTestScreenL(const TDrawTestScreen* aParams) +//Moved here as the include messes up the debugging of the rest of the file. + { + CFbsBitmap *aBitmap=iFunctions->DuplicateBitmapL(aParams->bitmap); + CleanupStack::PushL(aBitmap); + CFbsBitmap *aMaskBitmap=iFunctions->DuplicateBitmapL(aParams->maskBitmap); + CleanupStack::PushL(aMaskBitmap); + CFbsFont *aFont=iFont=iFunctions->DuplicateFontL(aParams->font); + TSize size(iWindowFunctions->WindowSize()); + iWindowFunctions->ActivateGc(); + CBitmapContext *gc=iGc; + TBool aExtraDrawBitMap=ETrue; +// +#include "DLLDRAW.H" +// + iFunctions->CloseFont(iFont); + iFont=NULL; + CleanupStack::PopAndDestroy(2); + }