graphicsdeviceinterface/bitgdi/tbit/TCLIP.CPP
author Gareth Stockwell <gareth.stockwell@accenture.com>
Fri, 05 Nov 2010 17:31:20 +0000
branchbug235_bringup_0
changeset 215 097e92a68d68
parent 0 5d03bc08d59c
permissions -rw-r--r--
Added GLES 1.x spinning cube-rendering code to eglbringuptest The coordinate, color and index data are uploaded to server-side buffers by the CGLES1Cube::KhrSetup function. CGLES1Cube::KhrPaint just sets the view matrix and issues a draw command. Which demo to display can be selected by passing its name on the command line, e.g. eglbringuptest vgline eglbringuptest gles1cube If no name is provided, the application defaults to vgline.

// Copyright (c) 1997-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 <bitdev.h>
#include <hal.h>
#include "TBMP.H"
#include "TClip.h"
#include <graphics/fbsdefs.h>

//Note: Some display modes will be scaled - see 
//CreateTestEnvironment(), SetScalingFactor() call

//aTestAppNo is a new argument and it is not used yet.
//It can have 0 or 1 value depending on which test app 
//uses TestClip functionality - TClip or TClip2.
CTClip::CTClip(CTestStep* aStep,
					TInt aTestAppNo,
					CFbsScreenDevice* aDev,
					CFbsBitGc* aCon,
					CFbsBitmap* aBmp,
					CFbsFont* aFont,
				   	CFbsFont* aLargeFont):
	CTGraphicsBase(aStep),
	iTestAppNo(aTestAppNo),
	iDev(aDev),
	iCon(aCon),
	iClientRect(TRect(0,0,0,0)),
	iGopNum(EFirstGop),
	iClipList(NULL),
	iBitmap(aBmp),
	iBitmap64K(NULL),
	iBitmap16MU(NULL),
	iBitmap16MA(NULL), 
	iBitmapMask(NULL),
	iBitmapAlpha(NULL),
	iFont(aFont),
	iLargeFont(aLargeFont),
	iBmpSize(TSize(0,0))
	{}

void CTClip::ConstructL()
	{
	iClipList=(TRect*)User::Alloc(sizeof(TRect)*ERegions);
	if(!iClipList)
		User::Panic(_L("Construct failure"),KErrGeneral);
	iBmpSize=iBitmap->SizeInPixels();
	iBitmap64K=new(ELeave) CFbsBitmap();
	iBitmap16MU=new(ELeave) CFbsBitmap();
	iBitmap16MA=new(ELeave) CFbsBitmap();
	iBitmapMask=new(ELeave) CFbsBitmap();
	iBitmapAlpha=new(ELeave) CFbsBitmap();
	}

TBool CTClip::SetUpTest(TInt &aTestModeIndex)
	{
	CFbsBitGc::TGraphicsOrientation orientation;
	do
		{
		orientation=(CFbsBitGc::TGraphicsOrientation)(aTestModeIndex/2);
		if (orientation>CFbsBitGc::EGraphicsOrientationRotated270)
			return(EFalse);
		aTestModeIndex++;
		TPoint scalingOrigin(0,0);
		TInt scale=1;
		if ((aTestModeIndex&0x1)==CFbsBitGc::EGraphicsOrientationNormal)
			{
			scalingOrigin=TPoint(20, 10);
			scale=2;
			}
		iDev->SetScalingFactor(scalingOrigin, scale, scale, 1, 1);
		} while(!iCon->SetOrientation(orientation));
	iDev->GetDrawRect(iClientRect);
	TInt dims[2*ERegions]={0,0, 1,1, 1,2, 2,1, 2,2, 1,10, 10,1, 2,10, 10,2, 10,10};
	for(TUint count=0;count<ERegions;count++)
		{
		iClipList[count].iTl.iX=iClientRect.iBr.iX*2/3;
		iClipList[count].iTl.iY=iClientRect.iBr.iY/3;
		iClipList[count].iBr.iX=iClipList[count].iTl.iX+dims[count*2];
		iClipList[count].iBr.iY=iClipList[count].iTl.iY+dims[count*2+1];
		}
	iDev->SetAutoUpdate(ETrue);
	iCon->SetPenStyle(CGraphicsContext::ESolidPen);
	iCon->SetPenColor(KRgbBlack);
	iCon->SetBrushStyle(CGraphicsContext::ESolidBrush);
	iCon->SetBrushColor(TRgb(170,170,170));
	Clear();
	iCon->UseBrushPattern(iBitmap);

	TSize halfScreen(iClientRect.Width()/2-2, iClientRect.Height()-2);
	User::LeaveIfError(iBitmap64K->Load(_L("z:\\system\\data\\16ram.mbm"),0,EFalse));
	User::LeaveIfError(iBitmap64K->Resize(halfScreen));
	User::LeaveIfError(iBitmap16MU->Load(_L("z:\\system\\data\\32ram.mbm"),0,EFalse));
	User::LeaveIfError(iBitmap16MU->Resize(halfScreen));

	User::LeaveIfError(iBitmap16MA->Load(_L("z:\\system\\data\\32ram.mbm"),0,EFalse));
	User::LeaveIfError(iBitmap16MA->Resize(halfScreen));
	User::LeaveIfError(iBitmapMask->Create(halfScreen, EGray2));
	User::LeaveIfError(iBitmapAlpha->Create(halfScreen, EGray256));
	return(ETrue);
	}

