graphicsdeviceinterface/screendriver/tsrc/TScdvScaling.cpp
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// Copyright (c) 2004-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:
//

#include <e32math.h>
#include <hal.h>
#include <bitdraw.h>
#include <bitdrawscaling.h>
#include <bitdraworigin.h>
#include <bitdrawinterfaceid.h>
#include <graphics/gdi/gdiconsts.h>
#include "TScdvScaling.h"



//Test line properties: 
//[iX, iY] - the starting point of the line
//iLength - line length
struct TLineProps
	{
	TInt iX;
	TInt iY;
	TInt iLength;
	};
//
//Constants
//
//This structure defines [TDrawMode <-> clear screen color value] relation
//When the test uses KDrawMode[i].iDrawMode, then the screen will be cleared using
//KDrawMode[i].iClearColorVal value
struct TDrawModeProps
	{
	CGraphicsContext::TDrawMode iDrawMode;
	// keep the color value 8-bit in both EColor256 and EColor64K, special care need
	// to be done when filling the buffer, e.g color=0x55 
	// in EColor256 clearing means filling 0x55 0x55 0x55 etc, but
	// in EColor64K it has to be 0x0055 0x0055 0x0055 etc
	TUint8 iClearColorVal;
	};
const TDrawModeProps KDrawMode[] = 
	{
		{CGraphicsContext::EDrawModePEN,		0xFF},
		{CGraphicsContext::EDrawModeAND,		0x37},
		{CGraphicsContext::EDrawModeXOR,		0x38},
		{CGraphicsContext::EDrawModeOR,			0xB1},
		{CGraphicsContext::EDrawModeNOTSCREEN,	0xC0},
		{CGraphicsContext::EDrawModeNOTPEN,		0x1D}
	};
const TInt KDrawModesCnt = sizeof(KDrawMode) / sizeof(KDrawMode[0]);
//Shadow/Fade modes
const CFbsDrawDevice::TShadowMode KShadowMode[] = 
	{
	CFbsDrawDevice::EShadow,
	CFbsDrawDevice::EFade,
	CFbsDrawDevice::EShadowFade
	};
const TInt KShadowModesCnt = sizeof(KShadowMode) / sizeof(KShadowMode[0]);
//Test pixel color value
const TUint8 KTestColorVal = 0x55;
//All possible orientations
const CFbsDrawDevice::TOrientation KOrientation[] = 
	{
	CFbsDrawDevice::EOrientationNormal,
	CFbsDrawDevice::EOrientationRotated90,
	CFbsDrawDevice::EOrientationRotated180,
	CFbsDrawDevice::EOrientationRotated270
	};
const TInt KOrientationsCnt = sizeof(KOrientation) / sizeof(KOrientation[0]);
//Width and Height of legacy application screen
const TInt KLegacyAppSizeWidth = 60;
const TInt KLegacyAppSizeHeight = 40;
//Scaling factors: X and Y
const TInt KScalingFactorX = 3;
const TInt KScalingFactorY = 2;
const TInt KMaxScalingFactor = 3;		//Max of previous 2 values

//
//Declarations
//
GLDEF_C TInt ByteSize(TDisplayMode aDisplayMode,TInt aWidth)
	{
	TInt wordSize=aWidth;
	switch(aDisplayMode)
		{
		case EGray2:
			wordSize = (wordSize + 31) / 32;
			break;
		case EGray4:
			wordSize = (wordSize + 15) / 16;
			break;
		case EGray16:
		case EColor16:
			wordSize = (wordSize + 7) / 8;
			break;
		case EGray256:
		case EColor256:
			wordSize = (wordSize + 3) / 4;
			break;
		case EColor4K:
		case EColor64K:
			wordSize = (wordSize + 1) / 2;
			break;
		case EColor16M:
			wordSize = ((wordSize + 3) / 4) * 3;
			break;
		case EColor16MU:
		case EColor16MA:
			//Doesn't need changing
			break;
		default:
			break;
		};
	return wordSize * 4;
	}

static inline TInt ByteSize(TDisplayMode aDisplayMode, TSize aSize)
	{
	return ByteSize(aDisplayMode,aSize.iWidth) * aSize.iHeight;
	}

template <class TPixelType> 
inline void MemFill(TPixelType* aBuffer, TInt aSize, TPixelType aValue)
	{
	TPixelType* p = aBuffer;
	TInt i = 0;
	while (i++<aSize)
		*p++ = aValue;
	}
	
//Generic test class for both Color256 and Color64K
template <class TPixelType> class CTScaling: public CTGraphicsBase
	{
public:
	CTScaling(CTestStep *aTest, TDisplayMode aDisplayMode);
	~CTScaling();
	void RunTestCaseL(TInt aCurTestCase);
private:
	void ConstructL();
	void CreateScreenDeviceL();
	void SetScalingSettings(const TPoint& aOrigin, TInt aFx, TInt aFy, TInt aDivX, TInt aDivY);
	void CheckLine(const TLineProps& aLineProps, const TPoint& aOrg, const TDrawModeProps& aDrawModeProps, TPixelType aClearColorValue);
	void CheckWriteRgbMulti(const TRect& aRcProps, const TPoint& aOrg, const TDrawModeProps& aDrawModeProps, TPixelType aClearColorValue);
	void CheckRgbAlphaLine(const TLineProps& aLineProps, const TPoint& aOrg, TPixelType aClearColorValue);
	void CheckRect(const TRect& aRc, const TPoint& aOrg, TPixelType aClearColorValue);
	void WriteLine();
	void ClearScreen(const TDrawModeProps& aDrawModeProps);
	void SetTestData();
	void CheckChangedPixels(TInt aChangedPixelsCnt, TPixelType aClearColorVal);
	void CheckWriteBinary(const TPoint& aPt, const TPoint& aOrg, TPixelType aClearColorValue, TInt aLength, TInt aHeight);
	void CheckVertLine(const TLineProps& aLineProps, const TPoint& aOrg, TPixelType aClearColorValue);
	void WriteRgb();
	void WriteRgbMulti();
	void WriteRgbAlphaLine();
	void WriteBinary();
	void WriteBinaryLineVertical();
	void WriteBinaryLine();
	void WriteRgbAlphaMulti();
	void ShadowArea();
	void WriteRgbAlphaLine2();
	void TestScalingSettingsInterface();
	void PerformanceTest();
private:
	//Test data array
	TPixelType iTestData[KLegacyAppSizeWidth];
	//The device used in the tests
	CFbsDrawDevice* iDrawDevice;
	//Width and Height of the screen
	TSize iPhysSize;
	//The test allocates block of memory for a screen with PhysSize size 
	//mode. iBits will point to the allocated memory block.
	TPixelType* iBits;
	TDisplayMode iDisplayMode;
	//The scaling interface
	MScalingSettings* iScalingSettings;
	//The origin interface
	MDrawDeviceOrigin* iOriginInterface;
	TInt iCurOrientation;
	TInt iScalingFactorX;
	TInt iScalingFactorY;
	};
