graphicsdeviceinterface/directgdi/test/tdrawtext.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tdrawtext.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1200 @@
+// 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:
+//
+
+#include "tdrawtext.h"
+#include <graphics/directgdiengine.h>
+#include <graphics/directgdicontext.h>
+
+
+LOCAL_C void CleanCache(TAny* aPtr)
+	{
+	MFontGlyphImageStorage* glyphImageStorage = reinterpret_cast<MFontGlyphImageStorage*> (aPtr);
+	glyphImageStorage->CleanGlyphImageCache();
+	}
+
+/**
+Default text drawing target size
+*/
+const TSize KDrawTextDefaultSize(640, 400);
+
+/**
+Test text
+*/
+_LIT16(KPangram, "The quick brown fox jumps over the lazy dog");
+_LIT16(KAbcd,"Abcd");
+
+
+CTDrawText::CTDrawText()
+	{
+	SetTestStepName(KTDirectGdiDrawTextStep);
+	}
+
+CTDrawText::~CTDrawText()
+	{
+	if(iFont)
+		{
+		ReleaseFont(iFont);		
+		}
+	}
+
+
+/** 
+Override of base class pure virtual
+Our implementation only gets called if the base class doTestStepPreambleL() did
+not leave. That being the case, the current test result value will be EPass.
+@leave Gets system wide error code
+@return TVerdict code
+*/	
+TVerdict CTDrawText::doTestStepL()
+	{
+	// Test for each target pixel format
+	for(TInt targetPixelFormatIndex = iTargetPixelFormatArray.Count() - 1; targetPixelFormatIndex >= 0 ; targetPixelFormatIndex--)
+		{
+		iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[targetPixelFormatIndex];
+			
+		SetTargetL(iTestParams.iTargetPixelFormat, EOneContextOneTarget, KDrawTextDefaultSize);
+
+		iFont = GetFont();
+		User::LeaveIfNull(iFont);
+			
+		RunTestsL();
+		// only run OOM tests for one target pixel format to prevent duplication of tests
+		if (targetPixelFormatIndex == 0)
+			{
+			RunOomTestsL();  //from base class
+			}
+
+		if(iFont)
+			{
+			ReleaseFont(iFont);
+			iFont = NULL;
+			}
+		}
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTDrawText::doTestStepPreambleL()
+	{			
+	CTDirectGdiStepBase::doTestStepPreambleL();	
+	return TestStepResult();
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0001
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Basic test for text drawing with basic and valid parameters.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	  
+@SYMTestActions 	
+	Test the DrawText() and DrawTextVertical() functions for text drawing using either BitGDI or DirectGDI gc.
+	  
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+	
+*/
+void CTDrawText::TestBasicFunctionality()
+	{
+	_LIT(KTestName, "Text-Basic"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+	
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+	
+	//1.down
+	
+	iGc->DrawTextVertical(KPangram,NULL,TPoint(10,10),EFalse);
+	
+	iGc->DrawTextVertical(KAbcd, NULL, EFalse);
+	
+	TRect rect(30,10,50,400);
+	TInt baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KPangram,NULL,rect,baseline,EFalse);
+	
+	rect.SetRect(50,10,80,400);
+	baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KPangram,NULL,rect,baseline,10,EFalse);
+	
+	rect.SetRect(50,100,80,400);
+	iGc->DrawTextVertical(KAbcd,NULL,rect,EFalse);
+	
+	//2.up
+	
+	iGc->DrawTextVertical(KPangram,NULL,TPoint(105,390),ETrue);
+	
+	iGc->DrawTextVertical(KAbcd,NULL,ETrue);
+	
+	rect.SetRect(110,10,140,390);
+	baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KPangram,NULL,rect,baseline,ETrue);
+	
+	rect.SetRect(140,10,160,390);
+	baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KPangram,NULL,rect,baseline,10,ETrue);
+	
+	rect.SetRect(140,10,160,200);
+	iGc->DrawTextVertical(KAbcd,NULL,rect,ETrue);
+	
+	//horizontal
+	iGc->DrawText(KPangram,NULL,TPoint(170, 25));
+	
+	iGc->DrawText(KAbcd,NULL);
+	
+	rect.SetRect(170,30,640,50);
+	baseline = rect.Height() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawText(KPangram,NULL,rect,baseline);
+		
+	rect.SetRect(170,30,640,50);
+	iGc->DrawText(KAbcd,NULL,rect);
+	
+	
+	iGc->ResetFont();
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0002
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test for text positioning and clipping in a rendering target. 
+	Only horizontal drawing direction is taken into consideration.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented  
+	
+@SYMTestActions 	
+	 Loop over all versions od DrawText() method.
+	 Using each one draw a text "text" on screen at various positions.
+	 Increment position from (-50,-50) up to target width+50 and target heigh+50
+	 to test boundary cases as well. 
+	 
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawText::TestTextPositioning()
+	{
+	_LIT(KTestName, "Text-Positioning"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	_LIT(KText, "test");
+	for(TInt funcNum=0; funcNum<4; funcNum++)
+		{
+		
+		ResetGc();
+		
+		iGc->SetFont(iFont);
+		TEST(iGc->HasFont());
+		iGc->SetPenColor(TRgb(0, 0, 0));
+		
+		TPositionIterator posIterator(-50, KDrawTextDefaultSize.iWidth+50, 30, -50, KDrawTextDefaultSize.iHeight+50, 13);
+		posIterator.Begin();
+		
+		do
+			{
+			switch(funcNum)
+				{
+				case 0:
+					{
+					// void DrawText(const TDesC& aText);
+					iGc->Reset();
+					iGc->SetFont(iFont);
+					TEST(iGc->HasFont());
+					iGc->SetPenColor(TRgb(0, 0, 0));
+					iGc->SetOrigin(TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX));
+					iGc->DrawText(KText,NULL);
+					break;
+					}
+
+				case 1:
+					{
+					// void DrawText(const TDesC& aText, const TPoint& aPosition)
+					iGc->DrawText(KText,NULL,TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX));
+					break;
+					}
+
+				case 2:
+					{
+					// void DrawText(const TDesC& aText, const TRect& aBox)
+					iGc->Reset();
+					iGc->SetFont(iFont);
+					TEST(iGc->HasFont());
+					iGc->SetPenColor(TRgb(0, 0, 0));
+					TPoint pos(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX);
+					iGc->SetOrigin(pos);
+					TRect box(-pos, KDrawTextDefaultSize);
+					iGc->DrawText(KText,NULL,box);
+					break;
+					}
+					
+				case 3:
+					{
+					// void DrawText(const TDesC& aText, const TRect& aBox, TInt aBaselineOffset, 
+					//		DirectGdi::TTextAlign aAlignment = DirectGdi::ELeft, TInt aMargin = 0)
+					TRect rect(TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX), TSize(32, 13) );
+					iGc->DrawText(KText, NULL, rect, 13, DirectGdi::ELeft, 1);
+					break;
+					}
+				}
+			}
+		while(posIterator.Next());
+		
+		TESTNOERROR(iGc->GetError());
+		TBuf<40> tname;
+		tname.Format(_L("%S%d"), &KTestName, funcNum);
+		TEST(KErrNone == WriteTargetOutput(iTestParams, tname));
+		
+		iGc->ResetFont();
+		}
+	}
+
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0003
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test for clipping text based on the box parameter.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented  
+	
+@SYMTestActions
+	Set the origin to a non-zero position. 
+	Draw a text "text" on screen at various positions using
+	incremented box size.
+	
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawText::TestTextBox()
+	{	
+	_LIT(KTestName, "Text-BoxClipping"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	iGc->SetOrigin(TPoint(2, -2));
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+	iGc->SetBrushStyle(DirectGdi::ESolidBrush);
+	iGc->SetBrushColor(TRgb(150, 150, 150));
+
+	_LIT(KText, "test");
+
+	TInt baseline = 2 + iFont->FontMaxAscent()/2;
+	TPositionIterator posIterator(0, KDrawTextDefaultSize.iWidth, 50, 0, KDrawTextDefaultSize.iHeight, 13);
+	posIterator.Begin();
+	
+	do
+		{
+		TRect rect(TPoint(posIterator.iPosX, posIterator.iPosY), TSize(posIterator.iIndexY, posIterator.iIndexX));
+		if(!rect.IsEmpty())
+			{
+			iGc->DrawText(KText, NULL, rect, baseline);
+			}
+		}
+	while(posIterator.Next());
+	
+	iGc->ResetFont();
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0004
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test for positioning vertical text in a rendering target.
+	Only vertical drawing direction is taken into consideration.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented  
+	
+@SYMTestActions
+ 	Loop over all versions od DrawTextVertical() method.
+	Using each one draw a text "text" on screen at various positions.
+	Increment position from (-50,-70) up to target width+50 and target heigh+70
+	to test boundary cases as well. 
+	
+@SYMTestExpectedResults 
+	Test should perform graphics operations successfully.
+*/
+void CTDrawText::TestTextPositioningVertical(TBool aUp)
+	{	
+	_LIT(KTestName, "Text-PositioningVertical"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	_LIT(KText, "test");
+
+	for(TInt funcNum = 0; funcNum<5; funcNum++)
+		{
+		
+		ResetGc();
+
+		iGc->SetFont(iFont);
+		TEST(iGc->HasFont());
+		iGc->SetPenColor(TRgb(0, 0, 0));
+		
+		TPositionIterator posIterator(-50, KDrawTextDefaultSize.iWidth+50, 10, -70, KDrawTextDefaultSize.iHeight+70, 30);
+		posIterator.Begin();
+		
+		do
+			{
+			switch(funcNum)
+				{
+				case 0:
+					{
+					// void DrawTextVertical(const TDesC& aText, TBool aUp)
+					iGc->Reset();
+					iGc->SetFont(iFont);
+					TEST(iGc->HasFont());
+					iGc->SetPenColor(TRgb(0, 0, 0));
+					iGc->SetOrigin(TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX));
+					iGc->DrawTextVertical(KText, NULL, aUp);
+					break;
+					}
+
+				case 1:
+					{
+					// void DrawTextVertical(const TDesC& aText, const TPoint& aPosition, TBool aUp)
+					iGc->DrawTextVertical(KText, NULL, TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX), aUp);
+					break;
+					}
+
+				case 2:
+					{
+					// void DrawTextVertical(const TDesC& aText, const TRect& aBox, TBool aUp)
+					iGc->Reset();
+					iGc->SetFont(iFont);
+					TEST(iGc->HasFont());
+					iGc->SetPenColor(TRgb(0, 0, 0));
+					TPoint pos(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX);
+					iGc->SetOrigin(pos);
+					TRect box(-pos, KDrawTextDefaultSize);
+					iGc->DrawTextVertical(KText, NULL, box, aUp);
+					break;
+					}
+					
+				case 3:
+					{
+					// void DrawTextVertical(const TDesC& aText, const TRect& aBox, TInt aBaselineOffset, 
+					//		TBool aUp, DirectGdi::TTextAlign aVerticalAlignment = DirectGdi::ELeft, TInt aMargin = 0)
+					TRect rect(TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX),TSize(13, 32));
+					iGc->DrawTextVertical(KText, NULL, rect, 12, aUp,DirectGdi::ELeft, 0);
+					break;
+					}
+					
+				case 4:
+					{
+					// void DrawTextVertical(const TDesC& aText, const TRect& aBox, TInt aBaselineOffset, 
+					//		TInt aTextWidth, TBool aUp, DirectGdi::TTextAlign aVerticalAlignment = DirectGdi::ELeft, TInt aMargin = 0)
+					TRect rect(TPoint(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX),TSize(13, 32));
+					iGc->DrawTextVertical(KText, NULL, rect, 12, 4, aUp, DirectGdi::ELeft, 0);
+					break;
+					}
+				}
+			}
+		while(posIterator.Next());
+		
+		TESTNOERROR(iGc->GetError());
+	
+		_LIT(KUp, "up");
+		_LIT(KDown, "down");
+	
+		TBuf<40> tname;
+		tname.Format(_L("%S%d%S"), &KTestName, funcNum, aUp ? &KUp : &KDown);
+		TESTNOERROR(WriteTargetOutput(iTestParams, tname));
+		
+		iGc->ResetFont();
+		}
+	}
+
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0005
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test for clipping text based on the clipping rectangle parameter.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented  
+	
+@SYMTestActions
+    Set the origin to a non-zero position.
+ 	Draw a text "text" on screen at various positions using
+	incremented box size.
+	
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawText::TestTextBoxVertical()
+	{	
+	_LIT(KTestName, "Text-BoxClippingVertical"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+	iGc->SetBrushStyle(DirectGdi::ESolidBrush);
+	iGc->SetBrushColor(TRgb(150, 150, 150));
+	iGc->SetOrigin(TPoint(2, -2));
+
+	_LIT(KText, "test");
+
+	TInt baseline = 2 + iFont->FontMaxAscent()/2;
+	
+	TPositionIterator posIterator(0, KDrawTextDefaultSize.iWidth, 14, 0, KDrawTextDefaultSize.iHeight, 40);
+	posIterator.Begin();
+	
+	do
+		{
+		TRect rect(TPoint(posIterator.iPosX, posIterator.iPosY), TSize(posIterator.iIndexY, posIterator.iIndexX));
+		if(!rect.IsEmpty())
+			{
+			iGc->DrawTextVertical(KText, NULL, rect, baseline, EFalse);
+			}
+		}
+	while(posIterator.Next());
+	
+	iGc->ResetFont();
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0006
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Testing usage of pen colour, brush colour, style and pattern.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented 
+	
+@SYMTestActions 	
+	Test pen and brush parameters with text drawing methods.
+	Use color and brush style tables to generate various combinations
+	of pen color, brush color and brush style. Text drawing on screen
+	describes current color and style settings.  
+	*NOTE extended for DEF133363-Zero length text causes no brush pattern to be drawn
+	
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawText::TestPenBrushL()
+	{
+	_LIT(KTestName, "Text-PenBrush"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	_LIT(KTxtPenBrushStyle,"PenColor-BrushColor-BrushStyle");
+	_LIT(KTxtDash,"-");
+	
+	CFbsBitmap* bitmap = CreateCheckedBoardBitmapL(iTestParams.iTargetPixelFormat, (TSize(100, 100)));
+	TESTL(bitmap != NULL);
+	CleanupStack::PushL(bitmap);
+
+	ResetGc();
+	
+	iGc->SetBrushPattern(*bitmap);
+	
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+
+	TPoint point(22,10);
+	TRect rect;
+	TInt ii,baseline;
+	
+	//vertical
+	for(ii = 0; ii<16; ii++)
+		{
+		iGc->SetPenColor(KColor16Table[ii%16]);
+		point.iX =26 + ii*17;
+		iGc->DrawTextVertical(KColor16TableNames[ii%16],NULL,point,EFalse);
+		}
+
+	point.SetXY(3,110);
+	iGc->SetPenColor(KRgbBlack);
+	iGc->DrawTextVertical(KTxtPenBrushStyle,NULL,point,EFalse);
+	point.SetXY(20,110);
+	for(ii = 0; ii<16; ii++)
+		{
+		point.iX =20+ii*17;
+		TBuf<200> txtbuf;
+		iGc->SetPenColor(KColor16Table[ii%16]);
+		txtbuf.Append(KColor16TableNames[ii%16]);
+		txtbuf.Append(KTxtDash);
+		
+		iGc->SetBrushColor(KColor16Table[(5*ii+1)%16]);
+		txtbuf.Append(KColor16TableNames[(5*ii+1)%16]);
+		txtbuf.Append(KTxtDash);
+		
+		iGc->SetBrushStyle(KBrushStyleTable[(2*ii+1)%9]);
+		txtbuf.Append(KBrushStyleTableNames[(2*ii+1)%9]);
+		
+		if (ii == 6 || ii == 7 || ii == 8)
+			{	//for DEF133363
+			txtbuf.SetLength(0);
+			}
+		
+		rect.SetRect(point.iX,point.iY,point.iX+17,point.iY+290);
+		baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+		iGc->DrawTextVertical(txtbuf,NULL,rect,baseline,EFalse);
+		}
+
+	//horizontal
+	point.SetXY(300,17);
+	iGc->SetPenColor(KRgbBlack);
+	iGc->DrawText(KTxtPenBrushStyle,NULL,point);
+	for(ii=0; ii<16; ii++)
+		{
+		point.iY = 20+ii*17;
+		TBuf<200> txtbuf;
+		iGc->SetPenColor(KColor16Table[ii%16]);
+		txtbuf.Append(KColor16TableNames[ii%16]);
+		txtbuf.Append(KTxtDash);
+
+		iGc->SetBrushColor(KColor16Table[(3*ii+5)%16]);
+		txtbuf.Append(KColor16TableNames[(3*ii+5)%16]);
+		txtbuf.Append(KTxtDash);
+
+		iGc->SetBrushStyle(KBrushStyleTable[(5*ii+3)%9]);
+		txtbuf.Append(KBrushStyleTableNames[(5*ii+3)%9]);
+		
+		if (ii == 9 || ii == 10 || ii == 11)
+			{	//for DEF133363
+			txtbuf.SetLength(0);
+			}
+
+		rect.SetRect(point.iX,point.iY,point.iX+290,point.iY+17);
+		baseline = rect.Height() / 2 + iFont->AscentInPixels() / 2;
+		iGc->DrawText(txtbuf,NULL,rect,baseline);	
+		}
+
+	for(ii=0; ii<16; ii++)
+		{
+		point.iX = 300 + (ii%4)*80;
+		point.iY = 310 + (ii/4)*17;
+		iGc->SetPenColor(KColor16Table[ii%16]);
+		iGc->DrawText(KColor16TableNames[ii%16],NULL,point);
+		}
+
+
+	iGc->ResetFont();
+
+	CleanupStack::PopAndDestroy(bitmap);
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0007
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test for alignment of text inside drawing box.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented 
+	
+@SYMTestActions 	
+	Call functions testing all combinations of parameters values given below:
+	aAlignment:
+		DGDI::ELeft,
+		DGDI::ECenter,
+		DGDI::ERight
+	aMargin:
+		-50,
+		0,
+		50
+	aUp:
+		ETrue,
+		EFalse
+	Use gray background box to show arguments impact. 
+
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawText::TestAlign()
+	{
+	_LIT(KTestName, "Text-Alignment");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	ResetGc();
+
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+	iGc->SetBrushStyle(DirectGdi::ESolidBrush);
+	iGc->SetBrushColor(KRgbGray);
+
+	_LIT(KMargin," Margin = ");
+	_LIT(KAlign,"Align = ");
+	TRect rect;
+	TInt baseline;
+
+	//vertical
+	for(TInt kk=0; kk<2; kk++) //loop over up and down directions
+		{
+		for(TInt ii=0; ii<3; ii++) // negative, zero and positive margin value
+			{
+			TInt margin = (-ii+1)*50;
+			for(TInt jj=0; jj<3; jj++) // ELeft, ECenter and ERight alignment values
+				{
+				rect.SetRect(kk*185+5+(3*ii+jj)*20 +1, 10, kk*185+25+(3*ii+jj)*20-1, 390);
+				baseline = rect.Width()/2 + iFont->AscentInPixels()/2 ;
+				TBuf<128> textbuf;
+				textbuf.Copy(KAlign);
+				textbuf.Append(KTextAlignTableNames[jj%3]);
+				textbuf.Append(KMargin);
+				textbuf.AppendNum(margin);
+				iGc->DrawTextVertical(textbuf,NULL,rect,baseline,kk!=0,KTextAlignTable[jj%3],margin);
+				}
+			}
+		}
+
+	//horizontal
+	for(TInt ii=0; ii<3; ii++) // negative, zero and positive margin value
+		{
+		TInt margin = (-ii+1)*40;
+		for(TInt jj=0; jj<3; jj++) // ELeft, ECenter and ERight alignment values
+			{
+			rect.SetRect(373, 30+(3*ii+jj)*20+1, 635, 50+(3*ii+jj)*20-1);
+			baseline = rect.Height()/2 + iFont->AscentInPixels()/2;
+			TBuf<128> textbuf;
+			textbuf.Copy(KAlign);
+			textbuf.Append(KTextAlignTableNames[jj%3]);
+			textbuf.Append(KMargin);
+			textbuf.AppendNum(margin);
+			iGc->DrawText(textbuf,NULL,rect,baseline,KTextAlignTable[jj%3],margin);
+			}
+		}
+
+	iGc->ResetFont();
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0008
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Testing justification of a text.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Initial version 
+	
+@SYMTestActions 	
+	Test the effect of the following functions:
+	SetCharJustification()
+	SetWordJustification()
+	UpdateJustification()
+	UpdateJustificationVertical()
+	NoJustifyAutoUpdate() 
+	
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+
+*/
+void CTDrawText::TestJustification()
+	{
+	_LIT(KTestName, "Text-Justification"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	ResetGc();
+
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+
+	//vertical
+	TInt charExcessWidth = 30;
+	TInt charNumGaps = 30;
+	TInt wordExcessWidth = 100;
+	TInt wordNumChars = 5;
+
+	TRect rect;
+	TInt baseline, kk, jj;
+	for( kk=0; kk<2; kk++) //loop over up and down directions
+		{
+		for( jj=0; jj<4; jj++) 
+			{
+			iGc->SetCharJustification(charExcessWidth*(jj%2) , charNumGaps*(jj%2));
+			iGc->SetWordJustification(wordExcessWidth*(jj>>1), wordNumChars*(jj>>1));
+			rect.SetRect(10+(5*kk+jj)*20+1, 10, 30+(5*kk+jj)*20-1, 390);
+			baseline = rect.Width()/2 + iFont->AscentInPixels()/2;
+			iGc->DrawTextVertical(KPangram,NULL,rect,baseline,kk!=0);
+			}
+		}
+
+	//horizontal
+	for( jj=0; jj<4; jj++)
+		{
+		iGc->SetCharJustification(charExcessWidth*(jj%2) , charNumGaps*(jj%2));
+		iGc->SetWordJustification(wordExcessWidth*(jj>>1), wordNumChars*(jj>>1));
+		rect.SetRect(210, 10+jj*20+1, 640, 30+jj*20-1);
+		baseline = rect.Height()/2 + iFont->AscentInPixels()/2;
+		iGc->DrawText(KPangram,NULL,rect,baseline);
+		}
+
+	iGc->ResetFont();
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0009
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Testing usage of shadow colour, underline and strikethrough rendering using either BitGDI or DirectGDI gc.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented 
+	
+@SYMTestActions 	
+	Test the shadow colour, underline and strikethrough parameters for text drawing. 
+	
+@SYMTestExpectedResults 
+	Valid bitmap should be created. This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawText::TestShadowUnderStrike()
+	{
+	_LIT(KTestName, "Text-ShadowUnderlineStrikethrough"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+
+	//look-up tables, simplifies below loops
+	const DirectGdi::TFontUnderline KFontUnderlineTable[]=
+		{
+		DirectGdi::EUnderlineOn,
+		DirectGdi::EUnderlineOff,
+		DirectGdi::EUnderlineOn,
+		DirectGdi::EUnderlineOff,
+		DirectGdi::EUnderlineOn,
+		};
+
+	const DirectGdi::TFontStrikethrough KFontStrikethroughTable[]=
+		{
+		DirectGdi::EStrikethroughOff,
+		DirectGdi::EStrikethroughOn,
+		DirectGdi::EStrikethroughOn,
+		DirectGdi::EStrikethroughOff,
+		DirectGdi::EStrikethroughOn,
+		};
+	
+	//vertical
+	TPoint position;
+	for(TInt ii=0; ii<2; ii++ ) //loop over up and down directions
+		{
+		position.SetXY(10+ii*100,10+ii*380);
+		for(TInt jj=0; jj<5; jj++)
+			{
+			iGc->SetUnderlineStyle(KFontUnderlineTable[jj%5]);
+			iGc->SetStrikethroughStyle(KFontStrikethroughTable[jj%5]);
+			if(jj==3)
+				{
+				iGc->SetTextShadowColor(TRgb(100,10,10));
+				}
+			iGc->DrawTextVertical(KPangram,NULL,position,ii!=0);
+			position.iX+=20;
+			}
+		}
+
+	//horizontal
+	position.SetXY(210,30);
+	for(TInt jj=0; jj<5; jj++)
+		{
+		iGc->SetUnderlineStyle(KFontUnderlineTable[jj%5]);
+		iGc->SetStrikethroughStyle(KFontStrikethroughTable[jj%5]);
+		if(jj==3)
+			{
+			iGc->SetTextShadowColor(TRgb(100,10,10));
+			}
+		iGc->DrawText(KPangram,NULL,position);
+		position.iY+=20;
+		}
+
+	iGc->ResetFont();
+
+	TESTNOERROR(iGc->GetError());
+	TEST(KErrNone == WriteTargetOutput(iTestParams, TPtrC(KTestName)));
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-TEXT-0010
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test for propper handling invalid arguments using either BitGDI or DirectGDI gc.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented 
+	
+@SYMTestActions 	
+	Test for propper handling invalid arguments for text drawing using either BitGDI or DirectGDI gc.  
+	
+@SYMTestExpectedResults 
+	Function shall detect invalid parameters and return. Nothing will be drawn on the target surface.
+*/
+void CTDrawText::TestInvalidParamsL()
+	{
+	_LIT(KTestName, "Text-InvalidParameters"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	iGc->SetFont(iFont);
+	TEST(iGc->HasFont());
+	iGc->SetPenColor(TRgb(0, 0, 0));
+	
+	//NullDescriptor - drawing an empty descriptor is not an error, DrawText()
+	//and DrawTextVertical() should return silently in this case.
+	//horizontal
+	iGc->DrawText(KNullDesC, NULL, TPoint(10, 30));
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	iGc->DrawText(KNullDesC, NULL);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	
+	TRect rect(10,50,300,70);
+	TInt baseline = rect.Height() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawText(KNullDesC,NULL,rect,baseline);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	rect.SetRect(10,70,550,90);
+	iGc->DrawText(KNullDesC,NULL,rect);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+
+	//vertical
+	iGc->DrawTextVertical(KNullDesC,NULL,TPoint(10,10),EFalse);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	iGc->DrawTextVertical(KNullDesC,NULL,EFalse);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	rect.SetRect(30,10,50,300);
+	baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KNullDesC,NULL,rect,baseline,EFalse);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	rect.SetRect(50,10,80,300);
+	baseline = rect.Width() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KNullDesC,NULL,rect,baseline,10,EFalse);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+	rect.SetRect(50,100,80,400);
+	iGc->DrawTextVertical(KNullDesC,NULL,rect,EFalse);
+	CheckErrorsL(KErrNone, KErrNone, (TText8*)__FILE__, __LINE__);
+
+	//invalid box
+	for(TInt ii=1; ii<9; ii++)
+		{
+		rect.SetRect(220+(ii%3)*100, 100+(ii/3)*100, 320, 200);
+		baseline = Abs(rect.Height())/2 + iFont->AscentInPixels()/2;
+		iGc->DrawText(KPangram,NULL,rect,baseline);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+		iGc->DrawText(KPangram,NULL,rect);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		baseline = Abs(rect.Width())/2 + iFont->AscentInPixels() /2;
+		iGc->DrawTextVertical(KPangram,NULL,rect,baseline,EFalse);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		iGc->DrawTextVertical(KPangram,NULL,rect,EFalse);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		iGc->DrawTextVertical(KPangram,NULL,rect,baseline,10,EFalse);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+		}
+		
+	//invalid aAlignment
+	rect.SetRect(10,320,300,540);
+	baseline = rect.Height() / 2 + iFont->AscentInPixels() / 2;
+	iGc->DrawText(KPangram,NULL,rect,baseline, (DirectGdi::TTextAlign) 5 );
+	CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+	rect.SetRect(540,10,560,350);
+	baseline = rect.Width() /2 + iFont->AscentInPixels() / 2;
+	iGc->DrawTextVertical(KPangram,NULL,rect,baseline,10, EFalse , (DirectGdi::TTextAlign) 5 );
+	CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+	iGc->ResetFont();	
+	}
+	
+/**
+Override of base class pure virtual
+Lists the tests to be run
+*/
+void CTDrawText::RunTestsL()
+	{
+	MFontGlyphImageStorage* glyphStorage = NULL;
+	iGc->GetInterface(TUid::Uid(KDirectGdiGetGlyphStorageUid), (TAny*&) glyphStorage);
+	if(glyphStorage)
+		{
+		glyphStorage->CleanGlyphImageCache();
+		CleanupStack::PushL(TCleanupItem(CleanCache, glyphStorage));
+		}
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0001"));
+	TestBasicFunctionality();
+	RecordTestResultL();
+	if(!iRunningOomTests)
+		{
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0002"));
+		TestTextPositioning();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0003"));
+		TestTextBox();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0004"));
+		TestTextPositioningVertical(EFalse);
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0004"));
+		TestTextPositioningVertical(ETrue);
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0005"));
+		TestTextBoxVertical();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0008"));
+		TestJustification();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0009"));
+		TestShadowUnderStrike();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0007"));
+		TestAlign();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0006"));
+		TestPenBrushL();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-TEXT-0010"));
+		TestInvalidParamsL();
+		RecordTestResultL();
+		}
+
+	if(glyphStorage)
+		{
+		glyphStorage->CleanGlyphImageCache();
+		CleanupStack::Pop(glyphStorage);
+		}
+	}
+
+
+