inline CTClipStep* CTClip::Step()
	{
	return static_cast<CTClipStep*>(iStep);
	}

void CTClip::Clear()
	{
	iCon->SetPenStyle(CGraphicsContext::ENullPen);
	iCon->SetBrushColor(KRgbWhite);
	iCon->DrawRect(iClientRect);
	iCon->SetPenStyle(CGraphicsContext::ESolidPen);
	iCon->SetBrushColor(TRgb(170,170,170));
	}

CTClip::~CTClip()
	{
	for(TInt i=0;i<ERegions;i++)
		{
		iClipList[i].~TRect();
		}
	User::Free(iClipList);
	delete iBitmap64K;
	delete iBitmap16MU;
	delete iBitmapMask;
	delete iBitmapAlpha;
	delete iBitmap16MA;
	}

void CTClip::RunTestCaseL(const TInt aCurTestCase)
	{
	((CTClipStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
	switch(aCurTestCase)
		{
	case 1:
		((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0042"));
		TestComplexRgn();
		INFO_PRINTF1(_L("Complex Rgn Test complete"));
		break;
	case 2:
		((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0038"));
		TestRectRgn();
		INFO_PRINTF1(_L("Rect Rgn Test complete"));
		break;
	case 3:
#if !defined(__X86GCC__)		//Tests take too long to run and don't test anything useful anyway
		((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0039"));
		TestSimpleRgn();
		INFO_PRINTF1(_L("Simple Rgn Test complete"));
		break;
	case 4:
		((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0041"));
		TestHoriRgn();
		INFO_PRINTF1(_L("Horizontal Rgn Test complete"));
		break;
	case 5:
		((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0040"));
		TestVertRgn();
		INFO_PRINTF1(_L("Vertical Rgn Test complete"));
		break;
	case 6:
#endif	//__X86GCC__
		((CTClipStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
		((CTClipStep*)iStep)->CloseTMSGraphicsStep();
		INFO_PRINTF1(_L("Test complete\n"));
		TestComplete();
		break;
		}
	((CTClipStep*)iStep)->RecordTestResultL();
	}

/**
  @SYMTestCaseID GRAPHICS-BITGDI-0038
 
  @SYMDEF             

  @SYMTestCaseDesc Tests clipping to a rect region
   
  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Iterates through a number of regions and graphic operations testing clipping with each
 
  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
*/
void CTClip::TestRectRgn()
	{
	TInt testMode=0;
	while(SetUpTest(testMode))
		{
		for(TUint j=0;j<ERegions;j++)
			{
			TRect reg=iClipList[j];
			for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
				{
				RRegion rectreg(reg);
				DrawToScreen(rectreg,iClientRect);
				rectreg.Close();
				ScanArea(iClientRect.iBr.iX/2,iClientRect.iTl.iY,iClientRect.iBr.iX/2,reg.iTl.iY-iClientRect.iTl.iY); // above
				ScanArea(iClientRect.iBr.iX/2,reg.iTl.iY,reg.iTl.iX-iClientRect.iBr.iX/2,reg.Height()); // left
				ScanArea(reg.iBr.iX,reg.iTl.iY,iClientRect.iBr.iX-reg.iBr.iX,reg.Height()); // right
				ScanArea(iClientRect.iBr.iX/2,reg.iBr.iY,iClientRect.iBr.iX/2,iClientRect.iBr.iY-reg.iBr.iY); // below
				CheckInside(reg,iClientRect);
				}
			}
		}
	}

/**
  @SYMTestCaseID GRAPHICS-BITGDI-0039
 
  @SYMDEF             

  @SYMTestCaseDesc Tests clipping to a simple region
   
  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Iterates through a number of simple regions and graphic operations testing clipping with each
 
  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
*/
void CTClip::TestSimpleRgn()
	{
	TInt testMode=0;
	while(SetUpTest(testMode))
		{
		for(TUint j=0;j<ERegions;j++)
			{
			TRect reg=iClipList[j];
			for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
				{
				DrawToScreen(reg,iClientRect);
				ScanArea(iClientRect.iBr.iX/2,iClientRect.iTl.iY,iClientRect.iBr.iX/2,reg.iTl.iY); // above
				ScanArea(iClientRect.iBr.iX/2,reg.iTl.iY,reg.iTl.iX-iClientRect.iBr.iX/2,reg.Height()); // left
				ScanArea(reg.iBr.iX,reg.iTl.iY,iClientRect.iBr.iX-reg.iBr.iX,reg.Height()); // right
				ScanArea(iClientRect.iBr.iX/2,reg.iBr.iY,iClientRect.iBr.iX/2,iClientRect.iBr.iY-reg.iBr.iY); // below
				CheckInside(reg,iClientRect);
				}
			}
		}
	}

/**
  @SYMTestCaseID GRAPHICS-BITGDI-0040
 
  @SYMDEF             

  @SYMTestCaseDesc Tests clipping to a vertical region
   
  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Iterates through a number of regions of different widths and graphic operations testing clipping with each
 
  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
*/
void CTClip::TestVertRgn()
	{
	TInt widths[3]={1,2,5};
	TInt testMode=0;
	while(SetUpTest(testMode))
		{
		for(TInt count=0;count<3;count++) // check vertical strips
			{
			TInt i=widths[count];
			for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
				{
				for(TInt j=0;j<iClientRect.iBr.iX/2-i;j+=35)
					{
					TRect reg=TRect(iClientRect.iBr.iX/2+j,iClientRect.iTl.iY,iClientRect.iBr.iX/2+j+i,iClientRect.iBr.iY);
					RRegion rectreg(reg);
					DrawToScreen(rectreg,iClientRect);
					rectreg.Close();
		 			ScanArea(iClientRect.iBr.iX/2,reg.iTl.iY,reg.iTl.iX-iClientRect.iBr.iX/2,reg.Height()); // left
					ScanArea(reg.iBr.iX,reg.iTl.iY,iClientRect.iBr.iX-reg.iBr.iX,reg.Height()); // right
					CheckInside(reg,iClientRect);
					}
				}
			}
		}
	}

/**
  @SYMTestCaseID GRAPHICS-BITGDI-0041
 
  @SYMDEF             

  @SYMTestCaseDesc Tests clipping to a horizontal region
   
  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Iterates through a number of regions of different widths and graphic operations testing clipping with each
 
  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
*/
void CTClip::TestHoriRgn()
	{
	TInt widths[3]={1,2,5};
	TInt testMode=0;
	while(SetUpTest(testMode))
		{
		for(TInt count=0;count<3;count++) // check horizontal strips
			{
			TInt i=widths[count];
			for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
				{
				for(TInt j=0;j<iClientRect.iBr.iY;j+=35)
					{
					TRect reg=TRect(iClientRect.iBr.iX/2,j,iClientRect.iBr.iX,j+i);
					RRegion rectreg(reg);
					DrawToScreen(rectreg,iClientRect);
					rectreg.Close();
					ScanArea(iClientRect.iBr.iX/2,iClientRect.iTl.iY,iClientRect.iBr.iX/2,reg.iTl.iY); // above
					ScanArea(iClientRect.iBr.iX/2,reg.iBr.iY,iClientRect.iBr.iX/2,iClientRect.iBr.iY-reg.iBr.iY); // below
					CheckInside(reg,iClientRect);
					}
				}
			}
		}
	}

/**
  @SYMTestCaseID GRAPHICS-BITGDI-0042
 
  @SYMDEF             

  @SYMTestCaseDesc Tests clipping to a complex region
   
  @SYMTestPriority High

  @SYMTestStatus Implemented

  @SYMTestActions Creates a complex region then iterates through graphic operations testing clipping with each
 
  @SYMTestExpectedResults Test should perform graphics operations succesfully. 
*/
void CTClip::TestComplexRgn()
	{
	TInt testMode=0;
	while(SetUpTest(testMode))
		{
		TRect rect[8];
		rect[0].SetRect(iClientRect.iBr.iX*12/20,0,iClientRect.iBr.iX*15/20,iClientRect.iBr.iY/4);
		rect[1].SetRect(iClientRect.iBr.iX*11/20,iClientRect.iBr.iY/8,iClientRect.iBr.iX*13/20,iClientRect.iBr.iY/2);
		rect[2].SetRect(iClientRect.iBr.iX*14/20,iClientRect.iBr.iY/8,iClientRect.iBr.iX*17/20,iClientRect.iBr.iY/2);
		rect[3].SetRect(iClientRect.iBr.iX*12/20,iClientRect.iBr.iY*3/8,iClientRect.iBr.iX*18/20,iClientRect.iBr.iY*5/8);
		rect[4].SetRect(iClientRect.iBr.iX*13/20,iClientRect.iBr.iY*9/16,iClientRect.iBr.iX*19/20,iClientRect.iBr.iY*7/8);
		rect[5].SetRect(iClientRect.iBr.iX*17/20,iClientRect.iBr.iY*3/4,iClientRect.iBr.iX,iClientRect.iBr.iY);
		rect[6].SetRect(iClientRect.iBr.iX*11/20,iClientRect.iBr.iY*5/8,iClientRect.iBr.iX*11/20+1,iClientRect.iBr.iY*5/8+1);
		rect[7].SetRect(iClientRect.iBr.iX*18/20,iClientRect.iBr.iY/8,iClientRect.iBr.iX*18/20,iClientRect.iBr.iY/8);
		TRect space[12];
		space[0].SetRect(iClientRect.iBr.iX/2,0,rect[1].iTl.iX,rect[1].iBr.iY);
		space[1].SetRect(space[0].iBr.iX,0,rect[0].iTl.iX,rect[1].iTl.iY);
		space[2].SetRect(rect[0].iBr.iX,0,rect[2].iBr.iX,rect[2].iTl.iY);
		space[3].SetRect(rect[2].iBr.iX,0,iClientRect.iBr.iX,rect[3].iTl.iY);
		space[4].SetRect(rect[1].iBr.iX,rect[0].iBr.iY,rect[2].iTl.iX,rect[3].iTl.iY);
		space[5].SetRect(iClientRect.iBr.iX/2,rect[1].iBr.iY,rect[3].iTl.iX,rect[6].iTl.iY);
		space[6].SetRect(iClientRect.iBr.iX/2,rect[6].iTl.iY,rect[6].iTl.iX,rect[6].iBr.iY);
		space[7].SetRect(iClientRect.iBr.iX/2,rect[6].iBr.iY,rect[6].iBr.iX,iClientRect.iBr.iY);
		space[8].SetRect(rect[6].iBr.iX,rect[6].iTl.iY,rect[4].iTl.iX,iClientRect.iBr.iY);
		space[9].SetRect(rect[4].iTl.iX,rect[4].iBr.iY,rect[5].iTl.iX,iClientRect.iBr.iY);
		space[10].SetRect(rect[4].iBr.iX,rect[4].iTl.iY,iClientRect.iBr.iX,rect[5].iTl.iY);
		space[11].SetRect(rect[3].iBr.iX,rect[3].iTl.iY,iClientRect.iBr.iX,rect[4].iTl.iY);
		RRegion creg(rect[0],8);
		creg.AddRect(rect[1]);
		creg.AddRect(rect[2]);
		creg.AddRect(rect[3]);
		creg.AddRect(rect[4]);
		creg.AddRect(rect[5]);
		creg.AddRect(rect[6]);
		creg.AddRect(rect[7]);
		for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
			{
			DrawToScreen(creg,iClientRect);
			TInt count=0;
			for(;count<8;count++)
				CheckInside(rect[count],iClientRect);
			for(count=0;count<12;count++)
				ScanArea(space[count].iTl.iX,space[count].iTl.iY,space[count].iBr.iX-space[count].iTl.iX,space[count].iBr.iY-space[count].iTl.iY);
			}
		creg.Close();
		}
	}

void CTClip::ScanArea(TInt x,TInt y,TInt length,TInt height)
	{
	if (length<1 || height<1)
		{
		return;
		}

	HBufC8* buf = HBufC8::NewL(length * 4);
	TPtr8 des = buf->Des();
	
	for (TInt row=0; row<height; row++)
		{
		TPoint point(x, y+row);
		
		des.Zero();
		iDev->GetScanLine(des,point,length,EColor16MA);
		
		for(TInt i=0; i<des.Length(); i++)
			{
			if(des[i] != 0xFF)
				{
				INFO_PRINTF1(_L("Clipping failure outside!\n"));
				INFO_PRINTF2(_L("Graphics operation: %d\n"),iGopNum);
				INFO_PRINTF5(_L("x=%d, y=%d, length=%d, height=%d\n"),x,y,length,height);
				INFO_PRINTF3(_L("Index=%d, Found=%x, Expected=0xFF\n"),i,des[i]);
				TEST(0);
				delete buf;
				return;
				}
			}
		}
				
	delete buf;
	}

void CTClip::CheckInside(const TRect& aClip,const TRect& aRect)
	{
	const TInt length=aClip.Width();
	const TInt unOffsetX=-(aRect.iBr.iX/2);
#if defined(__X86GCC__) || defined(__MARM__)
	const TInt KMaxLinesToPrint=2;
#else
	const TInt KMaxLinesToPrint=10;
#endif

	HBufC8* unBuf = HBufC8::NewL(length * 4);
	HBufC8* clBuf = HBufC8::NewL(length * 4);
	
	TPtr8 unDes = unBuf->Des();
	TPtr8 clDes = clBuf->Des();

	TInt linesDiffs=0;
	for (TUint yy=aClip.iTl.iY; yy<aClip.iBr.iY; yy++)
		{
		TPoint unPoint(aClip.iTl.iX+unOffsetX, yy);
		TPoint clPoint(aClip.iTl.iX,           yy);
		
		unDes.Zero();
		clDes.Zero();
		iDev->GetScanLine(unDes,unPoint,length,EColor16MA);
		iDev->GetScanLine(clDes,clPoint,length,EColor16MA);
		
		TInt different = unDes.Compare(clDes);
		if (different)
			{
			if (linesDiffs++<KMaxLinesToPrint)
				{
				_LIT(KDots,"..");
				_LIT(KStart,"|.");
				_LIT(KEnd,".|");
				const TInt KMaxNumBytesToLog=14;
				TBuf<8*KMaxNumBytesToLog> buf1,buf2;
				TInt end=Min(length,KMaxNumBytesToLog);
				end*=4;
				TInt ii;
				TInt matches=ETrue;
				for (ii=0; ii<end; ++ii)
					{
					_LIT(KHex,"%02x");
					buf1.AppendFormat(KHex,unDes[ii]);
					if (unDes[ii]!=clDes[ii])
						{
						buf2.AppendFormat(KHex,clDes[ii]);
						matches=EFalse;
						}
					else
						{		//Show each pixel as |......| on the 2nd line if it matches
						TPtrC ptr(KDots);
						switch (ii%4)
							{
						case 0:
							ptr.Set(KStart);
							break;
						case 3:
							ptr.Set(KEnd);
							break;
							}
						buf2.Append(ptr);
						}
					}
				TBuf<256> buf;
				if (!matches)
					{
					_LIT(KLog,"ClipRect (%d,%d,%d,%d)  Row=%d  (First %d of %d pixels shown, only differing values shown on comparison line)");
					buf.Format(KLog,aClip.iTl.iX,aClip.iTl.iY,aClip.iBr.iX,aClip.iBr.iY,yy,end,aClip.Width());
					INFO_PRINTF1(buf);
					INFO_PRINTF1(buf1);
					INFO_PRINTF1(buf2);
					}
				else
					{
					_LIT(KLog,"ClipRect (%d,%d,%d,%d)  Row=%d  (First %d of %d pixels all match)");
					buf.Format(KLog,aClip.iTl.iX,aClip.iTl.iY,aClip.iBr.iX,aClip.iBr.iY,yy,end,aClip.Width());
					INFO_PRINTF1(buf);
					}
				}
			}
		}
	if (linesDiffs>0)
		{
		_LIT(KLog,"Clipping failure inside!  Graphics operation: %d  Lines With Diffs: %d/%d");
		INFO_PRINTF4(KLog,iGopNum,linesDiffs,aClip.iBr.iY-aClip.iTl.iY);
		}
	if (!Step()->IgnoreDiffs())
		TEST(linesDiffs==0);

	delete unBuf;
	delete clBuf;
	}

void CTClip::DrawToScreen(TRegion& clip_reg,TRect r)
	{
	Clear();
	TRect halfWid(r);
	halfWid.iBr.iX=halfWid.iBr.iX/2;
	iCon->SetClippingRect(halfWid);
	DoDraw(r,EFalse);
	iCon->CancelClippingRect();
	iCon->SetClippingRegion(&clip_reg);
	iCon->SetOrigin(TPoint(r.iBr.iX/2,0));
	DoDraw(r,ETrue);
	iCon->CancelClippingRegion();
	iCon->SetOrigin(TPoint(0,0));
	}

void CTClip::DrawToScreen(const TRect& cliprect,TRect r)
	{
	Clear();
	TRect halfWid(r);
	halfWid.iBr.iX=halfWid.iBr.iX/2;
	iCon->SetClippingRect(halfWid);
	DoDraw(r,EFalse);
	iCon->SetClippingRect(cliprect);
	iCon->SetOrigin(TPoint(r.iBr.iX/2,0));
	DoDraw(r,ETrue);
	iCon->CancelClippingRect();
	iCon->SetOrigin(TPoint(0,0));
	}

void CTClip::DoDraw(TRect r,TBool clipped)
	{
	TRect sh;
	TPoint p,z;
	switch(iGopNum)
		{
	case EPlot:
		iCon->Plot(TPoint(r.iBr.iX/6-10,r.iBr.iY/3-10));
		iCon->Plot(TPoint(r.iBr.iX/6,r.iBr.iY/3));
	break;
	case EDrawLine:
		p.SetXY(r.iBr.iX/2-1,r.iBr.iY+1);
		iCon->DrawLine(z,p);
	break;
	case EDottedLine:
		p.SetXY(r.iBr.iX/2-1,r.iBr.iY+1);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->DrawLine(z,p);
	break;
	case EDashedLine:
		p.SetXY(r.iBr.iX/2-1,r.iBr.iY+1);
		iCon->SetPenStyle(CGraphicsContext::EDashedPen);
		iCon->DrawLine(z,p);
	break;
	case EWideLine:
		p.SetXY(r.iBr.iX/2-11,r.iBr.iY-9);
		iCon->SetPenSize(TSize(5,5));
		iCon->DrawLine(z,p);
	break;
	case EDrawArc:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		p.SetXY(r.iBr.iX/2-1,0);
		iCon->DrawArc(sh,z,p);
	break;
	case EDottedArc:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		p.SetXY(r.iBr.iX/2-1,0);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->DrawArc(sh,z,p);
	break;
	case EDrawRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->DrawRect(sh);
	break;
	case EVerticalHatchRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EVerticalHatchBrush);
		iCon->DrawRect(sh);
	break;
	case EForwardDiagonalHatchRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EForwardDiagonalHatchBrush);
		iCon->DrawRect(sh);
	break;
	case EHorizontalHatchRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EHorizontalHatchBrush);
		iCon->DrawRect(sh);
	break;
	case ERearwardDiagonalHatchRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::ERearwardDiagonalHatchBrush);
		iCon->DrawRect(sh);
	break;
	case ESquareCrossHatchRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
		iCon->DrawRect(sh);
	break;
	case EDiamondCrossHatchRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
		iCon->DrawRect(sh);
	break;
	case EVerticalHatchEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EVerticalHatchBrush);
		iCon->DrawEllipse(sh);
	break;
	case EForwardDiagonalHatchEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EForwardDiagonalHatchBrush);
		iCon->DrawEllipse(sh);
	break;
	case EHorizontalHatchEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EHorizontalHatchBrush);
		iCon->DrawEllipse(sh);
	break;
	case ERearwardDiagonalHatchEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::ERearwardDiagonalHatchBrush);
		iCon->DrawEllipse(sh);
	break;
	case ESquareCrossHatchEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
		iCon->DrawEllipse(sh);
	break;
	case EDiamondCrossHatchEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
		iCon->DrawEllipse(sh);
	break;
	case EDottedRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->DrawRect(sh);
	break;
	case ECopyRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		if(clipped)
			{
			iCon->SetOrigin(z);
			iCon->CopyRect(TPoint(r.iBr.iX/2,0),sh);
			}
		else
			iCon->DrawRect(sh);
	break;
	case EDrawEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->DrawEllipse(sh);
	break;
	case EDottedEllipse:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->DrawEllipse(sh);
	break;
	case EDrawRoundRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		p.SetXY(r.iBr.iX>>2,r.iBr.iY>>4);
		iCon->DrawRoundRect(sh,p.AsSize());
	break;
	case EDottedRoundRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		p.SetXY(r.iBr.iX>>2,r.iBr.iY>>4);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->DrawRoundRect(sh,p.AsSize());
	break;
	case EDrawPie:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		p.SetXY(r.iBr.iX/2-1,0);
		iCon->DrawPie(sh,z,p);
	break;
	case EDottedPie:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		p.SetXY(r.iBr.iX/2-1,0);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->DrawPie(sh,z,p);
	break;
	case EDrawPolygon:
		{
		CArrayFixFlat<TPoint>* t=new CArrayFixFlat<TPoint>(3);
		TPoint temp(r.iBr.iX/6,r.iBr.iY/4);
		TRAPD(errCode, t->AppendL(temp));
		if(errCode != KErrNone)
			{
			return;
			}
		temp.SetXY(r.iBr.iX/12,r.iBr.iY/2);
		TRAP(errCode, t->AppendL(temp));
		if(errCode != KErrNone)
			{
			return;
			}
		temp.SetXY(r.iBr.iX/4,r.iBr.iY/2);
		TRAP(errCode, t->AppendL(temp));
		if(errCode != KErrNone)
			{
			return;
			}
		iCon->DrawPolygon(t);
		delete t;
		}
	break;
	case EDrawText:
		{
		iCon->UseFont(iFont);
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		iCon->DrawText(testtext,p);
		}
	break;
	case EBoxText:
		{
		iCon->UseFont(iFont);
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		TInt ascent=iFont->AscentInPixels();
		TInt height=iFont->HeightInPixels();
		TInt width=iFont->TextWidthInPixels(testtext);
		TRect box(p.iX,p.iY,p.iX+width,p.iY+height);
		iCon->DrawText(testtext,box,ascent);
		}
	break;
	case EDrawTextVertical:
		iCon->UseFont(iFont);
		p.SetXY(r.iBr.iX/6-13,r.iBr.iY/3+5);
		p.iX+=5;
		p.iY-=10;
		iCon->DrawTextVertical(testtext,p,EFalse);
	break;
	case ELargeText:
		iCon->UseFont(iLargeFont);
		p.SetXY(r.iBr.iX/6-13,r.iBr.iY/3+5);
		iCon->DrawText(largetesttext,p);
	break;
	case ELargeBoxText:
		{
		iCon->UseFont(iLargeFont);
		p.SetXY(r.iTl.iX, r.iTl.iY);
		TInt ascent=iLargeFont->AscentInPixels();
		TInt height=iLargeFont->HeightInPixels();
		TInt width=iLargeFont->TextWidthInPixels(largetesttext);
		TRect box(p.iX, p.iY, p.iX+width, p.iY+height);
		iCon->DrawText(largetesttext,box,ascent);
		}
	break;
	case ELargeTextVertical:
		iCon->UseFont(iLargeFont);
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		iCon->DrawTextVertical(largetesttext,p,EFalse);
	break;
	case EPaintRect:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->SetPenStyle(CGraphicsContext::EDottedPen);
		iCon->SetBrushStyle(CGraphicsContext::EPatternedBrush);
		iCon->DrawRect(sh);
	break;
	case EBitBltContext:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		if(clipped)
			{
			iCon->SetPenStyle(CGraphicsContext::ESolidPen);
			iCon->SetBrushStyle(CGraphicsContext::ESolidBrush);
			iCon->BitBlt(z,*iCon,sh);
			}
		else
			{
			iCon->SetPenStyle(CGraphicsContext::EDottedPen);
			iCon->SetBrushStyle(CGraphicsContext::EPatternedBrush);
			iCon->DrawRect(sh);
			}
	break;
	case EBitmapLarge:
		sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
		iCon->DrawBitmap(sh,iBitmap);
	break;
	case EBitmapSmall:
		p.SetXY(r.iBr.iX/6-40,r.iBr.iY/3-20);
		sh.SetRect(p,TSize(iBitmap->SizeInPixels().iWidth/2,iBitmap->SizeInPixels().iHeight/2));
		iCon->DrawBitmap(sh,iBitmap);
	break;
	case EBitBltBitmap:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);		
		iCon->BitBlt(p,iBitmap64K);
	break;
	case EDrawBitmap:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(p,iBitmap64K->SizeInPixels());
		iCon->DrawBitmap(sh,iBitmap);
	break;
	case EBitBltMasked:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
		iCon->BitBltMasked(p,iBitmap,sh,iBitmap,ETrue);
	break;
	case EBitBltMaskedBinary:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap,sh,iBitmapMask,EFalse);
	break;
	case EBitBltMaskedBinary64K:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap64K,sh,iBitmapMask,EFalse);
	break;
	case EBitBltMaskedBinary16MU:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap16MU->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap16MU,sh,iBitmapMask,EFalse);
	break;
	case EBitBltMaskedBinary16MA:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap16MA->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap16MA,sh,iBitmapMask,EFalse);
	break;	
	case EBitBltMaskedAlpha:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap,sh,iBitmapAlpha,EFalse);
	break;
	case EBitBltMaskedAlpha64K:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap64K,sh,iBitmapAlpha,EFalse);
	break;
	case EBitBltMaskedAlpha16MU:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap16MU->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap16MU,sh,iBitmapAlpha,EFalse);
	break;
	case EBitBltMaskedAlpha16MA:
		p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
		sh.SetRect(TPoint(0,0),iBitmap16MA->SizeInPixels());
		iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
		iCon->BitBltMasked(p,iBitmap16MA,sh,iBitmapAlpha,EFalse);
	break;
		}
	iCon->SetPenStyle(CGraphicsContext::ESolidPen);
	iCon->SetPenSize(TSize(1,1));
	iCon->SetBrushStyle(CGraphicsContext::ESolidBrush);
	}