typedef CTScaling<TUint8> CTestNone;
typedef CTScaling<TUint8> CTestColor256;
typedef CTScaling<TUint16> CTestColor64K;



//
//Test code
//
/*template <class TPixelType>
CTScaling<TPixelType>* CTScaling<TPixelType>::NewL(TDisplayMode aDisplayMode)	
	{
	CTScaling<TPixelType>* self = new (ELeave) CTScaling<TPixelType>;
	CleanupStack::PushL(self);
	self->ConstructL(aDisplayMode);
	CleanupStack::Pop(self);
	return self;
	}
*/	

template <class TPixelType>
CTScaling<TPixelType>::CTScaling(CTestStep *aTest, TDisplayMode aDisplayMode) :
				CTGraphicsBase(aTest),
				iDisplayMode(aDisplayMode)
	{
	INFO_PRINTF1(_L("Scaling tests"));
	}
	

template <class TPixelType>
void CTScaling<TPixelType>::ConstructL()	
	{
	CreateScreenDeviceL();
	}
	
template <class TPixelType>
CTScaling<TPixelType>::~CTScaling()
	{
	((CTScalingStep*)iStep)->CloseTMSGraphicsStep();
	delete[] iBits;
	delete iDrawDevice;	
	}
	
template <class TPixelType>
void CTScaling<TPixelType>::SetScalingSettings(const TPoint& aOrigin, TInt aFx, TInt aFy, TInt aDivX, TInt aDivY)
	{
	TEST(iDrawDevice != NULL);	
	if(!iScalingSettings)
		{
		TInt err = iDrawDevice->GetInterface(KScalingSettingsInterfaceID, 
											  reinterpret_cast <TAny*&> (iScalingSettings));
		TEST2(err, KErrNone);
		}
	TEST(iScalingSettings != NULL);
	TInt err = iScalingSettings->Set(aFx, aFy, aDivX, aDivY);
	TEST2(err, KErrNone);
	if(!iOriginInterface)
		{
		TInt err = iDrawDevice->GetInterface(KDrawDeviceOriginInterfaceID, 
											  reinterpret_cast <TAny*&> (iOriginInterface));
		TEST2(err, KErrNone);
		}
	TEST(iOriginInterface != NULL);
	err = iOriginInterface->Set(aOrigin);
	TEST2(err, KErrNone);
	}

//Clears the screen initializing each screen pixel with aDrawModeProps.iClearColorVal value
template <class TPixelType>
void CTScaling<TPixelType>::ClearScreen(const TDrawModeProps& aDrawModeProps)
	{
	::MemFill(iBits, ::ByteSize(EColor256, iPhysSize), TPixelType(aDrawModeProps.iClearColorVal));
	}

//Initializes iTestData array with KTestColorVal value
template <class TPixelType>
void CTScaling<TPixelType>::SetTestData()
	{
	::MemFill(iTestData, KLegacyAppSizeWidth, TPixelType(KTestColorVal));
	}

template <class TPixelType>
void CTScaling<TPixelType>::CheckChangedPixels(TInt aChangedPixelsCnt, TPixelType aClearColorVal)
	{
	const TInt KByteSize = ::ByteSize(EColor256, iPhysSize);
	TInt changedPixelsCnt = 0;
	for(TInt ii=0;ii<KByteSize;++ii)
		{
		if(iBits[ii]!=aClearColorVal)
			{
			++changedPixelsCnt;
			}
		}
	TEST(changedPixelsCnt == aChangedPixelsCnt);
	if (changedPixelsCnt!=aChangedPixelsCnt)
		{
		_LIT(KLog,"Wrong number of changed pixels, expected=%d, actual=%d, color=0x%x");
		INFO_PRINTF4(KLog,aChangedPixelsCnt,changedPixelsCnt,aClearColorVal);
		}
	}

