graphicsdeviceinterface/bitgdi/tbit/TCLIP.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/bitgdi/tbit/TCLIP.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1046 @@
+// 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);
+	}