//--------------
CTClipStep::CTClipStep() :iIgnoreDiffs(EFalse)
	{
	SetTestStepName(KTClipStep);
	}
	
CTClipStep::~CTClipStep()
	{
	DestroyTestEnvironment();
	}

inline TBool CTClipStep::IgnoreDiffs()
	{
	return iIgnoreDiffs;
	}

CTGraphicsBase* CTClipStep::CreateTestL()
	{
	_LIT(KLog,"Create CTClip");
	INFO_PRINTF1(KLog);
	return new (ELeave) CTClip(this, iTestAppNo, iDev, iGc, iBmp, iFont, iLargeFont);
	}

void CTClipStep::TestSetupL()
	{
	FbsStartup();
	RFbsSession::Connect();
	
	CreateTestEnvironment();
	}
	
void CTClipStep::TestClose()
	{
	DestroyTestEnvironment();
	RFbsSession::Disconnect();
	}

TInt CTClipStep::CreateScreenDevice(TDisplayMode aMode)
	{
	TRAPD(err,iDev=CFbsScreenDevice::NewL(KNullDesC,aMode));
	const TPtrC modeName=CTGraphicsBase::ColorModeName(aMode);
	if (err==KErrNone)
		{
		_LIT(KLog,"Sucessfully created Screen Device, mode %S");
		INFO_PRINTF2(KLog,&modeName);
		}
	else
		{
		if (err==KErrNotSupported)
			{
			_LIT(KLog,"Screen Device with mode %S not available on this device");
			INFO_PRINTF2(KLog,&modeName);
			}
		else
			{
			_LIT(KLog,"Failed to created Screen Device with mode %S  err=%d");
			INFO_PRINTF3(KLog,&modeName,err);
			}
		}
	return err;
	}