//Checks a set of horisontal lines , which starting point is 
//[aOrg.iX + aLineProps.iX * iScalingFactorX, aOrg.iY + aLineProps.iY * iScalingFactorY]
//and length is aLineProps.iLength * iScalingFactorX. For each nexh line y-coordinate
//is incremented by 1.
//The screen lines pixel values are tested against aClearColorValue value.
//Then the screen is testsed pixel by pixel that nothing is written outside the tested lines.
template <class TPixelType>
void CTScaling<TPixelType>::CheckLine(const TLineProps& aLineProps, 
					  const TPoint& aOrg, 
					  const TDrawModeProps& aDrawModeProps, 
					  TPixelType aClearColorValue)
	{
	TPixelType data[KLegacyAppSizeWidth * KMaxScalingFactor];
	TInt ii;
	for(ii=0;ii<iScalingFactorY;++ii)
		{
		Mem::Fill(data, sizeof(data), 0x00);
		iDrawDevice->ReadLine(aOrg.iX + aLineProps.iX * iScalingFactorX, 
							   aOrg.iY + aLineProps.iY * iScalingFactorY + ii, 
							   aLineProps.iLength * iScalingFactorX, 
							   data, 
							   iDisplayMode);
		const TInt length=aLineProps.iLength*iScalingFactorX;
		TInt firstErr=length;
		TInt numErrs=0;
		for(TInt jj=0;jj<length;++jj)
			{
			//TEST(data[jj]!=aClearColorValue);
			if (data[jj]==aClearColorValue)
				{
				++numErrs;
				if (jj<firstErr)
					firstErr=jj;
				}
			}
		TEST(numErrs==0);
		if (numErrs>0)
			{
			_LIT(KLog,"Line %d (of %d) of length %d has %d errors first one at %d,  ClearCol=0x%x");
			INFO_PRINTF7(KLog,ii,iScalingFactorY,length,numErrs,firstErr,aClearColorValue);
			}
		}
	TInt changedPixelsCnt = iScalingFactorY * aLineProps.iLength * iScalingFactorX;
	CheckChangedPixels(changedPixelsCnt, aDrawModeProps.iClearColorVal);
	}

//Checks the rectangle filled using CFbsScreenDevice::WriteRgbMulti. 
//The screen lines pixel values are tested against aClearColorValue value.
//Then the screen is testsed pixel by pixel that nothing is written outside the tested rectangle.
template <class TPixelType>
void CTScaling<TPixelType>::CheckWriteRgbMulti(const TRect& aRcProps, 
							   const TPoint& aOrg, 
							   const TDrawModeProps& aDrawModeProps, 
							   TPixelType aClearColorValue)
	{
	TPixelType data[KLegacyAppSizeWidth * KMaxScalingFactor];
	TInt ii;
	TInt xx = aOrg.iX + aRcProps.iTl.iX * iScalingFactorX;
	TInt yy = aOrg.iY + aRcProps.iTl.iY * iScalingFactorY;
	for(ii=0;ii<(iScalingFactorY * aRcProps.Height());++ii)
		{
		Mem::Fill(data, sizeof(data), 0x00);
		iDrawDevice->ReadLine(xx, yy+ii, aRcProps.Width()*iScalingFactorX, data, iDisplayMode);
		const TInt width=aRcProps.Width()*iScalingFactorX;
		TInt firstErr=width;
		TInt numErrs=0;
		for(TInt jj=0;jj<width;++jj)
			{
			//TEST(data[jj]!=aClearColorValue);
			if (data[jj]==aClearColorValue)
				{
				++numErrs;
				if (jj<firstErr)
					firstErr=jj;
				}
			}
		TEST(numErrs==0);
		if (numErrs>0)
			{
			_LIT(KLog,"Line %d of width %d has %d errors first one at %d,  ClearCol=0x%x");
			INFO_PRINTF6(KLog,ii,width,numErrs,firstErr,aClearColorValue);
			}
		}
	TInt changedPixelsCnt = iScalingFactorY * aRcProps.Width() * aRcProps.Height() * iScalingFactorX;
	CheckChangedPixels(changedPixelsCnt, aDrawModeProps.iClearColorVal);
	}

//Checks a set of horisontal lines , which starting point is 
//[aOrg.iX + aLineProps.iX * iScalingFactorX, aOrg.iY + aLineProps.iY * iScalingFactorY]
//and length is aLineProps.iLength * iScalingFactorX. For each nexh line y-coordinate
//is incremented by 1.
//The screen lines pixel values are tested against aClearColorValue value.
//Then the screen is testsed pixel by pixel that nothing is written outside the tested lines.
template <class TPixelType>
void CTScaling<TPixelType>::CheckRgbAlphaLine(const TLineProps& aLineProps, 
							  const TPoint& aOrg, 
							  TPixelType aClearColorValue)
	{
	TPixelType data[KLegacyAppSizeWidth * KMaxScalingFactor];
	for(TInt ii=0;ii<iScalingFactorY;++ii)
		{
		Mem::Fill(data, sizeof(data), 0x00);
		iDrawDevice->ReadLine(aOrg.iX + aLineProps.iX * iScalingFactorX, 
							   aOrg.iY + aLineProps.iY * iScalingFactorY + ii, 
							   aLineProps.iLength * iScalingFactorX, 
							   data, 
							   iDisplayMode);
		const TInt length=aLineProps.iLength*iScalingFactorX;
		TInt firstErr=length;
		TInt numErrs=0;
		for(TInt jj=0;jj<(aLineProps.iLength * iScalingFactorX);++jj)
			{
			//TEST(data[jj]!=aClearColorValue);
			if (data[jj]==aClearColorValue)
				{
				++numErrs;
				if (jj<firstErr)
					firstErr=jj;
				}
			}
		TEST(numErrs==0);
		if (numErrs>0)
			{
			_LIT(KLog,"Line %d of length %d has %d errors first one at %d,  ClearCol=0x%x");
			INFO_PRINTF6(KLog,ii,length,numErrs,firstErr,aClearColorValue);
			}
		}
	TInt changedPixelsCnt = iScalingFactorY * aLineProps.iLength * iScalingFactorX;
	CheckChangedPixels(changedPixelsCnt, aClearColorValue);
	}

