diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tdynamicres/inc/wsdynamicresbase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/tdynamicres/inc/wsdynamicresbase.h Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,164 @@ +// Copyright (c) 2008-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: +// + +#ifndef WSDYNAMICRESBASE_H_ +#define WSDYNAMICRESBASE_H_ + +#include "t_wsdynamicreswinbase.h" +#include +#include "surfaceutility.h" + +//************************************ +// +// Asserting wrapper around dereferencing a pointer that might be NULL. +// I don't want to fill the test code with checks that this pointer is not null before calling surface utility methods.... +// +//************************************ + +template +class SafePointer + { +public: + SafePointer(LoggerOwner* aOwner,Referee* aReferee=NULL): + iOwner(aOwner), iReferee(aReferee) + {} + Referee* operator=(Referee* aReferee) + { + return iReferee=aReferee; + } + Referee*& operator()() + { + return iReferee; + } + Referee* operator->() + { + if (iReferee==NULL) + { + iOwner -> INFO_PRINTF1(_L("Tried to dereference a pointer that is null!")); + User::Panic(_L("null pointer"),__LINE__); + } + return iReferee; + } +private: + LoggerOwner* iOwner; + Referee* iReferee; + }; + +/** + * Base class test harness that provides facilities for windowing and surface testing + * + **/ +class CWsDynamicResBase : public CWsDynamicResWinBase +{ +public: + CWsDynamicResBase(); + virtual ~CWsDynamicResBase(); + + virtual void SetupL(); + virtual void SetupL(TBool aUseOtherScreenForInfo); + virtual void TearDownL(); + virtual void TearDownFromDeleteL(); + /* Note that each derived test class needs to declare a static function to register tests. + * This should match the following prototype: + static CTestSuite* CreateSuiteL( const TDesC& aName ); + */ + + protected: + void UISurfaceL(TSurfaceId& aSurfaceId) const; + void CommonSurfaceWindowSetupL(RWindow& aWindow, TSurfaceId& aSurface, const TRgb& aColor); + void CommonOverlayWindowSetupL(RWindow& aWindow, const TRgb& aColor); + void ResizeTestCommonSetupL(RWindow& aWindow, const TRgb& aColor); + + void MakeTestWindowPairL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor); + void LargerTestWindow(TInt aPercentOfBack=80); + void DestroyTestWindowPair(TBool aKillTestBack=ETrue,TBool aKillTestFront=ETrue,TBool aKillTestChildren=ETrue); + void MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor); + void CreateTestWindowQuadL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor,TRect aSecondChildRect,TRgb aSecondChildColor); + void MakeTestWindowTripleL(TRect aOuterRect,TRgb aOuterColor,TRect aInnerRect,TRgb aInnerColor,TRect aChildRect,TRgb aChildColor); + void MakeExtraChildWindowL(const RWindowBase& aFromParent,TRect aChildRect,TRgb aChildColor); + struct LoopingGcPtr; + LoopingGcPtr LoopBeginActivateWithWipe(const TRegion& aRegion,RWindow& aWin,TRgb aColor); + CWindowGc* BeginActivateWithWipe(TBool aInvalidate,RWindow& aWin,TRgb aColor=TRgb(0,0)); + CWindowGc* BeginActivateWithWipe(TBool aInvalidate,TRect aRect,RWindow& aWin,TRgb aColor=TRgb(0,0)); + CWindowGc* BeginActivateWithWipe(const TRegion& aRegion,RWindow& aWin,TRgb aColor); + static CFbsBitmap* RotateBitmapLC(const CFbsBitmap* aSrcBitmap); + + void Pause(TInt aMilliseconds); + TInt RegionDiffForUiLayer(TInt aUiLayer); //returns values from TRegionExtend::TOverlapFlags enumeration + enum FastPathMode + { //Tereat this as bit flags or distinct states as you wish. + EFpExternalOpaque=0, + EFpUiOpaque=1, + EFpUiBlended=2, + EFpUiComplex=3, //If ony this is set then both blended and opaque are full=screen + EFpUiRegions=4, //If this FLAG is set then the regions are less than full-screen. Never occurs on its own + EFpUiRegionsOpaque=5, //If this is set then the regions are less than full-screen + EFpUiRegionsBlended=6, //If this is set then the regions are less than full-screen + EFpUiRegionsComplex=7 //This is the expected setting for windowed cr1108 optimisation. + }; + FastPathMode DeduceUiFastPathMode(); +protected: + SafePointer iUtility; + class TPostTestCleanup + { + protected: + TPostTestCleanup() {} + public: + mutable CSurfaceUtility* iSharedUtility; + mutable TBool iCleanedUpOnExit; + void CreateSharedUtilityL()const ; + }; + static const TPostTestCleanup& PostTestCleanupInstance(); + RWindow iTestBack; + RWindow iTestFront; + RWindow iTestChild; + RWindow iTestSecondChild; + static const TUidPixelFormat KSurfaceFormat = EUidPixelFormatXRGB_8888; + static const TInt KBytesPerPixel = 4; // Four bytes per pixel for the format above. +private: + +}; + +struct CWsDynamicResBase::LoopingGcPtr + { + LoopingGcPtr(const TRegion& aRegion,RWindow& aWin,TRgb aColor,CWindowGc *aGc) + : iRegion(aRegion), iWin(aWin), iColor(aColor), iGc(aGc), iPass(-1) + { operator++(); } + LoopingGcPtr(const LoopingGcPtr& aRhs) + : iRegion(aRhs.iRegion), iWin(aRhs.iWin), + iColor(aRhs.iColor), iGc(aRhs.iGc), + iPass(aRhs.iPass) + {} + void operator ++(); + operator bool() { return iPass>=0?iGc:(CWindowGc *)NULL; } + CWindowGc * operator ->() { return iPass>=0?iGc:(CWindowGc *)NULL; } + const TRegion& iRegion; + RWindow& iWin; + TRgb iColor; + CWindowGc *iGc; + TInt iPass; + }; + +#define LOG_AND_PANIC_IF_NOT_GCE \ + { \ + if (!GCEIsSupported()) \ + { \ + INFO_PRINTF1(_L("Test skipped: GCE support is not loaded")); \ + User::Panic(_L("GCE.Wrong.Mode"),1); \ + return; \ + } \ + } + +#endif /*WSDYNAMICRESBASE_H_*/