void CTClipStep::CreateTestEnvironment()
	{
	iDev=NULL;
	//This test will fail if any display mode other than EColor64K, EColor256, EGray256
	//is selected
	TInt ret=CreateScreenDevice(EColor64K);
	if (ret!=KErrNone)
		ret=CreateScreenDevice(EColor256);
	if (ret!=KErrNone)
		ret=CreateScreenDevice(EGray256);
	if (ret!=KErrNone)
		ret=CreateScreenDevice(EColor16MU);
	if (ret!=KErrNone)
		ret=CreateScreenDevice(EColor16M);
	if (ret!=KErrNone)
		ret=CreateScreenDevice(EColor4K);
	if (ret!=KErrNone)
		{
		ret=CreateScreenDevice(EColor16MA);
		if (ret==KErrNone)
			{
			iIgnoreDiffs=ETrue;
			_LIT(KLog,"Ignore Diffs set to %d (ETrue?)");
			INFO_PRINTF2(KLog,iIgnoreDiffs);
			}
		}
	if (ret!=KErrNone)
		{
		ret=CreateScreenDevice(EColor16MAP);
		if (ret==KErrNone)
			{
			iIgnoreDiffs=ETrue;
			_LIT(KLog,"Ignore Diffs set to %d (ETrue?)");
			INFO_PRINTF2(KLog,iIgnoreDiffs);
			}
		}
	if(ret!=KErrNone)
		User::Panic(_L("Device not created"),ret);
	iDev->ChangeScreenDevice(NULL);
	iGc=NULL;
	ret=iDev->CreateContext(iGc);
	if(iGc==NULL)
		User::Panic(_L("Context not created"),KErrGeneral);
	iGc->Activate(iDev);
	iFont=NULL;
	TFontSpec fs(_L("Swiss"),12);
	ret=iDev->GetNearestFontToDesignHeightInPixels(iFont,fs);
	if(ret!=KErrNone)
		User::Panic(_L("Font not created"),KErrGeneral);
	iLargeFont=NULL;
	fs.iHeight=100;
	ret=iDev->GetNearestFontToDesignHeightInPixels(iLargeFont,fs);
	if(ret!=KErrNone)
		User::Panic(_L("Font not created"),KErrGeneral);
	
	iBmp=new CFbsBitmap;
	if(iBmp==NULL)
		User::Panic(_L("Bitmap not created"),KErrGeneral);
	if(iTestAppNo == 0)
		{
		// Uncompressed
		TInt ret=iBmp->Load(_L("z:\\system\\data\\tbmp.mbm"),EMbmTbmpTbmp,EFalse);
		if(ret!=KErrNone)
			User::Panic(_L("Bitmap not loaded"),ret);
		}
	else
		{
		TInt ret=iBmp->LoadAndCompress(_L("z:\\system\\data\\tbmp.mbm"),EMbmTbmpTbmp,EFalse);
		if(ret!=KErrNone)
			User::Panic(_L("Bitmap not loaded"),ret);
		}
	
	}

void CTClipStep::DestroyTestEnvironment()
	{
	delete iGc;
	iGc = NULL;
	
	delete iBmp;
	iBmp = NULL;

	if(iFont)
		{
		iDev->ReleaseFont(iFont);
		iFont = NULL;
		}
	if(iLargeFont)
		{
		iDev->ReleaseFont(iLargeFont);
		iLargeFont = NULL;	
		}
	
	delete iDev;
	iDev = NULL;
	}

//--------------
CTClip2Step::CTClip2Step() :
	CTClipStep()
	{
	iTestAppNo = 1;
	SetTestStepName(KTClip2Step);
	}