//Checks the rectangle filled using CFbsScreenDevice::WriteBinary. 
//The screen lines pixel values are tested against aClearColorValue value.
//Then the screen is testsed pixel by pixel that nothing is written outside the tested rectangle.
template <class TPixelType>
void CTScaling<TPixelType>::CheckWriteBinary(const TPoint& aPt, 
							 const TPoint& aOrg, 
							 TPixelType aClearColorValue, 
							 TInt aLength, TInt aHeight)
	{
	TPixelType data[KLegacyAppSizeWidth * KMaxScalingFactor];
	TInt ii;
	TInt xx = aOrg.iX + aPt.iX * iScalingFactorX;
	TInt yy = aOrg.iY + aPt.iY * iScalingFactorY;
	for(ii=0;ii<(iScalingFactorY * aHeight);++ii)
		{
		Mem::Fill(data, sizeof(data), 0x00);
		iDrawDevice->ReadLine(xx, yy + ii, aLength * iScalingFactorX, data, iDisplayMode);
		const TInt length=aLength*iScalingFactorX;
		TInt firstErr=length;
		TInt numErrs=0;
		for(TInt jj=0;jj<length;++jj)
			{
			//TEST(data[jj] != aClearColorValue);
			if (data[jj]==aClearColorValue)
				{
				++numErrs;
				if (jj<firstErr)
					firstErr=jj;
				}
			}
		TEST(numErrs==0);
		if (numErrs>0)
			{
			_LIT(KLog,"Line %d of length %d has %d errors first one at %d,  ClearCol=0x%x");
			INFO_PRINTF6(KLog,ii,length,numErrs,firstErr,aClearColorValue);
			}
		}
	TInt changedPixelsCnt = iScalingFactorY * aLength * aHeight * iScalingFactorX;
	CheckChangedPixels(changedPixelsCnt, aClearColorValue);
	}

//Checks a set of vertical lines , which starting point is 
//[aOrg.iX + aLineProps.iX * iScalingFactorX, aOrg.iY + aLineProps.iY * iScalingFactorY]
//and length is aLineProps.iLength * iScalingFactorX. For each nexh line y-coordinate
//is incremented by 1.
//The screen lines pixel values are tested against aClearColorValue value.
//Then the screen is testsed pixel by pixel that nothing is written outside the tested lines.
template <class TPixelType>
void CTScaling<TPixelType>::CheckVertLine(const TLineProps& aLineProps, const TPoint& aOrg, TPixelType aClearColorValue)
	{
	TInt x = aOrg.iX + aLineProps.iX * iScalingFactorX;
	TInt y = aOrg.iY + aLineProps.iY * iScalingFactorY;
	for(TInt i=0;i<iScalingFactorX;++i)
		{
		for(TInt j=0;j<(aLineProps.iLength * iScalingFactorY);++j)
			{
			TRgb val = iDrawDevice->ReadPixel(x + i, y + j);				   
			switch (iDisplayMode)
				{
				case EColor64K:
				TEST(val.Color64K() != aClearColorValue);
				break;
				
				case EColor256:
				TEST(val.Color256() != aClearColorValue);
				break;
				
				default:
				TEST(EFalse);
				}
			}
		}
	TInt changedPixelsCnt = iScalingFactorX * aLineProps.iLength * iScalingFactorY;
	CheckChangedPixels(changedPixelsCnt, aClearColorValue);
	}

//Checks the rectangle filled using CFbsScreenDevice::ShadowArea
//The screen lines pixel values are tested against aClearColorValue value.
//Then the screen is testsed pixel by pixel that nothing is written outside the tested rectangle.
template <class TPixelType>
void CTScaling<TPixelType>::CheckRect(const TRect& aRc, const TPoint& aOrg, TPixelType aClearColorValue)
	{
	TPixelType data[KLegacyAppSizeWidth * KMaxScalingFactor];
	TInt i;
	TInt x = aOrg.iX + aRc.iTl.iX * iScalingFactorX;
	TInt y = aOrg.iY + aRc.iTl.iY * iScalingFactorY;
	for(i=0;i<(iScalingFactorY * aRc.Height());++i)
		{
		Mem::Fill(data, sizeof(data), 0x00);
		iDrawDevice->ReadLine(x, y + i, aRc.Width() * iScalingFactorX, data, iDisplayMode);
		for(TInt j=0;j<(aRc.Width() * iScalingFactorX);++j)
			{
			TEST(data[j] != aClearColorValue);
			}
		}
	TInt changedPixelsCnt = iScalingFactorY * aRc.Width() * aRc.Height() * iScalingFactorX;
	CheckChangedPixels(changedPixelsCnt, aClearColorValue);
	}

//CFbsScreenDevice::WriteLine() and CFbsScreenDevice::ReadLine() test.
//(Set of test lines) X (Set of origins) X (Set of drawing modes) number of test cases.
template <class TPixelType>
void CTScaling<TPixelType>::WriteLine()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteLine"));

	TLineProps lineProps[] = 
		{
		{0, 0, KLegacyAppSizeWidth - 1}, 
		{0, KLegacyAppSizeHeight - 1, KLegacyAppSizeWidth - 1},
		{10, 20, KLegacyAppSizeWidth / 2},
		{-2, -5, 20},
		{-3, 1, 21},
		{2, -2, 11},
		{0, -4, 31},
		{-1, 11, 11}
		};
	const TInt KLinesCnt = sizeof(lineProps) / sizeof(lineProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(13, 21),
		TPoint(10, 17)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt ll=0;ll<KOriginsCnt;++ll)
		{
		for(TInt line=0;line<KLinesCnt;++line)
			{
			for(TInt kk=0;kk<KDrawModesCnt;++kk)
				{
				ClearScreen(KDrawMode[kk]);
				SetTestData();
				SetScalingSettings(ptOrg[ll], KScalingFactorX, KScalingFactorY, 1, 1);
				iDrawDevice->WriteLine(lineProps[line].iX, lineProps[line].iY,
									  lineProps[line].iLength, 
									  reinterpret_cast <TUint32*> (iTestData), 
									  KDrawMode[kk].iDrawMode);
				if(KDrawMode[kk].iDrawMode == CGraphicsContext::EDrawModePEN)
					{
					TPixelType writtenData[KLegacyAppSizeWidth];
					Mem::FillZ(writtenData, sizeof(writtenData));
					iDrawDevice->ReadLine(lineProps[line].iX, lineProps[line].iY,
										   lineProps[line].iLength, 
										   writtenData, iDisplayMode);
					for(TInt ii=0;ii<lineProps[line].iLength;++ii)
						{
						TEST(writtenData[ii] == iTestData[ii]);
						}
					}
				SetScalingSettings(TPoint(), 1, 1, 1, 1);
				CheckLine(lineProps[line], ptOrg[ll], KDrawMode[kk], KDrawMode[kk].iClearColorVal);
				}
			}
		}
	}

