sl@0: // Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: /** sl@0: @file sl@0: @test sl@0: @internalComponent - Internal Symbian test code sl@0: */ sl@0: sl@0: #ifndef __TDIRECTA_H__ sl@0: #define __TDIRECTA_H__ sl@0: sl@0: #include "AUTO.H" sl@0: #include sl@0: #include sl@0: #include "TGraphicsHarness.h" sl@0: sl@0: //#define LOGGING sl@0: sl@0: class CColorAnimation; sl@0: class CScrollText; sl@0: class CScrollingTextDrawer; sl@0: class CDirectScreenAccessOld; sl@0: sl@0: sl@0: struct TDirectThreadParam sl@0: { sl@0: TRect iRect; sl@0: TInt iScreenNumber; sl@0: TBool iIsInFront; sl@0: }; sl@0: sl@0: class MAnimCallBacks sl@0: { sl@0: public: sl@0: virtual void LogLeave(TInt aErr)=0; sl@0: virtual void Fail()=0; sl@0: virtual void Finished(TInt aId)=0; sl@0: virtual TDisplayMode DisplayMode(TInt aId)=0; sl@0: virtual TRgb BrushColorL(TInt aId,TInt& aColor,TBool& aFinished)=0; sl@0: virtual TInt TimerInterval(TInt aId)=0; sl@0: virtual void FailedReStart(TInt aId,TInt aReason)=0; sl@0: virtual TInt SlowStopping(TInt aId,TInt aCount)=0; sl@0: virtual void Log(const TText8* aFile, TInt aLine, TInt aSeverity,const TDesC& aString)=0; sl@0: public: sl@0: CTBlankWindow* iCallBackWin; sl@0: }; sl@0: sl@0: class CTDirect : public CTWsGraphicsBase, public MAbortDirectScreenAccess, public MAnimCallBacks sl@0: { sl@0: public: sl@0: enum sl@0: { sl@0: eDirectNumFrames=10 sl@0: }; sl@0: enum sl@0: { sl@0: eDirectControlSem=0x01, sl@0: eDirectWindowSem=0x02, sl@0: eFontSet=0x04, sl@0: eMultiAnim=0x08, sl@0: }; sl@0: public: sl@0: CTDirect(CTestStep* aStep); sl@0: ~CTDirect(); sl@0: void ConstructL(); sl@0: TBool DrawFrame(); sl@0: TBool Restart(); sl@0: void ChangeToNextScreenModeL(); sl@0: void ChangeScreenScale(); sl@0: //The Tests sl@0: TestState AnimateWindowL(); sl@0: TestState AnimationDiesL(); sl@0: TestState PackagingClassL(); sl@0: TestState MultipleL(); sl@0: TestState FailCodesL(); sl@0: TestState ScrolingText1L(); sl@0: TestState RClassL(); sl@0: TestState ScrolingText2L(); sl@0: TestState ScrolingText3L(); sl@0: TestState ScrolingText4L(); sl@0: TestState DefectFix_KAA_5J3BLW_L(); sl@0: TestState KillAnimationL(); sl@0: TestState DSAWithScreenModeOffset1L(); sl@0: TestState DSAWithScreenModeOffset2L(); sl@0: TestState WindowPoistionRelativeToScreenL(); sl@0: TestState ScreenModeScalingTestL(); sl@0: TestState ScreenModeTestForScalingL(); sl@0: TestState MultipleDSAsOnSameWindowL(); sl@0: TestState TemporaryDeadlockL(); sl@0: TestState RegionTrackingOnlyNotificationsL(TUint aId); sl@0: TestState MixDsaAndRegionTrackingOnlyL(TBool aWhoExitsLast); sl@0: TestState TryDifferentSupportedModesL(); sl@0: protected: sl@0: //from CTGraphicsStep sl@0: virtual void RunTestCaseL(TInt aCurTestCase); sl@0: private: sl@0: void ConstrucBlankWindowL(); sl@0: void ScanTypeFacesL(); sl@0: void InitialiseAnimationL(); sl@0: void DestroyAnimation(); sl@0: void ResetScreenSizeMode(); sl@0: void StartDirect(); sl@0: void SignalWindow(); sl@0: void ModeSwitch(); sl@0: void ScrolingTextL(TInt aId,TRect aWinRect,TBool aStartThread,TInt aScreenMode=0); sl@0: void AnimTestL(TInt aId,TRect aWinRect,CTWinBase& aParent); sl@0: //Pure virtual function from MAbortDirectScreenAccess sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: //Pure virtual functions from MAnimCallBacks sl@0: void LogLeave(TInt aErr); sl@0: void Fail(); sl@0: void Finished(TInt aId); sl@0: void DeleteMoveWindow(); sl@0: void DeleteScroll(); sl@0: TDisplayMode DisplayMode(TInt aId); sl@0: TRgb BrushColorL(TInt aId,TInt& aColor,TBool& aFinished); sl@0: TInt TimerInterval(TInt aId); sl@0: void FailedReStart(TInt aId,TInt aReason); sl@0: TInt SlowStopping(TInt aId,TInt aCount); sl@0: void Log(const TText8* aFile, TInt aLine, TInt aSeverity,const TDesC& aString); sl@0: void SetScreenMode(TInt aMode,TPixelsAndRotation& aPixelsAndRotation); sl@0: void CreateAnimForScreenModeL(TInt aAnimIndex,CTWinBase& aParent,TRect aRect,TInt aId); sl@0: void BlankTopClientWindowL(CTBlankWindow& aBlankWindow,TRect aRect); sl@0: void TestDifferentOriginAndScaleL(TSizeMode &aMode,TPoint aOrigin); sl@0: void CheckForTemporaryDeadlock(); sl@0: private: sl@0: CProcess* iProcess; sl@0: CProcess* iMoveWin; sl@0: RSemaphore iControlSem; sl@0: RMsgQueueBase iControlQueue; sl@0: RSemaphore iWinSem; sl@0: TRequestStatus iThreadStatus; sl@0: TUint iFlags; sl@0: CTBlankWindow* iWin; sl@0: CTBlankWindow* iWin2; sl@0: CFbsScreenDevice* iScrDev; sl@0: CFbsBitGc* iGc; sl@0: CFont* iFont; sl@0: CPeriodic* iTimer; sl@0: CIdle* iRestart; sl@0: CDirectScreenAccessOld* iDirect; sl@0: RRegion* iDrawingRegion; sl@0: TSize iScrSize; sl@0: TRect iDrawRect; sl@0: TInt iDrawHeight; sl@0: TInt iFrameNo; sl@0: TInt iLastTextWidth; sl@0: TInt iLastMaxTextWidth; sl@0: TInt iFrameToSignalAfter; sl@0: TBool iDelay; sl@0: TBool iCancelNext; sl@0: TBool iWindowDead; sl@0: CColorAnimation* iAnim; sl@0: CColorAnimation* iAnims[13]; sl@0: TInt iCount; sl@0: CScrollText* iScroll; sl@0: TInt iCycles; sl@0: TScreenModeEnforcement iModeBackup; sl@0: TThreadStartUp iFirstFunction; sl@0: TInt iNumThreadHandles; sl@0: CTBlankWindow* iBlankTopClientWin1; sl@0: CTBlankWindow* iBlankTopClientWin2; sl@0: CPeriodic* iChangeScreenModeTimer; sl@0: TInt iCurrentMode; sl@0: TInt iNumOfModes; sl@0: TPoint iCurrentScreenModeOrigin; sl@0: TSize iCurrentScreenModeScale; sl@0: TInt iNumAnimation; sl@0: TSizeMode iModeData; sl@0: CPeriodic* iScreenModeTimer; sl@0: TInt iIsScalingSupported; sl@0: TInt iNumOfCallBack; sl@0: TBool iTestJustFailed; sl@0: TBool iTestJustCompleted; sl@0: TInt iState; sl@0: TBool iNextFrameFinished; sl@0: TBool iPackagingFinished; sl@0: TBool iTimerRunning; sl@0: }; sl@0: sl@0: class CDirectScreenAccessOld : public CActive sl@0: { sl@0: public: sl@0: static CDirectScreenAccessOld* NewL(RWsSession& aWs,MAbortDirectScreenAccess& aAborter); sl@0: ~CDirectScreenAccessOld(); sl@0: TInt Request(RRegion*& aRegion, RWindowBase& aWindow); sl@0: private: sl@0: inline CDirectScreenAccessOld(RWsSession& aWs,MAbortDirectScreenAccess& aAborter) sl@0: : CActive(RDirectScreenAccess::EPriorityVeryHigh), iDirectAccess(aWs), iAborter(aAborter) {} sl@0: void ConstructL(); sl@0: //Pure virtual functions from CActive sl@0: void DoCancel(); sl@0: void RunL(); sl@0: private: sl@0: RDirectScreenAccess iDirectAccess; sl@0: MAbortDirectScreenAccess& iAborter; sl@0: TBool iAborting; sl@0: }; sl@0: sl@0: class CColorAnimation : public CBase, public MDirectScreenAccess sl@0: { sl@0: public: sl@0: enum sl@0: { sl@0: eStopNow=EFalse, sl@0: eStopDelayed=ETrue, sl@0: eAbort=2, sl@0: eAbortAll, sl@0: }; sl@0: public: sl@0: static TInt DrawColorL(TAny* aAnimation); sl@0: static TInt IdlingL(TAny* aAnimation); sl@0: static CColorAnimation* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWinBase& aParent,TRect aExtent,TBool aStart,TBool aRegionTrackingOnly = EFalse); sl@0: inline CColorAnimation(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack) :iId(aId), iCallBack(aCallBack), iScreenNumber(aScreenNumber) {} sl@0: ~CColorAnimation(); sl@0: void ConstructL(CTWinBase& aParent,TRect aExtent,TBool aRegionTrackingOnly,TInt aTypeWindow=0,TInt aSingleWinForMultipleDSA=0); sl@0: void StartL(TBool aChildWindow=EFalse); sl@0: void StartOrPanic(); sl@0: void Stop(); sl@0: void BringWindowToFront(); sl@0: void ChangeModeL(TDisplayMode aMode); sl@0: TBool inline IsTimerActive() {return iTimer->IsActive();} sl@0: inline MAnimCallBacks& CallBack() { return iCallBack; } sl@0: TPoint AbsoluteWindowPosition(TInt aWindowId=0); sl@0: inline CDirectScreenAccess* GetDrawer(); sl@0: void FinishTest(); sl@0: TBool TestGcAndScreenDeviceValues(); sl@0: //inline TBool IsReadyToAbort(){return (iDrawer->iStatus!=KRequestPending);} sl@0: protected: sl@0: void DrawColorL(); sl@0: void IdlingL(); sl@0: /*pure virtual function from MAbortDirectScreenAccess*/ sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: /*pure virtual function from MDirectScreenAccess*/ sl@0: void Restart(RDirectScreenAccess::TTerminationReasons aReason); sl@0: private: sl@0: TInt iId; sl@0: CTBlankWindow* iWindow; sl@0: CTBlankWindow* iWindow2; sl@0: TSize iWinSize; sl@0: CDirectScreenAccess* iDrawer; sl@0: CPeriodic* iTimer; sl@0: MAnimCallBacks& iCallBack; sl@0: TInt iColor; sl@0: TInt iCount; sl@0: TUint iIdling; sl@0: TInt iScreenNumber; sl@0: TInt iSingleWinForMultipleDSA; sl@0: TBool iRegionTrackingOnly; sl@0: }; sl@0: sl@0: class CScrollingTextDrawer : public CBase sl@0: { sl@0: public: sl@0: static CScrollingTextDrawer* NewL(TInt aScreenNumber,CFbsScreenDevice*& aDevice,CFbsBitGc& aGc); sl@0: ~CScrollingTextDrawer(); sl@0: inline void SetScrollJump(TInt aJump) {iJump=aJump;} sl@0: void SetBottomOfTest(TInt aBottom); sl@0: void Scroll(); sl@0: private: sl@0: inline CScrollingTextDrawer(CFbsScreenDevice*& aDevice,CFbsBitGc& aGc) : iDevice(aDevice), iGc(&aGc) {} sl@0: void ConstructL(TInt aScreenNumber); sl@0: void CreateFontL(); sl@0: private: sl@0: CFbsScreenDevice*& iDevice; sl@0: CFbsScreenDevice* iFontDevice; sl@0: CFbsBitGc* iGc; sl@0: CFont* iFont; sl@0: TBuf<32> iText; sl@0: TRect iDrawRect; sl@0: TInt iDrawHeight; sl@0: TInt iCharWidth; sl@0: TInt iFirstChar; sl@0: TInt iJump; sl@0: #if defined(LOGGING) sl@0: RWsSession iWs; sl@0: #endif sl@0: }; sl@0: sl@0: class CScrollText : public CBase, public MDirectScreenAccess sl@0: { sl@0: public: sl@0: static TInt DrawText(TAny* aAnimation); sl@0: static CScrollText* NewL(TInt aScreenNumber,TInt aId,CTWindowGroup& aParent,TInt aScrollJump,TBool aStart=EFalse); sl@0: inline CScrollText(TInt aId,TInt aScrollJump,TInt aScreenNumber) :iId(aId), iScrollJump(aScrollJump), iScreenNumber(aScreenNumber) {} sl@0: ~CScrollText(); sl@0: void ConstructL(CTWindowGroup& aParent); sl@0: void StartL(); sl@0: void Stop(); sl@0: void ContinueL(); sl@0: inline TBool IsRunning() {return iTimer->IsActive();} sl@0: inline void SetCountDown(TInt aCountDown) {iAbortCountDown=aCountDown; iCounting=ETrue;} sl@0: inline void SetBottomOfTest(TInt aBottom) {iTextDraw->SetBottomOfTest(aBottom);} sl@0: private: sl@0: void ScrollText(); sl@0: void DoContinueL(); sl@0: /*pure virtual function from MAbortDirectScreenAccess*/ sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: /*pure virtual function from MDirectScreenAccess*/ sl@0: void Restart(RDirectScreenAccess::TTerminationReasons aReason); sl@0: private: sl@0: TInt iId; sl@0: CTBlankWindow* iWindow; sl@0: TSize iWinSize; sl@0: CDirectScreenAccess* iDrawer; sl@0: CScrollingTextDrawer* iTextDraw; sl@0: CPeriodic* iTimer; sl@0: TInt iScrollJump; sl@0: TBool iCounting; sl@0: TInt iAbortCountDown; sl@0: TInt iScreenNumber; sl@0: }; sl@0: sl@0: sl@0: /** sl@0: A simple class based on CScrollText constructs a blank window that has sl@0: a blank window child, used for functional coverage testing of CWsClientWindow sl@0: */ sl@0: class CWindowWithChild : public CBase, public MDirectScreenAccess sl@0: { sl@0: public: sl@0: static CWindowWithChild* NewL(TInt aScreenNumber, CTWindowGroup& aParent,TBool aStart=EFalse); sl@0: inline CWindowWithChild(TInt aScreenNumber) : iScreenNumber(aScreenNumber) {} sl@0: ~CWindowWithChild(); sl@0: void ConstructL(CTWindowGroup& aParent); sl@0: void StartL(); sl@0: void Stop(); sl@0: void ContinueL(); sl@0: inline TBool IsRunning() {return iRunning;} sl@0: void PerformCoverageCalls(); sl@0: RWindow *ChildWindow() {return iChildWindow->Win();} sl@0: private: sl@0: void DoContinueL(); sl@0: /*pure virtual function from MAbortDirectScreenAccess*/ sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: /*pure virtual function from MDirectScreenAccess*/ sl@0: void Restart(RDirectScreenAccess::TTerminationReasons aReason); sl@0: private: sl@0: CTBlankWindow* iWindow; sl@0: CTWin * iChildWindow; sl@0: TSize iWinSize; sl@0: CDirectScreenAccess* iDrawer; sl@0: TInt iScreenNumber; sl@0: TBool iRunning; sl@0: }; sl@0: sl@0: sl@0: class CWsBase : public CBase sl@0: { sl@0: public: sl@0: protected: sl@0: ~CWsBase(); sl@0: void ConstructL(TInt aScreenNumber,TInt aHandle); sl@0: void CreateBlankWindowL(RBlankWindow& iWin,TInt aHandle); sl@0: protected: sl@0: RWsSession iWs; sl@0: CWsScreenDevice *iScrDev; sl@0: RWindowGroup iGroup; sl@0: }; sl@0: sl@0: class CAnimating : public CWsBase, public MAbortDirectScreenAccess sl@0: { sl@0: public: sl@0: static TInt StartLC(TAny* aScreenNumber); sl@0: //static CAnimating* NewLC(); sl@0: void DrawFrame(); sl@0: /*pure virtual function from MAbortDirectScreenAccess*/ sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: private: sl@0: void ConstructL(TInt aScreenNumber); sl@0: ~CAnimating(); sl@0: void StartAnimatingL(); sl@0: private: sl@0: RSemaphore iControlSem; sl@0: RMsgQueueBase iControlQueue; sl@0: TBool iSemCreated; sl@0: RBlankWindow iWindow; sl@0: CFbsScreenDevice* iScrDev; sl@0: CFbsBitGc* iGc; sl@0: TSize iScrSize; sl@0: CDirectScreenAccessOld* iDirect; sl@0: RRegion* iDrawingRegion; sl@0: CPeriodic* iTimer; sl@0: TInt iColor; sl@0: }; sl@0: sl@0: class CMoveWindow : public CWsBase sl@0: { sl@0: public: sl@0: static TInt StartLC(TAny* aScreenNumber); sl@0: static TInt StateChange(TAny* aMoveWin); sl@0: static TInt FlipChange(TAny*); sl@0: //Call Backs sl@0: void MoveWindow(); sl@0: private: sl@0: inline static CMoveWindow* Cast(TAny* aMoveWin) {return STATIC_CAST(CMoveWindow*,aMoveWin);} sl@0: ~CMoveWindow(); sl@0: void ConstructL(TInt aScreenNumber); sl@0: void CreateTimerL(); sl@0: void StateChange(); sl@0: void ToggleDisplayMode(); sl@0: void FlipChange(); sl@0: private: sl@0: CPeriodic* iFlipTimer; sl@0: CPeriodic* iStateTimer; sl@0: CPeriodic* iTimer; sl@0: CWsScreenDevice* iDevice; sl@0: RBlankWindow iWindow; sl@0: TDisplayMode iDisplayMode; sl@0: RBackedUpWindow iBackUpWin; sl@0: CWindowGc* iGc; sl@0: TRect iBounceArea; sl@0: TSize iScrSize; sl@0: TPoint iTl; sl@0: TSize iSize; sl@0: TSize iDelta; sl@0: TInt iStateCountDown; sl@0: TInt iNumOfModes; sl@0: TInt iCurrentMode; sl@0: }; sl@0: sl@0: class CBugFixColorAnimation : public CColorAnimation sl@0: { sl@0: public: sl@0: static CBugFixColorAnimation* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWindowGroup& aParent,TRect aExtent,TBool aStart=EFalse); sl@0: ~CBugFixColorAnimation(); sl@0: inline void Started() { iSem.Signal(); } sl@0: private: sl@0: CBugFixColorAnimation(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack); sl@0: void ConstructL(CTWindowGroup& aParent,TRect aExtent); sl@0: private: sl@0: /*pure virtual function from MAbortDirectScreenAccess*/ sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: /*pure virtual function from MDirectScreenAccess*/ sl@0: void Restart(RDirectScreenAccess::TTerminationReasons aReason); sl@0: private: sl@0: CProcess* iThread; sl@0: CIdle* iTestFailed; sl@0: TRect iAnimRect; sl@0: TDirectThreadParam iThreadParam; sl@0: RSemaphore iSem; sl@0: }; sl@0: sl@0: class CRegionTrackingOnly : public CColorAnimation sl@0: { sl@0: public: sl@0: static CRegionTrackingOnly* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWindowGroup& aParent,TRect aExtent,TBool aStart,TBool aOpenWindowInFrontDsa); sl@0: void ConstructL(CTWindowGroup& aParent,TRect aExtent,TBool aOpenWindowInFrontDsa); sl@0: ~CRegionTrackingOnly(); sl@0: inline void Started() { iSem.Signal(); } sl@0: private: sl@0: CRegionTrackingOnly(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack); sl@0: /*Overriding of bases class virtual functions*/ sl@0: void AbortNow(RDirectScreenAccess::TTerminationReasons aReason); sl@0: void Restart(RDirectScreenAccess::TTerminationReasons aReason); sl@0: private: sl@0: CProcess* iThread; sl@0: TRect iAnimRect; sl@0: TBool iExpectedToAbort; sl@0: TDirectThreadParam iThreadParam; sl@0: RSemaphore iSem; sl@0: }; sl@0: sl@0: /*CPanicDirect*/ sl@0: class CPanicDirect : public CBase sl@0: { sl@0: public: sl@0: static TInt DoTestOnNewScheduler(TInt aInt, TAny* aPtr); sl@0: static TInt DoTestOnNewSchedulerL(TInt aInt, TAny* aPtr); sl@0: private: sl@0: inline CPanicDirect() {} sl@0: ~CPanicDirect(); sl@0: void ConstructL(TInt aScreenNumber, TInt aInt); sl@0: static void DoTestNowL(TInt aInt, TAny* aPtr); sl@0: void TestL(); sl@0: void DoDrawingL(); sl@0: private: sl@0: TInt iTestNo; sl@0: RWsSession iWs; sl@0: CWsScreenDevice* iWsScrDev; sl@0: RWindowGroup iGroup; sl@0: RBlankWindow iBlankWin; sl@0: RDirectScreenAccess iDirect; sl@0: TRequestStatus iDirectStatus; sl@0: RRegion* iRegion; sl@0: RTimer iTimer; sl@0: TRequestStatus iTimerStatus; sl@0: TBool iDrawingAllowed; sl@0: CFbsScreenDevice* iScreenDevice; sl@0: CFbsBitGc* iGc; sl@0: TDisplayMode iDisplayMode; sl@0: CScrollingTextDrawer* iTextDraw; sl@0: TInt iCount; sl@0: TInt iScreenNumber; sl@0: }; sl@0: sl@0: class CTDirectStep : public CTGraphicsStep sl@0: { sl@0: public: sl@0: CTDirectStep(); sl@0: protected: sl@0: //from CTGraphicsStep sl@0: virtual CTGraphicsBase* CreateTestL(); sl@0: }; sl@0: sl@0: _LIT(KTDirectStep,"TDirect"); sl@0: sl@0: sl@0: #endif