windowing/windowserver/tauto/TGDI.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/TGDI.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1289 @@
+// Copyright (c) 1996-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:
+// GDI.CPP
+// Test GDI functions
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "TGDI.H"
+
+#define TAUTO_BITMAP_NAME _L("Z:\\WSTEST\\TAUTO.MBM")
+
+//#define LOGGING on		//Uncomment this line to get extra test logging - useful if debugging a failure of one of the tests
+
+typedef CGdiTestLowLevel *(*GdiTestFunc)();
+
+_LIT(KMonospaceTestFontTypefaceName,"Arial");
+const TInt KMaxFontSize = 200;
+
+static inline TBool IsLengthEqual(TInt aLLen, TInt aRLen, TInt aBbLen)
+	{
+// The bounding box of a 'w' is one pixel wider than it should be. W overlaps in to the bounding box of 'x' as the two  
+// are stuck together. So add a tolerance of -1.
+	return (((aLLen+aRLen)==aBbLen) || ((aLLen+aRLen-1)==aBbLen));
+	}
+
+struct GdiTest
+	{
+	GdiTestFunc func;
+	const TText *txt;
+	};
+
+GdiTest GdiTestFuncs[]={
+	{BoxTextTest,_S("BoxText")},
+	{VertTextTest,_S("VertText")},
+	/*{JustifiedTextTest,_S("JustifiedText")},*/ // DEF107985 The test for JustifiedText has been removed as it was a bad/useless test
+	{VertBoxTextTest,_S("VertBoxText")},
+	{SetOriginTest,_S("SetOrigin")},
+	{PolyLineTest,_S("PolyLine")},
+	{PolygonTest,_S("Polygon")},
+	{DrawArcTest,_S("DrawArc")},
+	{DrawPieTest,_S("DrawPie")},
+	{DrawRoundRectTest,_S("DrawRoundRect")},
+	{WideLineTest,_S("WideLine")},
+	{DrawTextTest,_S("DrawText")},
+	{DrawRectTest,_S("DrawRect")},
+	};
+
+CTestWindow::CTestWindow(TRgb aCol) : CBlankWindow(aCol)
+	{
+	}
+
+CTestWindow::~CTestWindow()
+	{
+	}
+
+void CTestWindow::ConstructL(TPoint aPos,TSize aSize,CTWinBase* aParent, CWindowGc& aGc)
+	{
+	iWin=RWindow(TheClient->iWs);
+	User::LeaveIfError(iWin.Construct(*(aParent->WinTreeNode()),ENullWsHandle));
+	SetExt(aPos,aSize);
+	Activate();
+	AssignGC(aGc);
+	}
+
+void CGdiTestLowLevel::SetGdiTest(CTGdi *aGdiTest)
+	{
+	iGdiTest=aGdiTest;
+	}
+
+void CGdiTestLowLevel::AssignGdi(CWindowGc *aGc)
+	{
+	iGdi=aGc;
+	}
+
+void CGdiTestLowLevel::ConstructL(TInt)
+	{
+	}
+
+void CGdiTestLowLevel::PreTestSetupL(const TRect &,TInt)
+	{
+	}
+
+//=======================================//
+// Individual GDI low level test classes //
+//=======================================//
+
+
+void CGdiRect::ConstructL(TInt)
+	{
+	}
+
+void CGdiRect::PreTestSetupL(const TRect &, TInt aCount)
+	{
+	iBrushCol=TRgb::Gray256(aCount&0x1 ? 0xFF : 0x60);
+	iPenCol=TRgb::Gray256(aCount&0x1 ? 0xA0 : 0x0);
+	}
+
+TInt CGdiRect::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiDrawRect::BaseTest(const TRect &aRect, TInt aCount)
+	{
+	TheTest(aRect,aCount);
+	}
+
+void CGdiDrawRect::TheTest(const TRect &aRect, TInt)
+	{
+	iGdi->SetBrushColor(iBrushCol);
+	iGdi->SetPenColor(iPenCol);
+	iGdi->DrawRect(aRect);
+	}
+
+TInt CGdiDrawRect::Count(TBool aMode)
+	{
+	return(aMode ? 4:1);
+	}
+
+TInt CGdiDrawRoundRect::Count(TBool aMode)
+	{
+	return(aMode ? 4:1);
+	}
+
+void CGdiDrawRoundRect::BaseTest(const TRect &aRect, TInt aCount)
+	{
+	TheTest(aRect,aCount);
+	}
+
+void CGdiDrawRoundRect::TheTest(const TRect &aRect, TInt aCount)
+	{
+	iGdi->SetBrushColor(iBrushCol);
+	iGdi->SetPenColor(iPenCol);
+	TSize size((aRect.iBr.iX-aRect.iTl.iX)/4,(aRect.iBr.iY-aRect.iTl.iY)/4);
+	switch(aCount)
+		{
+		case 0:
+			size.SetSize((aRect.iBr.iX-aRect.iTl.iX)/4,(aRect.iBr.iY-aRect.iTl.iY)/4);
+			break;
+		case 1:
+			size.SetSize(0,0);
+			break;
+		case 2:
+			size.SetSize((aRect.iBr.iX-aRect.iTl.iX)/2,(aRect.iBr.iY-aRect.iTl.iY)/2);
+			break;
+		case 3:
+			size.SetSize((aRect.iBr.iX-aRect.iTl.iX),(aRect.iBr.iY-aRect.iTl.iY));
+			break;
+		}
+	iGdi->DrawRoundRect(aRect,size);
+	}
+
+TInt CGdiDrawACP::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiDrawACP::ConstructL(TInt)
+	{
+	}
+
+void CGdiDrawACP::PreTestSetupL(const TRect &, TInt )
+	{
+	iBrushCol=TRgb::Gray256(0xff);
+	iPenCol=TRgb(0,0,0);
+	}
+
+void CGdiDrawArc::BaseTest(const TRect &aRect, TInt aCount)
+	{
+	TheTest(aRect,aCount);
+	}
+
+void CGdiDrawArc::TheTest(const TRect &aRect, TInt)
+	{
+	iGdi->SetBrushColor(iBrushCol);
+	iGdi->SetPenColor(iPenCol);
+	TPoint start(aRect.iTl.iX/2+aRect.iBr.iX,aRect.iTl.iY/2+aRect.iBr.iY);
+	iGdi->DrawArc(aRect,start,TPoint(0,0));
+	}
+
+void CGdiDrawPie::BaseTest(const TRect &aRect, TInt aCount)
+	{
+	TheTest(aRect,aCount);
+	}
+
+void CGdiDrawPie::TheTest(const TRect &aRect, TInt)
+	{
+	iGdi->SetBrushColor(iBrushCol);
+	iGdi->SetPenColor(iPenCol);
+	TPoint start(aRect.iTl.iX/2+aRect.iBr.iX,aRect.iTl.iY/2+aRect.iBr.iY);
+	iGdi->DrawPie(aRect,start,TPoint(0,0));
+	}
+
+//
+// Polyline tests
+//
+
+CGdiPolyLine::CGdiPolyLine() : iPnts(5)
+	{}
+
+void CGdiPolyLine::PreTestSetupL(const TRect &aRect, TInt aCount)
+	{
+	iPnts.Reset();
+	TInt wid=aRect.Width();
+	TInt hgt=aRect.Height();
+	if (aCount==0)
+		{
+		TInt pos;
+		for(pos=0;pos<wid;pos+=10)
+			{
+			iPnts.AppendL(TPoint(aRect.iTl.iX+pos,aRect.iTl.iY));
+			iPnts.AppendL(TPoint(aRect.iTl.iX+pos+5,aRect.iBr.iY));
+			}
+		for(pos=0;pos<hgt;pos+=10)
+			{
+			iPnts.AppendL(TPoint(aRect.iTl.iX,aRect.iTl.iY+pos));
+			iPnts.AppendL(TPoint(aRect.iBr.iX,aRect.iTl.iY+pos+5));
+			}
+		}
+	else
+		{
+		TInt hgt=aRect.Height();
+		iPnts.AppendL(TPoint(aRect.iTl.iX,aRect.iTl.iY));
+		iPnts.AppendL(TPoint(aRect.iBr.iX,aRect.iTl.iY+hgt/2));
+		iPnts.AppendL(TPoint(aRect.iTl.iX,aRect.iBr.iY));
+		iPnts.AppendL(TPoint(aRect.iBr.iX,aRect.iBr.iY));
+		iPnts.AppendL(TPoint(aRect.iTl.iX,aRect.iTl.iY+hgt/2));
+		iPnts.AppendL(TPoint(aRect.iBr.iX,aRect.iTl.iY));
+		iPnts.AppendL(TPoint(aRect.iTl.iX,aRect.iTl.iY));
+		}
+	}
+
+void CGdiPolyLine::ConstructL(TInt )
+	{
+	}
+
+TInt CGdiPolyLine::Count(TBool aMainTests)
+	{
+	return(aMainTests ? 2 : 1);
+	}
+
+void CGdiPolyLine::BaseTest(const TRect &, TInt )
+	{
+	TPoint prev;
+	TInt index;
+	for(index=0;index<iPnts.Count();index++)
+		{
+		if (index>0)
+			iGdi->DrawLine(prev,iPnts[index]);
+		prev=iPnts[index];
+		}
+	if (index>0)
+		iGdi->Plot(iPnts[index-1]);
+	}
+
+void CGdiPolyLine::TheTest(const TRect &, TInt )
+	{
+	iGdi->DrawPolyLine(&iPnts);
+	}
+
+//
+// Polygon tests //
+//
+
+CGdiPolygon::CGdiPolygon() : iPnts(5)
+	{}
+
+void CGdiPolygon::PreTestSetupL(const TRect &aRect, TInt )
+	{
+	iPnts.Reset();
+	TPoint pnt;
+	TInt maxPoints=Min((TInt)KMaxPolygonPoints,Min(aRect.Width(),aRect.Height())/KPolygonStep);
+	TInt numPoints=0;
+	if (maxPoints>0)
+		{
+		iPnts.AppendL(aRect.iTl);
+		while(numPoints<maxPoints)
+			{
+			if (numPoints&1)
+				pnt.SetXY(aRect.iTl.iX+(numPoints+1)*KPolygonStep,aRect.iTl.iY+numPoints*KPolygonStep);
+			else
+				pnt.SetXY(aRect.iTl.iX+numPoints*KPolygonStep,aRect.iTl.iY+(numPoints+1)*KPolygonStep);
+			iPnts.AppendL(pnt);
+			numPoints++;
+			}
+		pnt.SetXY(aRect.iTl.iX+numPoints*KPolygonStep,aRect.iTl.iY+numPoints*KPolygonStep);
+		iPnts.AppendL(pnt);
+		while(numPoints>0)
+			{
+			numPoints--;
+			if (numPoints&1)
+				pnt.SetXY(aRect.iTl.iX+numPoints*KPolygonStep,aRect.iTl.iY+(numPoints+1)*KPolygonStep);
+			else
+				pnt.SetXY(aRect.iTl.iX+(numPoints+1)*KPolygonStep,aRect.iTl.iY+numPoints*KPolygonStep);
+			iPnts.AppendL(pnt);
+			}
+		}
+	}
+
+void CGdiPolygon::ConstructL(TInt )
+	{
+	}
+
+TInt CGdiPolygon::Count(TBool aMainTests)
+	{
+	return(aMainTests ? 2 : 1);
+	}
+
+void CGdiPolygon::BaseTest(const TRect &aRect, TInt )
+	{
+	iGdi->SetPenColor(TRgb::Gray4(2));
+	iGdi->SetBrushColor(TRgb::Gray4(1));
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	TInt maxPoints=Min((TInt)KMaxPolygonPoints,Min(aRect.Width(),aRect.Height())/KPolygonStep);
+	for(TInt numPoints=0;numPoints<maxPoints;numPoints++)
+		iGdi->DrawRect(TRect(aRect.iTl.iX+numPoints*KPolygonStep + 1,aRect.iTl.iY+numPoints*KPolygonStep + 1,
+							 aRect.iTl.iX+(numPoints+1)*KPolygonStep ,aRect.iTl.iY+(numPoints+1)*KPolygonStep));
+	}
+
+void CGdiPolygon::TheTest(const TRect &, TInt )
+//This is the only one that can leave so it's not worth adding an 'L'
+	{
+	iGdi->SetPenColor(TRgb::Gray4(2));
+	iGdi->SetBrushColor(TRgb::Gray4(1));
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	User::LeaveIfError(iGdi->DrawPolygon(&iPnts,CGraphicsContext::EAlternate));
+	}
+
+//
+
+TInt CGdiWideLine::Count(TBool aMainTests)
+	{
+	return(aMainTests ? EMainNumWidths : EMinorNumWidths);
+	}
+
+void CGdiWideLine::ConstructL(TInt)
+	{
+	}
+
+void CGdiWideLine::PreTestSetupL(const TRect &, TInt aCount)
+	{
+	TInt widths[]={1,4,50,-2,
+				   48,12345,0,3,
+				   48,123,0,3,
+				   4,111,555,1000,
+				   10,-1,-10,-100};
+	iWidth=widths[aCount];
+	}
+
+void CGdiWideLine::BaseTest(const TRect &aRect, TInt)
+	{
+	iGdi->SetPenSize(TSize(iWidth,iWidth));
+	iGdi->DrawLine(aRect.iTl,aRect.iBr);
+	iGdi->MoveTo(aRect.iTl+TPoint(0,10));
+	iGdi->DrawLineBy(aRect.iBr-aRect.iTl);
+	iGdi->MoveBy(aRect.iTl-aRect.iBr+TPoint(0,10));
+	iGdi->DrawLineTo(aRect.iBr+TPoint(0,20));
+	}
+
+void CGdiWideLine::TheTest(const TRect &aRect, TInt)
+	{
+	iGdi->SetPenSize(TSize(iWidth,iWidth));
+	iGdi->MoveTo(aRect.iTl);
+	iGdi->DrawLineBy(aRect.iBr-aRect.iTl);
+	iGdi->MoveBy(aRect.iTl-aRect.iBr+TPoint(0,10));
+	iGdi->DrawLineTo(aRect.iBr+TPoint(0,10));
+	iGdi->DrawLine(aRect.iTl+TPoint(0,20),aRect.iBr+TPoint(0,20));
+	}
+
+//
+// Set Origin //
+//
+
+CGdiSetOrigin::~CGdiSetOrigin()
+	{
+	delete iPolylineArray;
+	delete iPolygonArray;
+	TheClient->iScreen->ReleaseFont(iFont);
+	}
+
+TInt CGdiSetOrigin::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiSetOrigin::ConstructL(TInt)
+	{
+	iPolylineArray=new(ELeave) CArrayFixFlat<TPoint>(3);
+	iPolylineArray->AppendL(TPoint(40,1));
+	iPolylineArray->AppendL(TPoint(50,11));
+	iPolylineArray->AppendL(TPoint(40,21));
+	iPolygonArray=new(ELeave) CArrayFixFlat<TPoint>(3);
+	iPolygonArray->AppendL(TPoint(40,30));
+	iPolygonArray->AppendL(TPoint(50,40));
+	iPolygonArray->AppendL(TPoint(40,45));
+	TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize);
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iFont,fspec));
+	}
+
+void CGdiSetOrigin::PreTestSetupL(const TRect &, TInt )
+	{
+	}
+
+void CGdiSetOrigin::DrawIt(const TPoint &aOffset)
+	{
+	iGdi->DrawLine(TPoint(10,10)+aOffset,TPoint(20,30)+aOffset);
+	iGdi->DrawLineBy(TPoint(-10,5));
+	iGdi->DrawLineTo(TPoint(20,5)+aOffset);
+	iGdi->MoveTo(TPoint(20,10)+aOffset);
+	iGdi->DrawLineTo(TPoint(30,15)+aOffset);
+	iGdi->MoveBy(TPoint(-10,2));
+	iGdi->DrawLineBy(TPoint(10,0));
+	iGdi->UseFont(iFont);
+	iGdi->DrawText(_L("Set Origin Test"),TPoint(40,20)+aOffset);
+	iGdi->DiscardFont();
+	iGdi->DrawRect(TRect(TPoint(10,45)+aOffset,TPoint(20,55)+aOffset));
+	iGdi->DrawRoundRect(TRect(TPoint(21,45)+aOffset,TPoint(30,55)+aOffset),TSize(3,2));
+	iGdi->DrawEllipse(TRect(TPoint(31,45)+aOffset,TPoint(40,55)+aOffset));
+	TInt index;
+	for(index=0;index<iPolylineArray->Count();index++)
+		(*iPolylineArray)[index]+=aOffset;
+	iGdi->DrawPolyLine(iPolylineArray);
+	for(index=0;index<iPolylineArray->Count();index++)
+		(*iPolylineArray)[index]-=aOffset;
+	for(index=0;index<iPolygonArray->Count();index++)
+		(*iPolygonArray)[index]+=aOffset;
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	User::LeaveIfError(iGdi->DrawPolygon(iPolygonArray,CGraphicsContext::EAlternate));		//Doesn't cause any harm if it leaves
+	for(index=0;index<iPolygonArray->Count();index++)
+		(*iPolygonArray)[index]-=aOffset;
+	}
+
+void CGdiSetOrigin::BaseTest(const TRect &aRect, TInt)
+	{
+	DrawIt(aRect.iTl);
+	}
+
+void CGdiSetOrigin::TheTest(const TRect &aRect, TInt)
+	{
+	iGdi->SetOrigin(aRect.iTl);
+	DrawIt(TPoint(0,0));
+	}
+
+//
+// Draw text //
+//
+
+CGdiDrawText::~CGdiDrawText()
+	{
+	TheClient->iScreen->ReleaseFont(iFont);
+	}
+
+TInt CGdiDrawText::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiDrawText::ConstructL(TInt)
+	{
+	TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize);
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iFont,fspec));
+	TInt index;
+	for(index=0;index<iBigBuffer.MaxLength();index++)
+		iBigBuffer.Append(TChar((index%26)+'a'));
+	const TInt characters=iBigBuffer.Length();
+	TInt bbLen=iFont->TextWidthInPixels(iBigBuffer);
+	for(index=0;index<iBigBuffer.MaxLength();index+=33)
+		{
+		TInt lLen=iFont->TextWidthInPixels(iBigBuffer.Left(index));
+		TInt rLen=iFont->TextWidthInPixels(iBigBuffer.Right(characters-index));
+		TBool result = IsLengthEqual(lLen,rLen,bbLen);
+		iGdiTest->TEST(result);
+		if (!result)
+			{
+			_LIT(KLog,"Font width metrics error, Width(%dchars)=%d, Width(%dchars)=%d, Width(%dchars)=%d");
+			iGdiTest->LOG_MESSAGE7(KLog,index,lLen,characters-index,rLen,characters,bbLen);
+			}
+		}
+	}
+
+void CGdiDrawText::PreTestSetupL(const TRect&,TInt)
+	{}
+
+void CGdiDrawText::BaseTest(const TRect& aRect,TInt)
+	{
+	TInt bbLen=iFont->TextWidthInPixels(iBigBuffer);
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+//
+	iGdi->DrawText(_L("Hello"), TPoint(aRect.iTl.iX, aRect.iTl.iY+fAscent));
+	TInt missingChars=iFont->TextCount(iBigBuffer,bbLen-aRect.iBr.iX)-1;	// -1 so one off screen char is drawn to handle overhang
+	if (missingChars>=0)
+		{
+		TPtrC bbb=iBigBuffer.Right(iBigBuffer.Length()-missingChars);
+		TInt lLen=iFont->TextWidthInPixels(iBigBuffer.Left(missingChars));
+		TInt rLen=iFont->TextWidthInPixels(bbb);
+		TBool result = IsLengthEqual(lLen,rLen,bbLen);
+		iGdiTest->TEST(result);
+		if (!result)
+			{
+			_LIT(KLog,"Font width metrics error, missingChars=%d  %d+%d=%d");
+			iGdiTest->LOG_MESSAGE5(KLog,missingChars,lLen,rLen,bbLen);
+			}
+		iGdi->DrawText(bbb,TPoint(aRect.iBr.iX-rLen,aRect.iTl.iY+fAscent+fHeight));
+		}
+	iGdi->DiscardFont();
+	}
+
+void CGdiDrawText::TheTest(const TRect& aRect,TInt)
+	{
+	TInt bbLen=iFont->TextWidthInPixels(iBigBuffer);
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+//
+	iGdi->DrawText(_L("Hello"), TPoint(aRect.iTl.iX, aRect.iTl.iY+fAscent));
+	iGdi->DrawText(iBigBuffer,TPoint(aRect.iBr.iX-bbLen,aRect.iTl.iY+fAscent+fHeight));
+	iGdi->DiscardFont();
+	}
+
+//
+// Draw vertical text //
+//
+
+CGdiDrawVertText::~CGdiDrawVertText()
+	{
+	TheClient->iScreen->ReleaseFont(iFont);
+	}
+
+TInt CGdiDrawVertText::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiDrawVertText::ConstructL(TInt)
+	{
+	TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize);
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iFont,fspec));
+	TInt index;
+	for(index=0;index<iBigBuffer.MaxLength();index++)
+		iBigBuffer.Append(TChar((index%26)+'a'));
+//
+	TInt bbLen=iFont->TextWidthInPixels(iBigBuffer);
+	for(index=0;index<iBigBuffer.MaxLength();index+=33)
+		{
+		TInt lLen=iFont->TextWidthInPixels(iBigBuffer.Left(index));
+		TInt rLen=iFont->TextWidthInPixels(iBigBuffer.Right(iBigBuffer.Length()-index));
+		TBool result = IsLengthEqual(lLen,rLen,bbLen);
+		iGdiTest->TEST(result);
+		if (!result)
+			iGdiTest->INFO_PRINTF3(_L("iFont->TextWidthInPixels(iBigBuffer) return value - Expected: %d, Actual: %d"), lLen+rLen, bbLen);		
+		}
+	}
+
+void CGdiDrawVertText::PreTestSetupL(const TRect &, TInt )
+	{
+	}
+
+void CGdiDrawVertText::BaseTest(const TRect &aRect, TInt)
+	{
+	TInt bbLen=iFont->TextWidthInPixels(iBigBuffer);
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+//
+	TInt tlen=iFont->TextWidthInPixels(_L("Hello"));
+	iGdi->DrawTextVertical(_L("Hello"), TPoint(aRect.iTl.iX+fAscent, aRect.iTl.iY+tlen), ETrue);
+	iGdi->DrawTextVertical(_L("Hello"), TPoint(aRect.iBr.iX-fAscent, aRect.iTl.iY), EFalse);
+	TInt missingChars=iFont->TextCount(iBigBuffer,bbLen-aRect.iBr.iY)-1;	// -1 so one off screen char is drawn to handle overhang
+	if (missingChars>=0)
+		{
+		TPtrC bbb=iBigBuffer.Right(iBigBuffer.Length()-missingChars);
+		TInt lLen=iFont->TextWidthInPixels(iBigBuffer.Left(missingChars));
+		TInt rLen=iFont->TextWidthInPixels(bbb);
+		TBool result = IsLengthEqual(lLen,rLen,bbLen);
+		iGdiTest->TEST(result);
+		if (!result)
+			iGdiTest->INFO_PRINTF3(_L("iFont->TextWidthInPixels(iBigBuffer) return value - Expected: %d, Actual: %d"), lLen+rLen, bbLen);		
+
+		iGdi->DrawTextVertical(bbb,TPoint(aRect.iTl.iX+fHeight-fAscent+fHeight,aRect.iBr.iY-rLen),EFalse);
+		}
+	iGdi->DiscardFont();
+	}
+
+void CGdiDrawVertText::TheTest(const TRect &aRect, TInt)
+	{
+	TInt bbLen=iFont->TextWidthInPixels(iBigBuffer);
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+//
+	TInt tlen=iFont->TextWidthInPixels(_L("Hello"));
+	iGdi->DrawTextVertical(_L("Hello"), TPoint(aRect.iTl.iX+fAscent, aRect.iTl.iY+tlen), ETrue);
+	iGdi->DrawTextVertical(_L("Hello"), TPoint(aRect.iBr.iX-fAscent, aRect.iTl.iY), EFalse);
+	iGdi->DrawTextVertical(iBigBuffer,TPoint(aRect.iTl.iX+fHeight-fAscent+fHeight,aRect.iBr.iY-bbLen),EFalse);
+	iGdi->DiscardFont();
+	}
+
+//
+// Draw Justified text //
+//
+
+// DEF107985 The test for JustifiedText has been removed as it was a bad/useless test. The original test was 
+// broken after it was migrated to TEF TGdi test. It was not worth fixing as the purpose of test was not clear, 
+// and fixing it basically required rewriting the whole test. 
+//  
+
+
+//
+// Box text //
+//
+
+CGdiBoxText::~CGdiBoxText()
+	{
+	TheClient->iScreen->ReleaseFont(iFont);
+	}
+
+TInt CGdiBoxText::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiBoxText::ConstructL(TInt)
+	{
+	TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize);
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iFont,fspec));
+	for(TInt index=0;index<iBigBuffer.MaxLength();index++)
+		iBigBuffer.Append(TChar((index%26)+'a'));
+	iBbLen=iFont->TextWidthInPixels(iBigBuffer);
+	}
+
+void CGdiBoxText::PreTestSetupL(const TRect &, TInt )
+	{
+	}
+
+void CGdiBoxText::BaseTest(const TRect &aRect, TInt)
+	{
+	TInt rWid=aRect.iBr.iX-aRect.iTl.iX;
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+//
+	TRect rect(aRect);
+	rect.iBr.iY=rect.iTl.iY+fHeight;
+//
+	TInt missingChars=iFont->TextCount(iBigBuffer,iBbLen-rWid);
+	TPtrC bbb=iBigBuffer.Right(iBigBuffer.Length()-missingChars);
+	TInt lLen=iFont->TextWidthInPixels(iBigBuffer.Left(missingChars));
+	TInt rLen=iFont->TextWidthInPixels(bbb);
+	TBool result = IsLengthEqual(lLen,rLen,iBbLen);
+	iGdiTest->TEST(result);	
+	if (!result)
+			iGdiTest->INFO_PRINTF3(_L("(lLen+rLen)==iBbLen return value - Expected: %d, Actual: %d"), lLen+rLen, iBbLen);		
+
+	iGdi->DrawText(bbb, rect, fAscent,CGraphicsContext::ELeft, rWid-rLen);
+//
+	rect.Move(TPoint(0,fHeight));
+	iGdi->DrawText(iBigBuffer, rect, fAscent,CGraphicsContext::ELeft, 0);
+//
+	TBuf<10> buf2(_L("1234567890"));
+	rect.Move(TPoint(0,fHeight));
+	iGdi->DrawText(buf2,rect,fAscent,CGraphicsContext::ERight,rect.Width()-iFont->TextWidthInPixels(buf2));
+	}
+
+void CGdiBoxText::TheTest(const TRect &aRect, TInt)
+	{
+	TInt rWid=aRect.iBr.iX-aRect.iTl.iX;
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	TRect rect(aRect);
+	rect.iBr.iY=rect.iTl.iY+fHeight;
+//
+	iGdi->DrawText(iBigBuffer, rect, fAscent, CGraphicsContext::ELeft, rWid-iBbLen);
+//
+	rect.Move(TPoint(0,fHeight));
+	iGdi->Clear(rect);
+	iGdi->SetClippingRegion(TRegionFix<1>(rect));
+	iGdi->DrawText(iBigBuffer, rect.iTl+TPoint(0,fAscent));
+	TBuf<10> buf2(_L("1234567890"));
+	rect.Move(TPoint(0,fHeight));
+	iGdi->CancelClippingRegion();
+	iGdi->DrawText(buf2,rect,fAscent);
+	}
+
+//
+// Vert Box text //
+//
+
+CGdiVertBoxText::~CGdiVertBoxText()
+	{
+	TheClient->iScreen->ReleaseFont(iFont);
+	}
+
+TInt CGdiVertBoxText::Count(TBool )
+	{
+	return(1);
+	}
+
+void CGdiVertBoxText::ConstructL(TInt)
+	{
+	TFontSpec fspec(KMonospaceTestFontTypefaceName,KMaxFontSize);
+	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iFont,fspec));
+	for(TInt index=0;index<iBigBuffer.MaxLength();index++)
+		iBigBuffer.Append(TChar((index%26)+'a'));
+	iBbLen=iFont->TextWidthInPixels(iBigBuffer);
+	}
+
+void CGdiVertBoxText::PreTestSetupL(const TRect &, TInt )
+	{
+	}
+
+void CGdiVertBoxText::BaseTest(const TRect &aRect, TInt)
+	{
+	TInt rWid=aRect.iBr.iY-aRect.iTl.iY;
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+//
+	TRect rect(aRect);
+	rect.iBr.iX=rect.iTl.iX+fHeight;
+//
+	TInt missingChars=iFont->TextCount(iBigBuffer,iBbLen-rWid);
+	TPtrC bbb=iBigBuffer.Right(iBigBuffer.Length()-missingChars+1);
+	TInt lLen=iFont->TextWidthInPixels(iBigBuffer.Left(missingChars-1));
+	TInt rLen=iFont->TextWidthInPixels(bbb);
+	TBool result = IsLengthEqual(lLen,rLen,iBbLen);
+	iGdiTest->TEST(result);
+	if (!result)
+			iGdiTest->INFO_PRINTF3(_L("(lLen+rLen)==iBbLen return value - Expected: %d, Actual: %d"), lLen+rLen, iBbLen);		
+
+	iGdi->DrawTextVertical(bbb, rect, fAscent, ETrue,CGraphicsContext::ELeft, rWid-rLen);
+//
+	rect.iTl.iX=rect.iBr.iX;
+	rect.iBr.iX=rect.iTl.iX+fHeight;
+	iGdi->DrawTextVertical(iBigBuffer, rect, fAscent, ETrue,CGraphicsContext::ELeft, 0);
+	}
+
+void CGdiVertBoxText::TheTest(const TRect &aRect, TInt)
+	{
+	TInt rWid=aRect.iBr.iY-aRect.iTl.iY;
+	TInt fAscent=iFont->AscentInPixels();
+	TInt fHeight=iFont->HeightInPixels();
+	iGdi->UseFont(iFont);
+	iGdi->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	TRect rect(aRect);
+	rect.iBr.iX=rect.iTl.iX+fHeight;
+//
+	iGdi->DrawTextVertical(iBigBuffer, rect, fAscent, ETrue, CGraphicsContext::ELeft, rWid-iBbLen);
+//
+	rect.iTl.iX=rect.iBr.iX;
+	rect.iBr.iX=rect.iTl.iX+fHeight;
+	iGdi->Clear(rect);
+	iGdi->SetClippingRegion(TRegionFix<1>(rect));
+	iGdi->DrawTextVertical(iBigBuffer, TPoint(rect.iTl.iX+fAscent,rect.iBr.iY), ETrue);
+	}
+
+
+//
+//
+CGdiBlitMasked::~CGdiBlitMasked()
+	{
+	for(TInt index=0;index<ENumMasks;index++)
+		delete iMask[index];
+	delete iBitmap;
+	delete iScratch;
+	delete iScratchDevice;
+	delete iScratchGc;
+	delete iScratchMask;
+	delete iScratchMaskDevice;
+	delete iScratchMaskGc;
+	}
+
+TInt CGdiBlitMasked::Count(TBool aMainTests)
+	{
+	return(aMainTests ? ENumMasks*2 : ENumMasks*2);
+	}
+
+void CGdiBlitMasked::doCreateTestBitmapL(CFbsBitmap *aBitmap, CFbsBitGc *&aGc, CFbsBitmapDevice *&aDevice, const TSize &aSize)
+	{
+	User::LeaveIfNull(aDevice=CFbsBitmapDevice::NewL(aBitmap));
+	User::LeaveIfError(aDevice->CreateContext(aGc));
+//
+	aGc->SetBrushColor(TRgb(128,128,128));
+	aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	aGc->SetPenStyle(CGraphicsContext::ENullPen);
+	aGc->DrawRect(TRect(aBitmap->SizeInPixels()));
+	aGc->SetPenStyle(CGraphicsContext::ESolidPen);
+	for(TInt index=(-aSize.iHeight);index<aSize.iWidth;index+=5)
+		{
+		aGc->DrawLine(TPoint(index,0),TPoint(index+aSize.iHeight,aSize.iHeight));
+		aGc->DrawLine(TPoint(index,aSize.iHeight),TPoint(index+aSize.iHeight,0));
+		}
+	}
+
+void CGdiBlitMasked::createTestBitmapL(CFbsBitmap *&aBitmap, const TSize &aSize)
+	{
+	CFbsBitGc *gc=NULL;
+	CFbsBitmapDevice *device=NULL;
+	aBitmap=new(ELeave) CFbsBitmap();
+	User::LeaveIfError(aBitmap->Create(aSize,EGray16));
+	TRAPD(err,doCreateTestBitmapL(aBitmap, gc, device, aSize));
+	delete gc;
+	delete device;
+	User::LeaveIfError(err);
+	}
+
+void CGdiBlitMasked::ConstructL(TInt)
+	{
+	TSize max(0,0);
+	for(TInt index=0;index<ENumMasks;index++)
+		{
+		iMask[index]=new(ELeave) CFbsBitmap();
+		User::LeaveIfError(iMask[index]->Load(TAUTO_BITMAP_NAME,2+index));
+		TSize size=iMask[index]->SizeInPixels();
+		if (max.iWidth<size.iWidth)
+			max.iWidth=size.iWidth;
+		if (max.iHeight<size.iHeight)
+			max.iHeight=size.iHeight;
+		}
+	iScratch=new(ELeave) CFbsBitmap();
+	User::LeaveIfError(iScratch->Create(max,EGray16));
+	iScratchDevice=CFbsBitmapDevice::NewL(iScratch);
+	User::LeaveIfError(iScratchDevice->CreateContext(iScratchGc));
+
+	iScratchMask=new(ELeave) CFbsBitmap();
+	User::LeaveIfError(iScratchMask->Create(max,EGray16));
+	iScratchMaskDevice=CFbsBitmapDevice::NewL(iScratchMask);
+	User::LeaveIfError(iScratchMaskDevice->CreateContext(iScratchMaskGc));
+//
+	createTestBitmapL(iBitmap, max);
+	}
+
+void CGdiBlitMasked::PreTestSetupL(const TRect &, TInt aCount)
+	{
+	iInvertMask=aCount&0x1;
+	aCount>>=1;
+	iCurrMask= iMask[aCount%ENumMasks];
+	iDrawMode=CGraphicsContext::EDrawModePEN;
+	}
+
+void CGdiBlitMasked::BaseTest(const TRect &aRect, TInt)
+	{
+// needs re-writing to emulate tiling of the source rect
+	if (!aRect.Intersects(TRect(BaseWin->Size())))
+		return;
+	TSize size(aRect.Size());
+	TSize bitSize=iBitmap->SizeInPixels();
+	if (size.iWidth>bitSize.iWidth)
+		size.iWidth=bitSize.iWidth;
+	if (size.iHeight>bitSize.iHeight)
+		size.iHeight=bitSize.iHeight;
+//
+// Set up the scratch mask as a black and white bitmap containing the mask to blit
+// The mask pattern is replicated all over the scratchmask bitmap
+//
+	iScratchMaskGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	iScratchMaskGc->SetPenStyle(CGraphicsContext::ENullPen);
+	iScratchMaskGc->SetBrushColor(TRgb(0,0,0));
+	iScratchMaskGc->DrawRect(TRect(iScratchMask->SizeInPixels()));
+	iScratchMaskGc->SetPenColor(TRgb(255,255,255));
+	iScratchMaskGc->SetPenStyle(CGraphicsContext::ESolidPen);
+	TSize maskSize(iCurrMask->SizeInPixels());
+	TPoint pos;
+	TRgb *rgbBuf=(TRgb *)User::AllocL(maskSize.iWidth*sizeof(TRgb));		//Doesn't do any harm if it leaves
+	for(pos.iY=0;pos.iY<maskSize.iHeight;pos.iY++)
+		{
+		TPtr8 ptr((TUint8 *)rgbBuf,maskSize.iWidth*sizeof(TRgb));
+		iCurrMask->GetScanLine(ptr, pos, maskSize.iWidth, ERgb);
+		for(TInt index=0;index<maskSize.iWidth;index++)
+			{
+			iScratchMaskGc->SetPenColor(rgbBuf[index]);
+//			if ((isLow && !iLowCutOff) || (!isLow && iLowCutOff))
+				iScratchMaskGc->Plot(TPoint(index,pos.iY));
+			}
+		}
+	User::Free(rgbBuf);
+
+	for(pos.iY=0;pos.iY<size.iHeight;pos.iY+=maskSize.iHeight)
+		for(pos.iX=0;pos.iX<size.iWidth;pos.iX+=maskSize.iWidth)
+			iScratchMaskGc->CopyRect(pos, TRect(maskSize));
+//
+// Blit this to the screen in ANDNOT mode to clear all the pixels we want the mask blit to draw to
+//
+	iGdi->SetDrawMode(CGraphicsContext::EDrawModeANDNOT);
+	iGdi->BitBlt(aRect.iTl, iScratchMask, TRect(size));
+//
+// Copy the test bitmap to the scratch bitmap then use the scratch mask to clear all the bits
+// that should masked out of the draw to the screen
+//
+	iScratchGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	iScratchGc->BitBlt(TPoint(0,0), iBitmap);
+	iScratchGc->SetDrawMode(CGraphicsContext::EDrawModeAND);
+	iScratchGc->BitBlt(TPoint(0,0), iScratchMask);
+//
+// Now copy the scratch bitmap to the screen in OR mode to get the final result
+//
+	iGdi->SetDrawMode(CGraphicsContext::EDrawModeOR);
+	iGdi->BitBlt(aRect.iTl, iScratch, TRect(size));
+	}
+
+void CGdiBlitMasked::TheTest(const TRect &aRect, TInt)
+	{
+	iGdi->BitBltMasked(aRect.iTl,iBitmap,TRect((aRect.iBr-aRect.iTl).AsSize()),
+						iCurrMask,iInvertMask);
+	}
+//
+//
+
+CTGdi::CTGdi(CTestStep* aStep) : CTWsGraphicsBase(aStep), iGdiTest (NULL), iTextOffsetX(10),iTextOffsetY(10)
+	{
+	}
+
+void CTGdi::ConstructL()
+	{
+	iWinSize=TestWin->Size();
+	}
+
+TSize CTGdi::WinSize()
+	{
+	return(iWinSize);
+	}
+
+void CTGdi::DoGdiTestL(const TRect &aRect, TInt aNum)
+	{
+//
+	iGdiTest->PreTestSetupL(aRect,aNum);
+//
+	BaseWin->Win()->Invalidate();
+	BaseWin->Win()->BeginRedraw();
+	TheGc->Activate(*BaseWin->Win());
+	iTest->DrawTestBackground(EFalse,BaseWin->Size());
+	iGdiTest->BaseTest(aRect,aNum);
+	TheGc->Deactivate();
+	BaseWin->Win()->EndRedraw();
+//
+	TestWin->Win()->Invalidate();
+	TestWin->Win()->BeginRedraw();
+	TheGc->Activate(*TestWin->Win());
+	iTest->DrawTestBackground(EFalse,TestWin->Size());
+	iGdiTest->TheTest(aRect,aNum);
+	TheGc->Deactivate();
+	TestWin->Win()->EndRedraw();
+//
+	TheClient->iWs.Flush();
+	TheClient->WaitForRedrawsToFinish();
+	TheClient->iWs.Finish();
+//
+	_LIT(KLog,"GDI Substate=%d  test=%d  rect=(%d,%d,%d,%d) ");
+	TBuf<64> buf;
+	buf.Format(KLog,iSubState,aNum,aRect.iTl.iX,aRect.iTl.iY,aRect.iBr.iX,aRect.iBr.iY);
+	iTestPassing=CompareWindows(buf);
+	}
+
+void CTGdi::GdiTestL(CGdiTestLowLevel *aTest)
+	{
+	TTestRects::ResetSeed();
+	iTestPassing=ETrue;
+	iGdiTest=aTest;
+	iGdiTest->SetGdiTest(this);
+	iGdiTest->AssignGdi(TheGc);
+	iGdiTest->ConstructL(iTest->iTestRects.Count1());
+	TInt index;
+	TInt index2;
+	for(index=0; iTestPassing && index<iTest->iTestRects.Count2(); ++index)
+		{
+		TInt max=iGdiTest->Count(index<iTest->iTestRects.Count1());
+		TRect rect=iTest->iTestRects[index];
+	#if defined(LOGGING)
+		_LIT(KLog1,"Testing rectangle %d (%d,%d,%d,%d) 1st pass");
+		LOG_MESSAGE6(KLog1,index,rect.iTl.iX,rect.iTl.iY,rect.iBr.iX,rect.iBr.iY);
+	#endif
+		for(index2=0; iTestPassing && index2<max; ++index2)
+			DoGdiTestL(rect,index2);
+		if (!iTestPassing)
+			{
+			_LIT(KLog,"Test fail on rectangle %d at iteration %d");
+			LOG_MESSAGE3(KLog,index,index2);
+			}
+		}
+	for(; iTestPassing && index<iTest->iTestRects.Count3(); index++)
+		{
+		TRect rect=iTest->iTestRects[index];
+	#if defined(LOGGING)
+		_LIT(KLog2,"Testing rectangle %d (%d,%d,%d,%d) 2nd pass");
+		LOG_MESSAGE6(KLog2,index,rect.iTl.iX,rect.iTl.iY,rect.iBr.iX,rect.iBr.iY);
+	#endif
+		DoGdiTestL(rect,0);
+		}
+	delete iGdiTest;
+	iGdiTest=NULL;
+	}
+
+void CTGdi::NonDrawing()
+//
+// Test all non-drawing GDI functions
+//
+	{
+	TDisplayMode mode=TheClient->iScreen->DisplayMode();
+	TEST((mode!=ERgb) && (mode!=ENone));
+
+	RWsSession session;
+	TInt res = session.Connect();
+	TEST(res == KErrNone);
+	
+	CArrayFixFlat<TInt>* modeList= new CArrayFixFlat<TInt> (15);
+	if(!modeList)
+		return;
+	
+#if defined(SYMBIAN_GRAPHICS_GCE)
+	res = session.GetColorModeList(iTest->iScreenNumber, modeList);
+#else
+	res = session.GetColorModeList(modeList);
+#endif //SYMBIAN_GRAPHICS_GCE
+	session.Close();
+	TEST(res == KErrNone);
+	if(res != KErrNone)
+		{
+		modeList->Reset();
+		delete modeList;
+		return;
+		}
+	
+	TBool found = EFalse;
+	for(TInt ii = 0; ii < modeList->Count() && !found; ii++)
+		{
+		TDisplayMode mode1 = (TDisplayMode) ((*modeList)[ii]);
+		if(mode == mode1)
+			{
+			found = ETrue;
+			}
+		}
+	modeList->Reset();
+	delete modeList;
+
+	TEST(found);	
+	}
+
+//
+// Auxiliary Fn for Test Case ID CTGdi_TestDefetct_DEF045746
+// This method draws the text represented by aText parameter on the window
+// passed to it.
+//
+void CTGdi::DrawTextOnWindow(const TDesC& aText,CTWin* aWin)
+	{
+	aWin->Win()->BeginRedraw();
+	TheGc->Activate(*aWin->Win());
+	TheGc->Device()->GetNearestFontToDesignHeightInTwips(iFont,TFontSpec(_L("Arial"),250));
+	TheGc->UseFont(iFont);
+	TheGc->Clear();
+	TheGc->DrawRect(TRect(aWin->Win()->Size()));
+	TheGc->DrawText(aText,TPoint(iTextOffsetX,iTextOffsetY));
+	TheGc->Device()->ReleaseFont(iFont);
+	TheGc->Deactivate();
+	aWin->Win()->EndRedraw();
+	}
+
+
+void CTGdi::TestDefetct_DEF045746L()
+	{
+	_LIT(KString,"This is a test window for the defect fix DEF045746 \
+		propagated from Opera browser. Most window graphics context drawing\
+		functions map to equivalent CFbsBitGc functions they are implemented\
+		on the screen with any co-ordinates being relative to the top left\
+		corner of the window. However extra clipping is applied. The drawing\
+		will always be clipped to the visible part of the window, in addition\
+		it will be clipped to the non-invalid part if you are not doing a\
+		redraw and to the region being validated if you are doing a redraw.");
+
+	TPtrC TestText(KString().Ptr(),100);
+	TPtrC LargeText(KString().Ptr());
+	TPtrC ShortText(KString().Ptr(),200);
+
+	TSize scrSize=TheClient->iScreen->SizeInPixels();
+	TSize winSize;
+	const TInt windowGap=5;
+	winSize.SetSize(scrSize.iWidth -2* windowGap,scrSize.iHeight/2 - windowGap);
+
+	iWin=new(ELeave) CTestWindow(TRgb(0,0,0));
+	iWin->ConstructL(TPoint(5,5),TSize(winSize),TheClient->iGroup,*TheClient->iGc);
+	CTestWindow* expectWin= new(ELeave) CTestWindow(TRgb(0,0,0));
+	expectWin->ConstructL(TPoint(5,scrSize.iHeight/2 + windowGap),TSize(winSize),TheClient->iGroup,*TheClient->iGc);
+	DrawTextOnWindow(ShortText,iWin);
+	DrawTextOnWindow(TestText,expectWin);
+	TInt fHeight=iFont->HeightInPixels();//Used to compare only pixels where text is drawn
+	TRect iRect=winSize;
+	iRect.iTl.iX=iTextOffsetX;
+	iRect.iTl.iY=iTextOffsetY;
+	iRect.iBr.iY=iTextOffsetY+fHeight;
+	CheckRect(iWin,expectWin,iRect,_L("TestDefetct_DEF045746L A"));
+	iWin->Invalidate();
+	DrawTextOnWindow(LargeText,iWin);
+	CheckRect(iWin,expectWin,iRect,_L("TestDefetct_DEF045746L B"));
+	delete iWin;
+	iWin=NULL;
+	delete expectWin;
+	expectWin=NULL;
+	}
+
+void CTGdi::RunTestCaseL(TInt /*aCurTestCase*/)
+	{
+	//_LIT(KTest1,"NonDrawing"); this test is not running
+	_LIT(KTest2,"DEF045746");
+	_LIT(KTest3,"Drawing Tests");
+	((CTGdiStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	static TTime startTime;
+	switch(++iTest->iState)
+		{
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0262
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Test all non-drawing GDI functions
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Check all non-drawing GDI functions operate correctly
+
+@SYMTestExpectedResults Non-drawing GDI functions operate correctly
+*/
+		case 1:
+		    // start time log
+		    startTime.HomeTime();
+			((CTGdiStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0262"));
+			//iTest->LogSubTest(KTest1);
+			//PeterI this tests whether the display mode is EGray4 or EGray16.
+			//The actual display mode is EColor16MU so this test will always fail
+			//NonDrawingL();
+			break;
+/**
+ * @SYMTestCaseID GRAPHICS-WSERV-0263
+ *
+ * @SYMPREQ DEF045746
+ *
+ * @SYMTestCaseDesc Test defect fix for DEF045746
+ *
+ * @SYMTestPriority  High
+ *
+ * @SYMTestStatus Implemented
+ *
+ * @SYMTestActions The method tests CWindowGc::DrawText().The test is carried
+ * out by writing small & very large strings to the window graphic context.
+ *
+ * @SYMTestExpectedResults The window with large / small strings written is
+ * compared with an expected result window. In both the cases strings should
+ * be displayed.
+ *
+ */
+		case 2:
+			((CTGdiStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0263"));
+			iTest->LogSubTest(KTest2);
+			TestDefetct_DEF045746L();
+			break;
+/**
+@SYMTestCaseID		GRAPHICS-WSERV-0264
+
+@SYMDEF             DEF081259
+
+@SYMTestCaseDesc    Test all drawing GDI functions
+
+@SYMTestPriority    High
+
+@SYMTestStatus      Implemented
+
+@SYMTestActions     Check all drawing GDI functions operate correctly
+
+@SYMTestExpectedResults Drawing GDI functions operate correctly
+*/
+		case 3:
+			{
+			((CTGdiStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0264"));
+			iTest->LogSubTest(KTest3);
+			iSubState = 0;
+			TheClient->WaitForRedrawsToFinish();		//Just in case the two test windows have any invalid areas
+			TInt numTests = sizeof(GdiTestFuncs) / sizeof(GdiTestFuncs[0]);
+			while (iSubState < numTests)
+				{
+				LOG_MESSAGE(TPtrC(GdiTestFuncs[iSubState].txt));
+				GdiTestL((*GdiTestFuncs[iSubState].func)());
+				iSubState++;
+				}
+			}
+			break;
+		default:
+            ((CTGdiStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+			((CTGdiStep*)iStep)->CloseTMSGraphicsStep();
+			TestComplete();
+			// log time and print duration
+			TTime endTime;
+			endTime.HomeTime();
+			TInt64 duration = endTime.MicroSecondsFrom(startTime).Int64();
+			float time = (float) I64LOW(duration) / 1000.0f;
+			_LIT(KDuration,"Total test duration is %f millisec");
+			RDebug::Print(KDuration, time);
+			break;
+		}
+	((CTGdiStep*)iStep)->RecordTestResultL();
+	}
+
+CGdiTestLowLevel *SetOriginTest()
+	{
+	return(new(ELeave) CGdiSetOrigin());
+	}
+
+CGdiTestLowLevel *PolyLineTest()
+	{
+	return(new(ELeave) CGdiPolyLine());
+	}
+
+CGdiTestLowLevel *PolygonTest()
+	{
+	return(new(ELeave) CGdiPolygon());
+	}
+
+CGdiTestLowLevel *BlitMaskedTest()
+	{
+	return(new(ELeave) CGdiBlitMasked());
+	}
+
+CGdiTestLowLevel *DrawArcTest()
+	{
+	return(new(ELeave) CGdiDrawArc());
+	}
+
+CGdiTestLowLevel *DrawPieTest()
+	{
+	return(new(ELeave) CGdiDrawPie());
+	}
+
+CGdiTestLowLevel *DrawRoundRectTest()
+	{
+	return(new(ELeave) CGdiDrawRoundRect());
+	}
+
+CGdiTestLowLevel *BoxTextTest()
+	{
+	return(new(ELeave) CGdiBoxText());
+	}
+
+CGdiTestLowLevel *VertTextTest()
+	{
+	return(new(ELeave) CGdiDrawVertText());
+	}
+
+CGdiTestLowLevel *VertBoxTextTest()
+	{
+	return(new(ELeave) CGdiVertBoxText());
+	}
+
+CGdiTestLowLevel *WideLineTest()
+	{
+	return(new(ELeave) CGdiWideLine());
+	}
+
+CGdiTestLowLevel *DrawTextTest()
+	{
+	return(new(ELeave) CGdiDrawText());
+	}
+
+CGdiTestLowLevel *DrawRectTest()
+	{
+	return(new(ELeave) CGdiDrawRect());
+	}
+
+__WS_CONSTRUCT_STEP__(Gdi)