//CFbsScreenDevice::WriteRgb() and CFbsScreenDevice::ReadPixel() test.
//(Set of test points) X (Set of origins) X (Set of drawing modes) number of test cases.
template <class TPixelType>
void CTScaling<TPixelType>::WriteRgb()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteRgb"));

	TPoint pt[] = 
		{
		TPoint(0, 0), 
		TPoint(KLegacyAppSizeWidth - 1, 0), 
		TPoint(0, KLegacyAppSizeHeight - 1), 
		TPoint(KLegacyAppSizeWidth - 1, KLegacyAppSizeHeight - 1),
		TPoint(KLegacyAppSizeWidth / 2, KLegacyAppSizeHeight / 2),
		TPoint(-2, -3), 
		TPoint(0, -1),
		TPoint(-3, 0)
		};
	const TInt KPointsCnt = sizeof(pt) / sizeof(pt[0]);
	TPoint ptOrg[] = 
		{
		TPoint(9, 22),
		TPoint(17, 11)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KPointsCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				TRgb val(KTestColorVal);
				iDrawDevice->WriteRgb(pt[i].iX, pt[i].iY, val, KDrawMode[k].iDrawMode);
				if(KDrawMode[k].iDrawMode == CGraphicsContext::EDrawModePEN)
					{
					TRgb writtenVal = iDrawDevice->ReadPixel(pt[i].iX, pt[i].iY);
					switch (iDisplayMode)
						{
						case EColor64K:
						TEST(writtenVal == TRgb::Color64K(val.Color64K()));
						break;
						
						case EColor256:
						TEST(writtenVal == val);
						break;
						
						default:
						TEST(EFalse);
						}
					}
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				TLineProps props;
				props.iX = pt[i].iX;
				props.iY = pt[i].iY;
				props.iLength = 1;
				CheckLine(props, ptOrg[l], KDrawMode[k], KDrawMode[k].iClearColorVal);
				}
			}
		}
	}

//CFbsScreenDevice::WriteRgbMulti() test.
template <class TPixelType>
void CTScaling<TPixelType>::WriteRgbMulti()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteRgbMulti"));

	TRect rcProps[] =
		{
		TRect(TPoint(0, 0), TSize(KLegacyAppSizeWidth - 1, KLegacyAppSizeHeight - 1)), 
		TRect(TPoint(17, 11), TSize(KLegacyAppSizeWidth / 2, KLegacyAppSizeHeight / 2)),
		TRect(TPoint(-1, -4), TSize(31, 12)), 
		TRect(TPoint(-3, -1), TSize(11, 11)), 
		TRect(TPoint(0, -2), TSize(6, 17))
		};
	const TInt KRcCnt = sizeof(rcProps) / sizeof(rcProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(21, 29),
		TPoint(12, 14)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KRcCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetTestData();
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				TRgb val(KTestColorVal);
				iDrawDevice->WriteRgbMulti(rcProps[i].iTl.iX, rcProps[i].iTl.iY,
									  rcProps[i].Width(), rcProps[i].Height(),
									  val, 
									  KDrawMode[k].iDrawMode);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckWriteRgbMulti(rcProps[i], ptOrg[l], KDrawMode[k], KDrawMode[k].iClearColorVal);
				}
			}
		}
	}

//CFbsScreenDevice::WriteRgbAlphaLine() test.
//(Set of test lines) X (Set of origins) X (Set of drawing modes) number of test cases.
template <class TPixelType>
void CTScaling<TPixelType>::WriteRgbAlphaLine()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteRgbAlphaLine"));

	TLineProps lineProps[] = 
		{
		{0, 0, KLegacyAppSizeWidth - 1}, 
		{0, KLegacyAppSizeHeight - 1, KLegacyAppSizeWidth - 1},
		{17, 3, KLegacyAppSizeWidth / 2},
		{-1, -2, 11},
		{-4, -5, 1},
		{0, -1, 3},
		{1, -3, 7}
		};
	const TInt KLinesCnt = sizeof(lineProps) / sizeof(lineProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(19, 17),
		TPoint(29, 25)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KLinesCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				TUint8 rgbBuff[KLegacyAppSizeWidth * 3];
				Mem::Fill(rgbBuff, sizeof(rgbBuff), KTestColorVal);
				TUint8 maskBuff[KLegacyAppSizeWidth];
				TUint8 maskChar = 0xF1;
				Mem::Fill(maskBuff, sizeof(maskBuff), maskChar);
				iDrawDevice->WriteRgbAlphaLine(lineProps[i].iX, lineProps[i].iY,
									  lineProps[i].iLength, rgbBuff, maskBuff, CGraphicsContext::EDrawModePEN);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckRgbAlphaLine(lineProps[i], ptOrg[l], KDrawMode[k].iClearColorVal);
				}
			}
		}
	}

//CFbsScreenDevice::WriteBinary() test.
template <class TPixelType>
void CTScaling<TPixelType>::WriteBinary()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteBinary"));

	TPoint pt[] =
		{
		TPoint(0, 0), 
		TPoint(27, 19),
		TPoint(-4, -4),
		TPoint(-1, -2),
		TPoint(-1, -2),
		TPoint(5, -5),
		TPoint(-5, 0)
		};
	const TInt KPtCnt = sizeof(pt) / sizeof(pt[0]);
	TPoint ptOrg[] = 
		{
		TPoint(19, 24),
		TPoint(29, 26)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KPtCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetTestData();
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				const TInt KHeight = 5;
				const TInt KLength = 11;
				TUint32 buff[KHeight];
				TUint32 buffChar = 0xFFFFFFFF;
				for(TInt ooo=0;ooo<KHeight;++ooo)
					{
					buff[ooo] = buffChar;
					}
				TRgb val(KTestColorVal);
				iDrawDevice->WriteBinary(pt[i].iX, pt[i].iY, buff, KLength, KHeight,
										  val, KDrawMode[k].iDrawMode);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckWriteBinary(pt[i], ptOrg[l], KDrawMode[k].iClearColorVal, KLength, KHeight);
				}
			}
		}
	}

