--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tdirectgdi_test_step_base.h Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,455 @@
+// Copyright (c) 2007-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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#ifndef __TDIRECTGDI_TEST_STEP_BASE__
+#define __TDIRECTGDI_TEST_STEP_BASE__
+
+#include "tdisplaymode_mapping.h"
+#include "tcontextbase.h"
+#include <test/testexecutestepbase.h>
+#include <bitdev.h>
+#include <graphics/sgimage.h>
+#include <graphics/directgdiimagetarget.h>
+#include <graphics/directgdidrawablesource.h>
+#include <graphics/directgdidriver.h>
+#include <graphics/directgdiextensioninterfaces.h>
+#include <test/ttmsgraphicsstep.h>
+
+/**
+Default size of the off screen image in pixels
+*/
+const TSize KDefaultOffScreenImageSizeInPixels(200, 200);
+const TInt KTestCaseLength = 100;
+
+_LIT(KCom, "Compressed");
+_LIT(KSeparator, "_");
+_LIT(KDirectGc, "DirectGdi");
+_LIT(KBitGc, "BitGdi");
+_LIT(KTargetString, "TGT");
+_LIT(KSourceString, "SRC");
+
+const TInt KFileNameLength = 200;
+const TInt KPixelFormatNameLength = 40;
+
+// Define 16 RGB colors
+#define KRgbBlack TRgb(0x000000)
+#define KRgbDarkGray TRgb(0x555555)
+#define KRgbDarkRed TRgb(0x000080)
+#define KRgbDarkGreen TRgb(0x008000)
+#define KRgbDarkYellow TRgb(0x008080)
+#define KRgbDarkBlue TRgb(0x800000)
+#define KRgbDarkMagenta TRgb(0x800080)
+#define KRgbDarkCyan TRgb(0x808000)
+#define KRgbRed TRgb(0x0000ff)
+#define KRgbGreen TRgb(0x00ff00)
+#define KRgbYellow TRgb(0x00ffff)
+#define KRgbBlue TRgb(0xff0000)
+#define KRgbMagenta TRgb(0xff00ff)
+#define KRgbCyan TRgb(0xffff00)
+#define KRgbGray TRgb(0xaaaaaa)
+#define KRgbWhite TRgb(0xffffff)
+
+// A 16 RGB color table
+const TRgb KColor16Table[] =
+ {
+ KRgbWhite,
+ KRgbGray,
+ KRgbCyan,
+ KRgbMagenta,
+ KRgbBlue,
+ KRgbYellow,
+ KRgbGreen,
+ KRgbRed,
+ KRgbDarkCyan,
+ KRgbDarkMagenta,
+ KRgbDarkBlue,
+ KRgbDarkYellow,
+ KRgbDarkGreen,
+ KRgbDarkRed,
+ KRgbDarkGray,
+ KRgbBlack,
+ };
+
+_LIT(KColorNameWhite,"White");
+_LIT(KColorNameGray,"Gray");
+_LIT(KColorNameCyan,"Cyan");
+_LIT(KColorNameMagenta,"Magenta");
+_LIT(KColorNameBlue,"Blue");
+_LIT(KColorNameYellow,"Yellow");
+_LIT(KColorNameGreen,"Green");
+_LIT(KColorNameRed,"Red");
+_LIT(KColorNameDarkCyan,"DarkCyan");
+_LIT(KColorNameDarkMagenta,"DarkMagenta");
+_LIT(KColorNameDarkBlue,"DarkBlue");
+_LIT(KColorNameDarkYellow,"DarkYellow");
+_LIT(KColorNameDarkGreen,"DarkGreen");
+_LIT(KColorNameDarkRed,"DarkRed");
+_LIT(KColorNameDarkGrey,"DarkGrey");
+_LIT(KColorNameBlack,"Black");
+
+const TPtrC KColor16TableNames[] =
+ {
+ KColorNameWhite(),
+ KColorNameGray(),
+ KColorNameCyan(),
+ KColorNameMagenta(),
+ KColorNameBlue(),
+ KColorNameYellow(),
+ KColorNameGreen(),
+ KColorNameRed(),
+ KColorNameDarkCyan(),
+ KColorNameDarkMagenta(),
+ KColorNameDarkBlue(),
+ KColorNameDarkYellow(),
+ KColorNameDarkGreen(),
+ KColorNameDarkRed(),
+ KColorNameDarkGrey(),
+ KColorNameBlack(),
+ };
+
+
+
+const DirectGdi::TBrushStyle KBrushStyleTable[] =
+ {
+ DirectGdi::ENullBrush,
+ DirectGdi::ESolidBrush,
+ DirectGdi::EPatternedBrush,
+ DirectGdi::EVerticalHatchBrush,
+ DirectGdi::EForwardDiagonalHatchBrush,
+ DirectGdi::EHorizontalHatchBrush,
+ DirectGdi::ERearwardDiagonalHatchBrush,
+ DirectGdi::ESquareCrossHatchBrush,
+ DirectGdi::EDiamondCrossHatchBrush,
+ };
+const TInt KNumBrushStyles = sizeof(KBrushStyleTable) / sizeof(DirectGdi::TBrushStyle);
+
+_LIT(KBrushStyleNullBrush,"NullBrush");
+_LIT(KBrushStyleSolidBrush,"SolidBrush");
+_LIT(KBrushStylePatternedBrush,"PatternedBrush");
+_LIT(KBrushStyleVerticalHatchBrush,"VerticalHatchBrush");
+_LIT(KBrushStyleForwardDiagonalHatchBrush,"ForwardDiagonalHatchBrush");
+_LIT(KBrushStyleHorizontalHatchBrush,"HorizontalHatchBrush");
+_LIT(KBrushStyleRearwardDiagonalHatchBrush,"RearwardDiagonalHatchBrush");
+_LIT(KBrushStyleSquareCrossHatchBrush,"SquareCrossHatchBrush");
+_LIT(KBrushStyleDiamondCrossHatchBrush,"DiamondCrossHatchBrush");
+
+const TPtrC KBrushStyleTableNames[] =
+ {
+ KBrushStyleNullBrush(),
+ KBrushStyleSolidBrush(),
+ KBrushStylePatternedBrush(),
+ KBrushStyleVerticalHatchBrush(),
+ KBrushStyleForwardDiagonalHatchBrush(),
+ KBrushStyleHorizontalHatchBrush(),
+ KBrushStyleRearwardDiagonalHatchBrush(),
+ KBrushStyleSquareCrossHatchBrush(),
+ KBrushStyleDiamondCrossHatchBrush(),
+ };
+
+const DirectGdi::TPenStyle KPenStyleTable[] =
+ {
+ DirectGdi::ENullPen,
+ DirectGdi::ESolidPen,
+ DirectGdi::EDottedPen,
+ DirectGdi::EDashedPen,
+ DirectGdi::EDotDashPen,
+ DirectGdi::EDotDotDashPen,
+ };
+
+const DirectGdi::TTextAlign KTextAlignTable[] =
+ {
+ DirectGdi::ELeft,
+ DirectGdi::ECenter,
+ DirectGdi::ERight,
+ };
+
+_LIT(KTextAlignNameLeft,"Left");
+_LIT(KTextAlignNameCenter,"Center");
+_LIT(KTextAlignNameRight,"Right");
+
+const TPtrC KTextAlignTableNames[] =
+ {
+ KTextAlignNameLeft(),
+ KTextAlignNameCenter(),
+ KTextAlignNameRight(),
+ };
+
+// Look-up table for pen-names.
+_LIT(KPenNameNull,"NullPen");
+_LIT(KPenNameSolid,"SolidPen");
+_LIT(KPenNameDotted,"DottedPen");
+_LIT(KPenNameDashed,"DashedPen");
+_LIT(KPenNameDotDash,"DotDashPen");
+_LIT(KPenNameDotDotDash,"DotDotDashPen");
+
+const TPtrC KPenNames[] =
+ {
+ KPenNameNull(),
+ KPenNameSolid(),
+ KPenNameDotted(),
+ KPenNameDashed(),
+ KPenNameDotDash(),
+ KPenNameDotDotDash()
+ };
+
+// Look-up table for all available pen-styles.
+const DirectGdi::TPenStyle KPenStyles[] =
+ {
+ DirectGdi::ENullPen,
+ DirectGdi::ESolidPen,
+ DirectGdi::EDottedPen,
+ DirectGdi::EDashedPen,
+ DirectGdi::EDotDashPen,
+ DirectGdi::EDotDotDashPen
+ };
+const TInt KNumPenStyles = sizeof(KPenStyles)/sizeof(DirectGdi::TPenStyle);
+
+// Look-up table for fill rule names.
+_LIT(KFillRuleAlternate,"Alternate");
+_LIT(KFillRuleWinding,"Winding");
+
+const TPtrC KFillRuleNames[] =
+ {
+ KFillRuleAlternate(),
+ KFillRuleWinding()
+ };
+
+/**
+Possible use cases of contexts and targets.
+*/
+enum TContextTestCase
+ {
+ EOneContextOneTarget,
+ EOneContextTwoTargets_SamePixelType,
+ EOneContextTwoTargets_DifferentPixelType,
+ ETwoContextsOneTarget,
+ ETwoContextsTwoTargets_WithoutSharing_SamePixelType,
+ ETwoContextsTwoTargets_WithoutSharing_DifferentPixelType,
+ ETwoContextsTwoTargets_WithSharing_SamePixelType,
+ ETwoContextsTwoTargets_WithSharing_DifferentPixelType,
+ EOneContextOneTarget_TwiceActivate,
+ ELast
+ };
+
+/**
+Position iterator helper class.
+Position iterator generates all possible positions from given start position to end position
+with step. All combinations of horizontal and vertical positions are generated.
+Additionaly x and y position index is iterated.
+ */
+class TPositionIterator
+ {
+public:
+ TPositionIterator(TInt aStartX, TInt aEndX, TInt aStepX,
+ TInt aStartY, TInt aEndY, TInt aStepY);
+ void Begin();
+ TBool Next();
+public:
+ TInt iStartX;
+ TInt iEndX;
+ TInt iStepX;
+ TInt iStartY;
+ TInt iEndY;
+ TInt iStepY;
+ TInt iPosX; // current x position
+ TInt iPosY; // current y position
+ TInt iIndexX; // current x position index
+ TInt iIndexY; // current y position index
+ };
+
+/**
+Base class for creating an off screen image target
+*/
+class CTImageTarget : public CBase
+ {
+public:
+ virtual TSize SizeInPixels() const = 0;
+ virtual CFbsBitmap* GetTargetFbsBitmapL() = 0;
+ virtual TInt CreateContext(CTContextBase*& aGc, TBool aActivate=ETrue) = 0;
+ virtual void Finish() = 0;
+ virtual TInt Activate(CTContextBase*& aGc) = 0;
+ virtual void Close() = 0;
+ virtual CBitmapDevice* BitmapDevice() const;
+
+protected:
+ CBitmapDevice* iBitmapDevice; // The virtual device
+ CFbsBitmap* iBitmap; // Virtual bitmap
+ };
+
+/**
+Create an image target using CFbsBitGc
+*/
+class CTBitGdiTarget : public CTImageTarget
+ {
+public:
+ virtual ~CTBitGdiTarget();
+ static CTBitGdiTarget* NewL(TUidPixelFormat aPixelFormat, const TSize& aSize);
+ virtual TSize SizeInPixels() const;
+ virtual CFbsBitmap* GetTargetFbsBitmapL();
+ virtual TInt CreateContext(CTContextBase*& aGc, TBool aActivate=ETrue);
+ virtual void Finish();
+ virtual TInt Activate(CTContextBase*& aGc);
+ virtual void Close();
+private:
+ void ConstructL(TUidPixelFormat aPixelFormat, const TSize& aSize);
+ };
+
+/**
+Create an image target using DirectGDiGc
+ */
+class CTDirectGdiTarget : public CTImageTarget
+ {
+public:
+ CTDirectGdiTarget();
+ virtual ~CTDirectGdiTarget();
+ static CTDirectGdiTarget* NewL(TUidPixelFormat aPixelFormat, const TSize& aSize);
+ virtual TSize SizeInPixels() const;
+ virtual CFbsBitmap* GetTargetFbsBitmapL();
+ virtual TInt CreateContext(CTContextBase*& aGc, TBool aActivate=ETrue);
+ virtual void Finish();
+ virtual TInt Activate(CTContextBase*& aGc);
+ virtual void Close();
+private:
+ void ConstructL(TUidPixelFormat aPixelFormat, const TSize& aSize);
+
+public:
+ CDirectGdiDriver* iDGdiDriver; // Driver for Direct GDI support
+ RDirectGdiImageTarget* iDGdiImageTarget;
+ RSgImage iRSgImage;
+ TSgImageInfo iImageInfo; // image info for RSgImage
+ };
+
+/**
+The reason to have a new step base is that it is very much possible that the all
+individual test steps have project related common variables and members
+and this is the place to define these common variable and members.
+All directgdi test classes derive from this class
+*/
+class CTDirectGdiStepBase : public CTTMSGraphicsStep
+ {
+
+protected:
+ // This structure is used to help manage parameters on a per test-case
+ // basis. A pointer to an instance of this structure is passed through
+ // to each test case as it executes.
+ //
+ struct TTestParams
+ {
+ TUidPixelFormat iTargetPixelFormat;
+ TUidPixelFormat iSourcePixelFormat;
+ TUidPixelFormat iSourceResourcePixelFormat;
+ TBool iDoCompressed;
+
+ TTestParams () :
+ iTargetPixelFormat(EUidPixelFormatUnknown),
+ iSourcePixelFormat(EUidPixelFormatUnknown),
+ iSourceResourcePixelFormat(EUidPixelFormatUnknown),
+ iDoCompressed(EFalse){};
+ };
+
+ virtual ~CTDirectGdiStepBase();
+ CTDirectGdiStepBase();
+ void SetTargetL(TUidPixelFormat aPixelFormat, const TContextTestCase aCase = EOneContextOneTarget, const TSize& aSize=KDefaultOffScreenImageSizeInPixels);
+ void ConvertPixelFormats(TPtrC aPixelFormatInput, RArray<TUidPixelFormat>& aPixelFormatArray);
+ void CreateFileName(TTestParams& aParams, TDes& aTestName, TPtrC& aTestCaseName, TDesC* namePostfix = NULL);
+ void DisplayTargetImageL(TUidPixelFormat aPixelFormat);
+ void DisplayTargetImageL(TUidPixelFormat aPixelFormat, CTImageTarget* aGdiTarget);
+ TInt WriteTargetOutput(TTestParams& aParams, TPtrC aTestCaseName, TDesC* namePostfix = NULL);
+ TInt WriteTargetOutput(TTestParams& aParams, TPtrC aTestCaseName, CTImageTarget* aImageTarget, TDesC* namePostfix = NULL);
+ void ResetGc();
+ CFbsBitmap* CreateConcentricRectsBitmapL(TUidPixelFormat aPixelFormat, const TSize& aSize);
+ CFbsBitmap* CreateCheckedBoardBitmapL(TUidPixelFormat aPixelFormat,
+ const TSize& aSize, const TSize& aChecksPerAxis = TSize(10, 10), TBool aGenAlpha = EFalse);
+ CFbsBitmap* CreateBlackWhiteBitmapL(TUidPixelFormat aPixelFormat,
+ const TSize& aSize, const TSize& aChecksPerAxis = TSize(10, 10));
+ CFbsBitmap* CreateMaskingPixmapL (TUidPixelFormat aPixelFormat, const TSize& aSize);
+ CFont* GetFont();
+ void ReleaseFont(CFont* aFont);
+ TBool TestTargetL(const TRgb& aColour);
+ void CheckErrorsL(TInt aDirectGdiErrorCode, TInt aBitGdiErrorCode, const TText8* aFile, TInt aLine);
+
+protected:
+ // From CTestStep
+ virtual TVerdict doTestStepPreambleL();
+ virtual TVerdict doTestStepPostambleL();
+ virtual void testBooleanTrue(TBool aCondition, const TText8* aFile, TInt aLine);
+ virtual void testBooleanTrueL(TBool aCondition, const TText8* aFile, TInt aLine);
+ virtual void testBooleanTrueWithErrorCode(TBool aCondition, TInt aErrorCode, const TText8* aFile, TInt aLine);
+ virtual void testBooleanTrueWithErrorCodeL(TBool aCondition, TInt aErrorCode, const TText8* aFile, TInt aLine);
+ // Functions specific to CTDirectGdiStepBase (and derived classes)
+ virtual void RunTestsL() = 0;
+ void RunOomTestsL();
+ static void ResetCache(TAny* aPtr);
+ static void ResetPenSize(TAny* aPtr);
+
+protected:
+ CTContextBase* iGc;
+ CTContextBase* iGc2;
+ CTImageTarget* iGdiTarget;
+ CTImageTarget* iGdiTarget2;
+ TBool iMakeRefImg; // switch on (ETrue) and off the control of generating reference images, from .ini file
+ TBool iUseDirectGdi; // switch on (ETrue) and off the control of using Directgdi or old bitgdi, from .ini file
+ RArray<TUidPixelFormat> iTargetPixelFormatArray; // target pixel format(s) for testing
+ RArray<TUidPixelFormat> iSourcePixelFormatArray; // source pixel format(s) for testing
+ RArray<TUidPixelFormat> iSourceResourcePixelFormatArray; // source resource pixel format(s) for testing (for DrawResource)
+ TTestParams iTestParams; // Parameters used for testing in derived classes
+ TBool iDoOomTests; // switch on (ETrue) and off whether out of memory tests are run, from .ini file
+ TBool iRunningOomTests; // ETrue if out of memory tests are running
+
+ CFbsTypefaceStore* iFontStore;
+ TInt iFontId;
+ MVgImageCache* iVgImageCache;
+ TBool iUseSwDirectGdi; // ETrue if software DirectGDI is being used
+private:
+ CActiveScheduler* iScheduler;
+ };
+
+// Macros to automatically test error condition and report when test fails.
+// Essentially same as TESTE(a,b) MACRO that base class uses, except error to check is also error that is reported.
+#define TESTNOERROR(a) \
+ {\
+ TInt b = a;\
+ TBool c = (b == KErrNone);\
+ testBooleanTrueWithErrorCode((c), (b), (TText8*)__FILE__, __LINE__);\
+ }
+
+#define TESTNOERRORL(a) \
+ {\
+ TInt b = a;\
+ TBool c = (b == KErrNone);\
+ testBooleanTrueWithErrorCodeL((c), (b), (TText8*)__FILE__, __LINE__);\
+ }
+
+#define TESTWITHFILENAMEANDLINENUMBERL(a, f, l) \
+ {\
+ testBooleanTrueL((a), f, l); \
+ }
+
+/**
+Gets the size of the hardware display in pixels
+@return TSize object containing the screen size
+*/
+inline TSize GetDisplaySizeInPixels()
+ {
+ return TSize(150, 150);
+ }
+
+#endif