windowing/windowserver/tdynamicres/inc/wsdynamicresbase.h
changeset 0 5d03bc08d59c
--- /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 <graphics/surface.h>
+#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 Referee,class LoggerOwner>
+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<CSurfaceUtility,CWsDynamicResBase> 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_*/