//CFbsScreenDevice::WriteBinaryLineVertical() test.
template <class TPixelType>
void CTScaling<TPixelType>::WriteBinaryLineVertical()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteBinaryLineVertical"));

	TLineProps lineProps[] = 
		{
		{0, 0, KLegacyAppSizeHeight - 1}, 
		{KLegacyAppSizeWidth - 1, 0, KLegacyAppSizeHeight - 1},
		{17, 3, 23},
		{-2, -5, 10},
		{-6, 24, 11},
		{18, -6, 12},
		{0, -3, 13},
		{-1, 0, 14}
		};
	const TInt KLinesCnt = sizeof(lineProps) / sizeof(lineProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(22, 22),
		TPoint(19, 20)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KLinesCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetTestData();
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				const TInt KLength = 30;
				TUint32 buff[KLength];
				TUint32 buffChar = 0xFFFFFFFF;
				for(TInt ooo=0;ooo<KLength;++ooo)
					{
					buff[ooo] = buffChar;
					}
				TRgb val(KTestColorVal);
				iDrawDevice->WriteBinaryLineVertical(lineProps[i].iX, lineProps[i].iY,
													  buff, lineProps[i].iLength, val, 
													  KDrawMode[k].iDrawMode, EFalse);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckVertLine(lineProps[i], ptOrg[l], KDrawMode[k].iClearColorVal);
				}
			}
		}
	}

//CFbsScreenDevice::WriteBinaryLine() test.
template <class TPixelType>
void CTScaling<TPixelType>::WriteBinaryLine()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteBinaryLiine"));

	TPoint pt[] =
		{
		TPoint(0, 0), 
		TPoint(1, 7),
		TPoint(18, -8),
		TPoint(-7, 26),
		TPoint(-4, -7),
		TPoint(0, -2),
		TPoint(34, -1),
		TPoint(-1, 17)
		};
	const TInt KPtCnt = sizeof(pt) / sizeof(pt[0]);
	TPoint ptOrg[] = 
		{
		TPoint(21, 35),
		TPoint(40, 28)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KPtCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetTestData();
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				const TInt KHeight = 1;
				const TInt KLength = 11;
				TUint32 buff[KHeight];
				TUint32 buffChar = 0xFFFFFFFF;
				for(TInt ooo=0;ooo<KHeight;++ooo)
					{
					buff[ooo] = buffChar;
					}
				TRgb val(KTestColorVal);
				iDrawDevice->WriteBinaryLine(pt[i].iX, pt[i].iY, buff, KLength,
											  val, KDrawMode[k].iDrawMode);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckWriteBinary(pt[i], ptOrg[l], KDrawMode[k].iClearColorVal, KLength, KHeight);
				}
			}
		}
	}

//CFbsScreenDevice::WriteRgbAlphaMulti() test.
template <class TPixelType>
void CTScaling<TPixelType>::WriteRgbAlphaMulti()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteRgbAlphaMulti"));

	TLineProps lineProps[] = 
		{
		{0, 0, KLegacyAppSizeWidth - 1}, 
		{0, KLegacyAppSizeHeight - 1, KLegacyAppSizeWidth - 1},
		{17, 3, KLegacyAppSizeWidth / 2},
		{-8, -8, 11},
		{-3, 15, 12},
		{29, -4, 13},
		{0, -3, 14},
		{-5, 0, 15}
		};
	const TInt KLinesCnt = sizeof(lineProps) / sizeof(lineProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(24, 17),
		TPoint(27, 20)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KLinesCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetTestData();
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				TUint8 maskBuff[KLegacyAppSizeWidth];
				TUint8 maskChar = 0xF1;
				Mem::Fill(maskBuff, sizeof(maskBuff), maskChar);
				TRgb val(KTestColorVal);
				iDrawDevice->WriteRgbAlphaMulti(lineProps[i].iX, lineProps[i].iY,
												 lineProps[i].iLength, val, maskBuff);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckRgbAlphaLine(lineProps[i], ptOrg[l], KDrawMode[k].iClearColorVal);
				}
			}
		}
	}

//CFbsScreenDevice::ShadowArea() test.
template <class TPixelType>
void CTScaling<TPixelType>::ShadowArea()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::ShadowArea"));

	TRect rcProps[] =
		{
		TRect(TPoint(0, 0), TSize(KLegacyAppSizeWidth - 1, KLegacyAppSizeHeight - 1)), 
		TRect(TPoint(17, 11), TSize(KLegacyAppSizeWidth / 2, KLegacyAppSizeHeight / 2)),
		TRect(TPoint(-1, -1), TSize(1, 1)),
		TRect(TPoint(-4, -5), TSize(11, 8)),
		TRect(TPoint(0, -6), TSize(3, 23)),
		TRect(TPoint(-7, 0), TSize(24, 2)),
		TRect(TPoint(5, -2), TSize(8, 9)),
		TRect(TPoint(-4, 16), TSize(11, 8))
		};
	const TInt KRcCnt = sizeof(rcProps) / sizeof(rcProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(25, 24),
		TPoint(31, 29)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KRcCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				TDrawModeProps drawModeProps(KDrawMode[k]);
				--drawModeProps.iClearColorVal;//I want to avoid "255" clear color value.
				for(TInt m=0;m<KShadowModesCnt;++m)
					{
					iDrawDevice->SetShadowMode(KShadowMode[m]);
					ClearScreen(drawModeProps);
					SetTestData();
					SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
					iDrawDevice->ShadowArea(rcProps[i]);
					SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
					CheckRect(rcProps[i], ptOrg[l], drawModeProps.iClearColorVal);
					}
				}
			}
		}
	iDrawDevice->SetShadowMode(CFbsDrawDevice::ENoShadow);
	}

//CFbsScreenDevice::WriteRgbAlphaLine() test.
template <class TPixelType>
void CTScaling<TPixelType>::WriteRgbAlphaLine2()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice::WriteRgbAlphaLine-2"));

	TLineProps lineProps[] = 
		{
		{0, 0, KLegacyAppSizeWidth - 1}, 
		{0, KLegacyAppSizeHeight - 1, KLegacyAppSizeWidth - 1},
		{17, 3, KLegacyAppSizeWidth / 2},
		{-1, -7, 11},
		{0, -5, 12},
		{-3, 0, 13},
		{15, -7, 14},
		{-1, -7, 15},
		{-1, -7, 16}
		};
	const TInt KLinesCnt = sizeof(lineProps) / sizeof(lineProps[0]);
	TPoint ptOrg[] = 
		{
		TPoint(18, 28),
		TPoint(15, 15)
		};
	const TInt KOriginsCnt = sizeof(ptOrg) / sizeof(ptOrg[0]);
	for(TInt l=0;l<KOriginsCnt;++l)
		{
		for(TInt i=0;i<KLinesCnt;++i)
			{
			for(TInt k=0;k<KDrawModesCnt;++k)
				{
				ClearScreen(KDrawMode[k]);
				SetTestData();
				SetScalingSettings(ptOrg[l], KScalingFactorX, KScalingFactorY, 1, 1);
				TUint8 rgbBuff1[KLegacyAppSizeWidth * 3];
				TUint8 rgbBuff2[KLegacyAppSizeWidth * 3];
				Mem::Fill(rgbBuff1, sizeof(rgbBuff1), KTestColorVal - 15);
				Mem::Fill(rgbBuff2, sizeof(rgbBuff2), KTestColorVal + 22);
				TUint8 maskBuff[KLegacyAppSizeWidth];
				TUint8 maskChar = 0xF1;
				Mem::Fill(maskBuff, sizeof(maskBuff), maskChar);
				iDrawDevice->WriteRgbAlphaLine(lineProps[i].iX, lineProps[i].iY,
									  lineProps[i].iLength, rgbBuff1, rgbBuff2, maskBuff,
									  KDrawMode[k].iDrawMode);
				SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
				CheckRgbAlphaLine(lineProps[i], ptOrg[l], KDrawMode[k].iClearColorVal);
				}
			}
		}
	}

template <class TPixelType>
void CTScaling<TPixelType>::TestScalingSettingsInterface()
	{
	INFO_PRINTF1(_L("MScalingSettings functionality test"));
	TEST(iDrawDevice != NULL);	

	MScalingSettings* scalingSettings = NULL;
	TInt err = iDrawDevice->GetInterface(KScalingSettingsInterfaceID, 
										  reinterpret_cast <TAny*&> (scalingSettings));
	TEST2(err, KErrNone);
	TEST(scalingSettings != NULL);

	TEST(scalingSettings->IsScalingOff());

	const TInt factorXIn = 10, factorYIn = 13, divisorXIn = 1, divisorYIn = 1;
	TInt factorXOut = -1, factorYOut = -1, divisorXOut = -1, divisorYOut = -1;

	err = scalingSettings->Set(factorXIn, factorYIn, divisorXIn, divisorYIn);
	TEST2(err, KErrNone);
	TEST(!scalingSettings->IsScalingOff());
	scalingSettings->Get(factorXOut, factorYOut, divisorXOut, divisorYOut);

	TEST(factorXOut == factorXOut);
	TEST(factorYIn == factorYOut);
	TEST(divisorXIn == divisorXOut);
	TEST(divisorYIn == divisorYOut);

	MDrawDeviceOrigin* originInterface = NULL;
	err = iDrawDevice->GetInterface(KDrawDeviceOriginInterfaceID, 
									 reinterpret_cast <TAny*&> (originInterface));
	TEST2(err, KErrNone);
	TEST(originInterface != NULL);

	const TPoint ptOriginIn(20, 45);
	TPoint ptOriginOut;
	err = originInterface->Set(ptOriginIn);
	TEST2(err, KErrNone);
	originInterface->Get(ptOriginOut);
	TEST(ptOriginIn == ptOriginOut);

	SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);
	}

//Creates screen device and initializes ::DrawDevice global variable.
template <class TPixelType>
void CTScaling<TPixelType>::CreateScreenDeviceL()
	{
	if (iDisplayMode == ENone)
		return;
	
	TInt address = NULL;
	User::LeaveIfError(HAL::Get(KDefaultScreenNo, HALData::EDisplayMemoryAddress,address));
	User::LeaveIfError(HAL::Get(KDefaultScreenNo, HALData::EDisplayXPixels, iPhysSize.iWidth));
	User::LeaveIfError(HAL::Get(KDefaultScreenNo, HALData::EDisplayYPixels, iPhysSize.iHeight));
	__ASSERT_DEBUG(iPhysSize.iWidth > 0 && iPhysSize.iHeight > 0 && address != NULL, User::Invariant());

	TPckgBuf<TScreenInfoV01> info;
	info().iScreenAddressValid = ETrue;
	info().iScreenAddress = reinterpret_cast <void*> (address);
	info().iScreenSize = iPhysSize;

	iDrawDevice = CFbsDrawDevice::NewScreenDeviceL(info(), iDisplayMode);
	TestScalingSettingsInterface();
	iBits = new (ELeave) TPixelType[::ByteSize(EColor256, iPhysSize)];
	iDrawDevice->SetUserDisplayMode(iDisplayMode);
	iDrawDevice->SetAutoUpdate(EFalse);
	iDrawDevice->SetBits(iBits);
	

	}

template <class TPixelType>
void CTScaling<TPixelType>::PerformanceTest()
	{
	INFO_PRINTF1(_L("CFbsDrawDevice, scaling - WriteRgb() performance test"));

	const TInt KDrawingsCnt = 1000000;
	TInt i, x, y;

	TUint time1 = User::TickCount();
	x = y = 0;
	for(i=0;i<KDrawingsCnt;i++)
		{
		if(++x > 50)
			{
			x = 0;
			if(++y > 50)
				{
				y = 0;
				}
			}
		TRgb val(0x11, 0x12, i);
		iDrawDevice->WriteRgb(x, y, val, CGraphicsContext::EDrawModePEN);
		}
	time1 = User::TickCount() - time1;

	TPoint ptOrigin(5, 3);
	SetScalingSettings(ptOrigin, KScalingFactorX, KScalingFactorY, 1, 1);

	TUint time2 = User::TickCount();
	x = y = 0;
	for(i=0;i<KDrawingsCnt;i++)
		{
		if(++x > 50)
			{
			x = 0;
			if(++y > 50)
				{
				y = 0;
				}
			}
		TRgb val(0x11, 0x12, i);
		iDrawDevice->WriteRgb(x, y, val, CGraphicsContext::EDrawModePEN);
		}
	time2 = User::TickCount() - time2;

	SetScalingSettings(TPoint(0, 0), 1, 1, 1, 1);

	RDebug::Print(_L("Non-scaled device, time=%d\r\n"), time1);
	RDebug::Print(_L("Scaled device, time=%d\r\n"), time2);
	}

template <class TPixelType>
void CTScaling<TPixelType>::RunTestCaseL(TInt aCurTestCase)
	{
	// EColor64K and EColor256 is not supported, stop the test
	if (iDisplayMode == ENone)
		{
		INFO_PRINTF1(_L("EColor64K and EColor256 are not supported, The test is not run"));
		TestComplete();
		}
	
	else
		{
	    ((CTScalingStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
		switch(aCurTestCase)
			{
		case 1:
			{
			if(iCurOrientation >= KOrientationsCnt)
				{
				((CTScalingStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
				TestComplete();
				}
			else
				{
				((CTScalingStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
				if (iCurOrientation==CFbsDrawDevice::EOrientationRotated90 || iCurOrientation==CFbsDrawDevice::EOrientationRotated270)
					{
					iScalingFactorX=KScalingFactorY;
					iScalingFactorY=KScalingFactorX;
					}
				else
					{
					iScalingFactorX=KScalingFactorX;
					iScalingFactorY=KScalingFactorY;
					}
				INFO_PRINTF3(_L("Set scalling %d,%d"),iScalingFactorX,iScalingFactorY);
				if(iDrawDevice->SetOrientation(KOrientation[iCurOrientation]))
					{
					INFO_PRINTF2(_L("Set orientation: ===EOrientation%S==="),&RotationName(iCurOrientation));
					}
				else
					{
					INFO_PRINTF2(_L("Failed to set orientation: ===EOrientation%S==="),&RotationName(iCurOrientation));
					ResetCounter();
					}
				iCurOrientation++;
				}	
			}	
			break;
		case 2:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0022
*/
            ((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0022"));
			WriteLine();
			break;
		case 3:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0023
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0023"));
			WriteRgb();
			break;
		case 4:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0024
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0024"));
			WriteRgbMulti();
			break;
		case 5:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0025
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0025"));
			WriteRgbAlphaLine();
			break;
		case 6:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0026
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0026"));
			WriteBinary();
			break;
		case 7:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0027
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0027"));
			WriteBinaryLineVertical();
			break;
		case 8:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0028
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0028"));
			WriteBinaryLine();
			break;
		case 9:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0029
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0029"));
			WriteRgbAlphaMulti();
			break;
		case 10:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0030
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0030"));
			ShadowArea();
			break;
		case 11:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0031
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0031"));
			WriteRgbAlphaLine2();
			break;
		case 12:
/**
	@SYMTestCaseID GRAPHICS-SCREENDRIVER-0032
*/
			((CTScalingStep*)iStep)->SetTestStepID(_L("GRAPHICS-SCREENDRIVER-0032"));
			PerformanceTest();
			break;
		case 13:
			((CTScalingStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
			ResetCounter();
			break;
			}
           ((CTScalingStep*)iStep)->RecordTestResultL();
		}
	}
	
static TDisplayMode GetDisplayModeL()
	{
	TDisplayMode mode = EColor64K;
	CFbsDrawDevice* device = NULL;
	TRAPD(err, device = CFbsDrawDevice::NewScreenDeviceL(KDefaultScreenNo, mode));
	if (err!=KErrNone)
		{
		mode = EColor256;
		TRAPD(err, device = CFbsDrawDevice::NewScreenDeviceL(KDefaultScreenNo, mode));
		
		if (err == KErrNotSupported)
			{
			return ENone;
			}
		}
	delete device;
	return mode;
	}

//---------------
CTScalingStep::CTScalingStep() 
	{ 
	SetTestStepName(KTScalingStep); 
	} 
	 
CTGraphicsBase* CTScalingStep::CreateTestL()
	{ 
	CTGraphicsBase* theTest = NULL;
	switch (GetDisplayModeL())
		{
		case EColor64K:
			{
			INFO_PRINTF1(_L("Scaling - EColor64K"));
			theTest = new (ELeave) CTestColor64K(this, EColor64K);
			}
			break;
	
		case EColor256:
			{
			INFO_PRINTF1(_L("Scaling - EColor256"));
			theTest = new (ELeave) CTestColor256(this, EColor256);
			}
			break;

		default:
			INFO_PRINTF1(_L("EColor64K and EColor256 are not supported"));
			theTest = new (ELeave) CTestNone(this, ENone);			
		}
	return 	theTest;		
	} 

void CTScalingStep::TestSetupL()
	{
	TInt temp = 0;
	HAL::Get(KDefaultScreenNo, HALData::EDisplayColors, temp);//force HAL memory allocation
	
	}