windowing/windowserver/tauto/TRegion.cpp
author Faisal Memon <faisal.memon@nokia.com>
Fri, 25 Jun 2010 17:49:58 +0100
branchEGL_MERGE
changeset 105 158b2308cc08
parent 0 5d03bc08d59c
permissions -rw-r--r--
Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.

// 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:
// Code for testing CWindowGc::SetCurrentRegion
// 
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#include "TRegion.H"

TBool RegionCanFade;
TBool RegionCanFadeSet;

LOCAL_D TBuf<0x10> text=_L("SOME TEXT");
LOCAL_D TPoint textRefPos(210, 80);

LOCAL_D TRect regionRectList[]={
					TRect(0,0,0,0),	TRect(30,10,70,40),TRect(60,30,80,70),TRect(10,110,70,170),
					TRect(190,0,240,60),TRect(62,63,67,115),TRect(0,180,240,200),TRect(40,50,210,130),
					TRect(160,130,190,160),TRect(100,140,140,170),TRect(140,170,100,140),TRect(90,120,230,200)};
LOCAL_D TRect clippingRectList[]={
					TRect(0,0,200,400),	TRect(30,10,500,600),TRect(-60,0,80,70),TRect(20,0,170,500),
					TRect(0,0,2000,6000),TRect(-1000,-2000,123,195),TRect(10,10,230,190),TRect(0,0,510,730),
					TRect(110,30,190,150),TRect(1,1,500,11170),TRect(0,0,800,940),TRect(-10,-20,240,210)};
LOCAL_D TPoint originList[]={
					TPoint(0,0),TPoint(10,0),TPoint(0,10),TPoint(-5,-20),
					TPoint(1,1),TPoint(0,0),TPoint(0,0),TPoint(100,0),
					TPoint(0,111),TPoint(90,40),TPoint(0,0),TPoint(-1,0)};

CTRegion::CTRegion(CTestStep* aStep) : CTWsGraphicsBase(aStep)
	{
	}

void CTRegion::ConstructL()
	{
	iDrawableSize=TestWin->Size();
//
	User::LeaveIfError(TheClient->iScreen->GetNearestFontToDesignHeightInTwips((CFont *&)iFont,TFontSpec(_L("Arial"),200)));
  	User::LeaveIfError(iPicture.Load(TEST_BITMAP_NAME,0));
  
	iBitmap = new (ELeave) CWsBitmap(TheClient->iWs);
	User::LeaveIfError(iBitmap->Create(TSize(iDrawableSize.iWidth+1,iDrawableSize.iHeight),EGray16));
	iBitmap->SetSizeInTwips(TheClient->iScreen);
	iBitmapDevice=CFbsBitmapDevice::NewL(iBitmap);
	User::LeaveIfError(iBitmapDevice->CreateContext(iBitGc));
	User::LeaveIfError(iBitmapDevice->GetNearestFontToDesignHeightInTwips((CFont *&)iBitFont,TFontSpec(_L("Arial"),200)));
	}

CTRegion::~CTRegion()
	{
	delete iBitGc;
	TheClient->iScreen->ReleaseFont(iFont);
	if (iBitmapDevice)
		iBitmapDevice->ReleaseFont(iBitFont);
	delete iBitmapDevice;
	DeleteChildWindows();
	delete iBitmap;
	}

void CTRegion::CreateChildWindowsL()
	{
	TSize screenSize=TheClient->iGroup->Size();
	TInt winWidth=(screenSize.iWidth/3)-10;
	TInt winHeight=screenSize.iHeight-10;
	iBaseChildWin=new(ELeave) CBlankWindow();
	iBaseChildWin->SetUpL(BaseWin->Win()->InquireOffset(*TheClient->iGroup->GroupWin())+TPoint(winWidth>>2,winHeight>>2),TSize(winWidth>>2,winHeight>>1),TheClient->iGroup,*TheClient->iGc);
	iBaseChildWin->Win()->SetShadowHeight(2);
	iTestChildWin=new(ELeave) CBlankWindow();
	iTestChildWin->SetUpL(TestWin->Win()->InquireOffset(*TheClient->iGroup->GroupWin())+TPoint(winWidth>>2,winHeight>>2),TSize(winWidth>>2,winHeight>>1),TheClient->iGroup,*TheClient->iGc);
	}

void CTRegion::DeleteChildWindows()
	{
	delete iBaseChildWin;
	iBaseChildWin=NULL;
	delete iTestChildWin;
	iTestChildWin=NULL;
	}

void CTRegion::DrawNonClippedSample1(CBitmapContext &aGc)
	{
	aGc.SetPenColor(TRgb::Gray4(0));
	aGc.SetBrushColor(TRgb::Gray4(2));
	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	aGc.DrawRect(TRect(TPoint(30,100), TPoint(120,200)));
	TheClient->iWs.Flush();
	}

void CTRegion::DrawClippedSample1(CBitmapContext &aGc)
	{
	aGc.SetPenColor(TRgb::Gray4(0));
	aGc.SetBrushColor(TRgb::Gray4(1));
	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	aGc.DrawRect(TRect(TSize(100,200)));

//	aGc.BitBlt(TPoint(55,65), iPicture);

	aGc.SetPenStyle(CGraphicsContext::ENullPen);
	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	aGc.SetBrushColor(TRgb::Gray4(2));
	aGc.DrawEllipse(TRect(TPoint(20,35), TPoint(90,79)));

	aGc.SetBrushColor(TRgb::Gray4(0));
	aGc.DrawEllipse(TRect(TPoint(110,110), TPoint(175,200)));

	aGc.SetBrushColor(TRgb::Gray4(1));
	aGc.DrawEllipse(TRect(TPoint(170,30), TPoint(220,150)));

	aGc.SetBrushColor(TRgb::Gray4(3));
	aGc.DrawEllipse(TRect(TPoint(0,150), TPoint(240,190)));

	aGc.SetPenStyle(CGraphicsContext::ESolidPen);
	aGc.SetBrushStyle(CGraphicsContext::ENullBrush);

	TheClient->iWs.Flush();
	}

void CTRegion::DrawNonClippedSample2(CBitmapContext &aGc, CFont *aFont)
	{
	aGc.SetPenColor(TRgb::Gray4(0));
	aGc.SetPenColor(TRgb::Gray4(0));
	aGc.UseFont(aFont);
	TPoint textPos=textRefPos-TPoint(iFont->TextWidthInPixels(text)*3/4, 0);
	aGc.DrawText(text, textPos);
	aGc.DiscardFont();

	TheClient->iWs.Flush();
	}

void CTRegion::DrawClippedSample2(CBitmapContext &aGc, CFont *aFont)
	{
	aGc.SetPenColor(TRgb::Gray4(0));
	aGc.SetPenColor(TRgb::Gray4(2));
	aGc.UseFont(aFont);
	TPoint textPos=textRefPos-TPoint(iFont->TextWidthInPixels(text)*3/4, -20);
	aGc.DrawText(text, textPos);
	aGc.DiscardFont();
	aGc.SetBrushColor(TRgb::Gray4(3));
	aGc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	aGc.DrawRect(TRect(TPoint(10,100), TPoint(210,120)));
	TheClient->iWs.Flush();
	}

void CTRegion::DrawClippedSample3(CBitmapContext &aGc)
	{
	aGc.SetPenColor(TRgb::Gray4(0));
	aGc.SetPenColor(TRgb::Gray4(2));
	aGc.DrawRect(TRect(TPoint(10,200), TPoint(20,210)));
	}

void CTRegion::DrawNonClippedSample1(CTWin *aWindow, const TPoint &aOrigin)
	{
	TheGc->Activate(*aWindow->Win());
	TheGc->SetOrigin(aOrigin);
	DrawNonClippedSample1(*TheGc);
	TheGc->Deactivate();
	}

void CTRegion::DrawNonClippedSample1(CTWin *aWindow, const TRegion &aRegion, const TPoint &aOrigin)
	{
	TheGc->Activate(*aWindow->Win());
	TheGc->SetOrigin(aOrigin);
	TheGc->SetClippingRegion(aRegion);
	DrawNonClippedSample1(*TheGc);
	TheGc->Deactivate();
	}

void CTRegion::DrawClippedSample1(TestWindow *aWindow, const TRegion &aRegion, const TRect &aClippingRect, const TPoint &aOrigin)
	{
	TheGc->Activate(*aWindow->Win());
	TheGc->SetOrigin(aOrigin);
	TheGc->SetClippingRegion(aRegion);
	TheGc->SetClippingRect(aClippingRect);
	DrawClippedSample1(*TheGc);
	TheGc->Deactivate();
	}

void CTRegion::DrawNonClippedSample2(CTWin *aWindow, const TPoint &aOrigin)
	{
	TheGc->Activate(*aWindow->Win());
	TheGc->SetOrigin(aOrigin);
	DrawNonClippedSample2(*TheGc,iFont);
	TheGc->Deactivate();
	}

void CTRegion::DrawNonClippedSample2(CTWin *aWindow, const TRegion &aRegion, const TPoint &aOrigin)
	{
	TheGc->Activate(*aWindow->Win());
	TheGc->SetOrigin(aOrigin);
	TheGc->SetClippingRegion(aRegion);
	DrawNonClippedSample2(*TheGc,iFont);
	TheGc->Deactivate();
	}

void CTRegion::DrawClippedSample2(TestWindow *aWindow, const TRegion &aRegion, const TRect &aClippingRect, const TPoint &aOrigin)
	{
	TheGc->Activate(*aWindow->Win());
	TheGc->SetClippingRegion(TRegionFix<1>());
	DrawClippedSample3(*TheGc);	// needed to trigger region update in wserv
	TheGc->SetOrigin(aOrigin);
	TheGc->SetClippingRect(aClippingRect);
	TheGc->SetClippingRegion(aRegion);
	DrawClippedSample2(*TheGc,iFont);
	TheGc->CancelClippingRegion();
	TheGc->Deactivate();
	}

void CTRegion::ClearBitmapAndWindows()
	{
	TestWin->Win()->Invalidate();
	TestWin->Win()->BeginRedraw();
	TheGc->Activate(*TestWin->Win());
	TheGc->SetBrushColor(TRgb::Gray4(3));
	TheGc->Clear();
	TheGc->Deactivate();
	TestWin->Win()->EndRedraw();
//
	BaseWin->Win()->Invalidate();
	BaseWin->Win()->BeginRedraw();
	TheGc->Activate(*BaseWin->Win());
	TheGc->SetBrushColor(TRgb::Gray4(3));
	TheGc->Clear();
	TheGc->Deactivate();
	BaseWin->Win()->EndRedraw();
//
	iBitGc->SetBrushColor(TRgb::Gray4(3));
	iBitGc->Clear();
	TheClient->iWs.Flush();
	}

void CTRegion::TestRegionL(const TRegion &aClippingRegion, const TRect &aClippingRect, const TPoint &aOrigin)
	{
	if (aClippingRegion.CheckError())
		User::Leave(KErrGeneral);
	ClearBitmapAndWindows();

	// draw to iWindow1 (clipping intermittently) and iBitmap (not clipping)
	DrawNonClippedSample1(TestWin,aOrigin);
	DrawNonClippedSample1(*iBitGc);

	DrawNonClippedSample2(TestWin,aOrigin);
	DrawNonClippedSample2(*iBitGc, iBitFont);

	DrawClippedSample1(TestWin,aClippingRegion,aClippingRect,aOrigin);
	DrawClippedSample1(*iBitGc);

	DrawClippedSample2(TestWin,aClippingRegion,aClippingRect,aOrigin);
	DrawClippedSample2(*iBitGc, iBitFont);

	// copy each rectangle of the clipping region from iBitmap to iWindow2
	TheGc->Activate(*BaseWin->Win());
	for (TUint i=0; i<(TUint)aClippingRegion.Count(); i++)
		{
		TRect rect=aClippingRegion.RectangleList()[i];
		rect.Intersection(aClippingRect);
		TheGc->SetOrigin(aOrigin);
		TheGc->BitBlt(rect.iTl, iBitmap, rect);
		TheClient->Flush();
		}
	TheGc->Deactivate();

	// draw the non-clipped samples to everywhere in iWindow2 *except* the clipping region
	RRegion inverseClippingRegion(TRect(-aOrigin,iDrawableSize));
	RRegion clip;
	clip.Copy(aClippingRegion);
	clip.ClipRect(aClippingRect);
	inverseClippingRegion.SubRegion(clip);
	clip.Close();
	DrawNonClippedSample1(BaseWin,inverseClippingRegion,aOrigin);
	DrawNonClippedSample2(BaseWin,inverseClippingRegion,aOrigin);
	inverseClippingRegion.Close();
	CompareWindows(_L("CTRegion::TestRegionL"));
	}

void CTRegion::CompareRectsL(TPoint aTl1,TPoint aTl2,TSize aSize)
	{
	_LIT(KError,"Pixels Differ: (%d,%d),(%d,%d)");
	CFbsScreenDevice* device;
	device=CFbsScreenDevice::NewL(KNullDesC,iBaseChildWin->BaseWin()->DisplayMode());
	TPoint br=aTl1+aSize;
	TInt startX1=aTl1.iX;
	TInt startX2=aTl2.iX;
	TSize pixelSize(1,1);
	TPoint zero;
	while(aTl1.iY<br.iY+1)
		{
		while (aTl1.iX<br.iX+1)
			{
			if (!device->RectCompare(TRect(aTl1,pixelSize),*device,TRect(aTl2,pixelSize)))
				{
				RDebug::Print(KError,aTl1.iX,aTl1.iY,aTl2.iX,aTl2.iY);
				iTest->LogColors(*device,zero,aTl1,aTl1);
				iTest->LogColors(*device,zero,aTl2,aTl2);
				}
			++aTl1.iX;
			++aTl2.iX;
			}
		aTl1.iX=startX1;
		aTl2.iX=startX2;
		++aTl1.iY;
		++aTl2.iY;
		}
	}

void CTRegion::ScrollBugL()
	{
	CBlankWindow* testWin;
	RBlankWindow win(TheClient->iWs);
	CleanupClosePushL(win);
	TSize screenSize=TheClient->iGroup->Size();
	testWin=new(ELeave) CBlankWindow(TRgb::Gray4(0));
	CleanupStack::PushL(testWin);
	//testWin->ConstructL(*TheClient->iGroup);
	testWin->SetUpL(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight),TheClient->iGroup,*TheGc);
	//testWin->Win()->SetBackgroundColor(TRgb::Gray2(1));
	testWin->Win()->EnableRedrawStore(EFalse);
	testWin->SetColor(TRgb::Gray4(1));
	testWin->RealDraw(ETrue);
	win.Construct(*TheClient->iGroup->WinTreeNode(),3456);
	win.SetColor(TRgb::Gray4(2));
	win.SetExtent(TPoint(screenSize.iWidth/3+30,20),TSize(screenSize.iWidth/3-62,25));
	win.Activate();
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	win.SetVisible(EFalse);
	TheClient->iWs.Flush();
	testWin->Win()->BeginRedraw();
	testWin->DrawNow();
	testWin->SetColor(TRgb::Gray4(2));
	testWin->Win()->Scroll(TPoint(0,-50));
	testWin->DrawNow();
	testWin->Win()->EndRedraw();
	TheClient->iWs.Flush();
	TBool retVal = TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight/2-30))
							,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2-30),TSize(screenSize.iWidth/3,screenSize.iHeight/2-30)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
															
	retVal = !TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight-60),TSize(10,10))
							,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight-50),TSize(10,10)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("!TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		

	TheClient->WaitForRedrawsToFinish();
	win.SetVisible(ETrue);
	win.SetVisible(EFalse);
	testWin->Win()->BeginRedraw();
	testWin->Win()->Scroll(TPoint(0,-50));
	testWin->SetColor(TRgb::Gray4(1));
	testWin->DrawNow();
	testWin->Win()->EndRedraw();
	TheClient->iWs.Flush();	
	retVal = TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3+35,0),TSize(screenSize.iWidth/6-35,100))
							,TRect(TPoint(screenSize.iWidth/2,0),TSize(screenSize.iWidth/6-35,100)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		
																			
	retVal = !TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3+30,20),TSize(10,10))
							,TRect(TPoint(screenSize.iWidth/3+30,50),TSize(10,10)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("!TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		

	TheClient->WaitForRedrawsToFinish();
	testWin->Win()->BeginRedraw();
	testWin->DrawNow();
	testWin->Win()->EndRedraw();
	CleanupStack::PopAndDestroy(2,&win);
	}

void CTRegion::ExposeTestL()
	{
	CBlankWindow* testWin;
	TSize screenSize=TheClient->iGroup->Size();
	TRect topHalf(0,0,screenSize.iWidth/3,screenSize.iHeight/2);
	TRect leftHalf(0,0,screenSize.iWidth/6,screenSize.iHeight);
	testWin=new(ELeave) CBlankWindow(TRgb::Gray4(0));
	CleanupStack::PushL(testWin);
	testWin->SetUpL(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight),TheClient->iGroup,*TheGc);
	testWin->Win()->EnableRedrawStore(EFalse);
	testWin->SetColor(TRgb::Gray4(2));
	testWin->RealDraw(ETrue);
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	testWin->Win()->BeginRedraw();
	testWin->DrawNow();
	testWin->Win()->Invalidate(topHalf);
	testWin->SetColor(TRgb::Gray4(1));
	testWin->DrawNow();
	testWin->Win()->EndRedraw();
	TheClient->iWs.Flush();
	CheckRectNoMatch(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(10,10),_L("CTRegion::ExposeTestL() A"));

	TheClient->WaitForRedrawsToFinish();
	CheckRect(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/3,screenSize.iHeight/2),_L("CTRegion::ExposeTestL() B"));

	testWin->Win()->Invalidate(topHalf);
	testWin->SetColor(TRgb::Gray4(2));
	testWin->Win()->BeginRedraw();
	testWin->Win()->Invalidate(leftHalf);
	testWin->DrawNow();
	testWin->Win()->EndRedraw();
	TheClient->iWs.Flush();
	CheckRect(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/6-10,screenSize.iHeight/2),_L("CTRegion::ExposeTestL() C"));
	CheckRectNoMatch(TPoint(screenSize.iWidth/2,0),TPoint(screenSize.iWidth/2,screenSize.iHeight/2),TSize(10,10),_L("CTRegion::ExposeTestL() D"));
	CheckRectNoMatch(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/2,0),TSize(10,10),_L("CTRegion::ExposeTestL() E"));
	CheckRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TPoint(screenSize.iWidth/2,screenSize.iHeight/2),TSize(((screenSize.iWidth/6-5)/4*4),screenSize.iHeight/2),_L("CTRegion::ExposeTestL() F"));
	testWin->Win()->BeginRedraw();
	testWin->DrawNow();
	testWin->Win()->EndRedraw();
	TheClient->iWs.Flush();
	
	CheckRect(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/6-10,screenSize.iHeight/2),_L("CTRegion::ExposeTestL() G"));
	CheckRectNoMatch(TPoint(screenSize.iWidth/2,0),TPoint(screenSize.iWidth/2,screenSize.iHeight/2),TSize(10,10),_L("CTRegion::ExposeTestL() H"));
	CheckRect(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/2,0),TSize(((screenSize.iWidth/6-5)/4*4),screenSize.iHeight/2),_L("CTRegion::ExposeTestL() I"));
	CheckRectNoMatch(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TPoint(screenSize.iWidth/2,screenSize.iHeight/2),TSize(10,10),_L("CTRegion::ExposeTestL() J"));

	CleanupStack::PopAndDestroy(testWin);
	}

#if defined(__MARM_ARM4__)
	#define FADING ETrue
#elif defined(__MARM__)
	#define FADING EFalse
#else
	#define FADING ETrue
#endif
void CTRegion::ExposeTest2L()
	{
	TBool canFade=FADING;
#if defined(__MARM_THUMB__)
	if (!RegionCanFadeSet)
		return;
	canFade=RegionCanFade;
#endif
	INFO_PRINTF1(_L("AUTO REGN ExpostTest2 "));
	CBlankWindow* testWin;
	RBlankWindow win(TheClient->iWs);
	CleanupClosePushL(win);
	TSize screenSize=TheClient->iGroup->Size();
	TRect topHalf(0,0,screenSize.iWidth/3,screenSize.iHeight/2);
	testWin=new(ELeave) CBlankWindow(TRgb::Gray4(0));
	CleanupStack::PushL(testWin);
	testWin->SetUpL(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight),TheClient->iGroup,*TheGc);
	testWin->Win()->EnableRedrawStore(EFalse);
	testWin->Win()->SetRequiredDisplayMode(EGray16);
	testWin->SetColor(TRgb::Gray16(12));
	testWin->RealDraw(ETrue);
	win.Construct(*TheClient->iGroup->WinTreeNode(),3456);
	win.SetColor(TRgb::Gray4(2));
	win.SetExtent(TPoint(0,-screenSize.iHeight),TSize(screenSize.iWidth/3-2,2*screenSize.iHeight));
	win.SetShadowHeight(screenSize.iWidth/9);
	win.Activate();
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	INFO_PRINTF1(_L(" Constructed Windows"));
	testWin->DrawNow();
	testWin->Win()->SetFaded(ETrue,RWindowTreeNode::EFadeWindowOnly);
	testWin->DrawNow(topHalf);
	TheClient->iWs.Flush();
	INFO_PRINTF1(_L(" Drawn TopHalf Faded"));
	TBool retVal = TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight/2))
						,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/3,screenSize.iHeight/2)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		

	testWin->DrawNow(topHalf);
	TheClient->iWs.Flush();
	canFade!=TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(10,10))
															,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(10,10)));
	TEST(canFade);
	if (!canFade)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, canFade);		

	testWin->DrawNow();
	TheClient->iWs.Flush();
	INFO_PRINTF1(_L(" All Faded (Flush)"));
	
	retVal = TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight/2))
						,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/3,screenSize.iHeight/2)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		

	testWin->Win()->SetFaded(EFalse,RWindowTreeNode::EFadeWindowOnly);
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	INFO_PRINTF1(_L(" Redrawn Screen Unfaded"));
	testWin->Win()->Invalidate(topHalf);
	testWin->Win()->SetFaded(ETrue,RWindowTreeNode::EFadeWindowOnly);
	testWin->DrawNow();
	TheClient->iWs.Flush();
	INFO_PRINTF1(_L(" Re Drawn Top Half Faded Again"));
	retVal = TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight/2))
						,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/3,screenSize.iHeight/2)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		

	testWin->DrawNow();
	TheClient->iWs.Flush();
	INFO_PRINTF1(_L(" Re Drawn Top Half Faded Yet Again"));
	canFade!=TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(10,10))
															,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(10,10)));
	TEST(canFade);
	if (!canFade)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, canFade);		

	testWin->DrawNow();
	TheClient->iWs.Flush();
	INFO_PRINTF1(_L(" All Faded Again"));
	retVal = TheClient->iScreen->RectCompare(TRect(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight/2))
						,TRect(TPoint(screenSize.iWidth/3,screenSize.iHeight/2),TSize(screenSize.iWidth/3,screenSize.iHeight/2)));
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("TheClient->iScreen->RectCompare() return value  - Expected: %d, Actual: %d"), ETrue, retVal);		

	CleanupStack::PopAndDestroy(2,&win);
	INFO_PRINTF1(_L(" Killed Windows"));
	}

void CTRegion::CoverTestL()
	{
	CBlankWindow* testWin;
	RBlankWindow win(TheClient->iWs);
	CleanupClosePushL(win);
	TSize screenSize=TheClient->iGroup->Size();
	testWin=new(ELeave) CBlankWindow(TRgb::Gray4(0));
	CleanupStack::PushL(testWin);
	testWin->SetUpL(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight),TheClient->iGroup,*TheGc);
	testWin->SetColor(TRgb::Gray4(1));
	testWin->RealDraw(ETrue);
	win.Construct(*TheClient->iGroup->WinTreeNode(),3456);
	win.SetColor(TRgb::Gray4(0));
	win.SetExtent(TPoint(screenSize.iWidth/3+30,20),TSize(screenSize.iWidth/3-62,25));
	win.SetVisible(EFalse);
	win.Activate();
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	testWin->DrawNow();
	testWin->SetColor(TRgb::Gray4(2));
	win.SetVisible(ETrue);
	testWin->DrawNow();
	TheClient->iWs.Flush();
	CheckRectNoMatch(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3+30,20),TSize(10,10),_L("TRegion::CoverTestL() A"));

	TheClient->WaitForRedrawsToFinish();
	CheckRectNoMatch(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3+30,20),TSize(10,10),_L("TRegion::CoverTestL() B"));

	win.SetVisible(EFalse);
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	testWin->SetColor(TRgb::Gray4(1));
	testWin->Win()->Invalidate();
	win.SetVisible(ETrue);
	testWin->DrawNow();
	TheClient->iWs.Flush();
	CheckRectNoMatch(TPoint(screenSize.iWidth/3,0),TPoint(screenSize.iWidth/3+30,20),TSize(10,10),_L("TRegion::CoverTestL() C"));

	CleanupStack::PopAndDestroy(2,&win);
	}

void CTRegion::OffsetTestL()
	{
	CBlankWindow* testWin;
	RBlankWindow win(TheClient->iWs);
	CleanupClosePushL(win);
	TSize screenSize=TheClient->iGroup->Size();
	testWin=new(ELeave) CBlankWindow(TRgb::Gray4(0));
	CleanupStack::PushL(testWin);
	testWin->SetUpL(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight-40),TheClient->iGroup,*TheGc);
	testWin->Win()->EnableRedrawStore(EFalse);
	testWin->SetColor(TRgb::Gray4(1));
	testWin->RealDraw(ETrue);
	win.Construct(*testWin->WinTreeNode(),3456);
	win.SetColor(TRgb::Gray4(2));
	win.SetExtent(TPoint(30,20),TSize(screenSize.iWidth/3-62,25));
	win.Activate();
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	win.SetVisible(EFalse);
	TheClient->iWs.Flush();
	testWin->DrawNow();
	testWin->SetColor(TRgb::Gray4(2));
	testWin->Win()->SetPosition(TPoint(screenSize.iWidth/3+30,35));
	testWin->DrawNow();
	TheClient->iWs.Flush();
	/* Andy - this is verifying that the complete redraw of the window in the second DrawNow only affects part
	of the window.  I don't understand it atall.
	CheckRectNoMatch(TPoint(screenSize.iWidth/3+60,55),TPoint(screenSize.iWidth/3+70,85),TSize(10,10),_L("CTRegion::OffsetTestL() A"));
	*/
	TheClient->WaitForRedrawsToFinish();
	CheckRect(TPoint(screenSize.iWidth/3+60,55),TPoint(screenSize.iWidth/3+70,85),TSize(screenSize.iWidth/3-62,25),_L("CTRegion::OffsetTestL() A"));

	win.SetVisible(ETrue);
	win.SetVisible(EFalse);
	testWin->Win()->SetPosition(TPoint(screenSize.iWidth/3+5,5));
	testWin->SetColor(TRgb::Gray4(1));
	testWin->DrawNow();
	TheClient->iWs.Flush();
	CheckRect(TPoint(screenSize.iWidth/3+60,55),TPoint(screenSize.iWidth/3+55,90),TSize(screenSize.iWidth/3-62,25),_L("CTRegion::OffsetTestL() B"));
	/* Andy - this is verifying that the complete redraw of the window during DrawNow only affects part
	of the window.  I don't understand it atall.
	CheckRectNoMatch(TPoint(screenSize.iWidth/3+30,20),TPoint(screenSize.iWidth/3+50,90),TSize(10,10),_L("CTRegion::OffsetTestL() B"));
	*/
	CleanupStack::PopAndDestroy(2,&win);
	}

void CTRegion::ClipTestL()
	{
	CBlankWindow* testWin;
	RBlankWindow win(TheClient->iWs);
	CleanupClosePushL(win);
	TSize screenSize=TheClient->iGroup->Size();
	testWin=new(ELeave) CBlankWindow(TRgb::Gray4(0));
	CleanupStack::PushL(testWin);
	testWin->SetUpL(TPoint(screenSize.iWidth/3,0),TSize(screenSize.iWidth/3,screenSize.iHeight),TheClient->iGroup,*TheGc);
	testWin->Win()->EnableRedrawStore(EFalse);
	testWin->SetColor(TRgb::Gray4(1));
	testWin->RealDraw(ETrue);
	win.Construct(*testWin->WinTreeNode(),3456);
	win.SetColor(TRgb::Gray4(2));
	win.SetExtent(TPoint(30,20),TSize(screenSize.iWidth/3-62,25));
	win.Activate();
	TheClient->iWs.Flush();
	TheClient->WaitForRedrawsToFinish();
	win.SetVisible(EFalse);
	TheClient->iWs.Flush();
	testWin->DrawNow();
	testWin->SetColor(TRgb::Gray4(2));
	User::LeaveIfError(testWin->Win()->SetSizeErr(TSize(screenSize.iWidth/6,screenSize.iHeight-2)));
	RRegion invalid;
	testWin->Win()->GetInvalidRegion(invalid);
	testWin->DrawNow();
	TheClient->iWs.Flush();
	TBool retVal = !invalid.CheckError();
	TEST(retVal);
	if (!retVal)
		INFO_PRINTF3(_L("!invalid.CheckError() return value  - Expected: %d, Actual: %d"), ETrue, retVal);			
	
	TEST(invalid.BoundingRect().iBr.iX<=screenSize.iWidth/6);
	if (invalid.BoundingRect().iBr.iX>screenSize.iWidth/6)
		INFO_PRINTF3(_L("invalid.BoundingRect().iBr.iX<=screenSize.iWidth/6  - Expected: %d, Actual: %d"), screenSize.iWidth/6, invalid.BoundingRect().iBr.iX);			
	TheClient->iWs.Finish();
	TheClient->WaitForRedrawsToFinish();
	testWin->Win()->GetInvalidRegion(invalid);
	
	retVal = invalid.IsEmpty();
	TEST(retVal);
	if (!retVal)
		{
		INFO_PRINTF3(_L("!invalid.CheckError() return value  - Expected: %d, Actual: %d"), ETrue, retVal);
		}

	User::LeaveIfError(testWin->Win()->SetSizeErr(TSize(screenSize.iWidth/3,screenSize.iHeight-4)));
	win.SetVisible(ETrue);
	win.SetVisible(EFalse);
	User::LeaveIfError(testWin->Win()->SetSizeErr(TSize(screenSize.iWidth/6,screenSize.iHeight-6)));
	testWin->SetColor(TRgb::Gray4(1));
	testWin->DrawNow();
	TheClient->iWs.Flush();
	//PeterI This is testing an intermediate state i.e. "flicker" and will never pass on mk3
/*	CheckRectNoMatch(TPoint(screenSize.iWidth/3+30,20),TPoint(screenSize.iWidth/3+50,90),TSize(10,10),_L("CTRegion::ClipTestL()"));
	TEST(retVal);
	if (!retVal)
		{
		INFO_PRINTF3(_L("!CheckRect() return value  - Expected: %d, Actual: %d"), ETrue, retVal);
		}
		*/
	CleanupStack::PopAndDestroy(2,&win);
	}

void CTRegion::RunTestCaseL(TInt /*aCurTestCase*/)
	{
	((CTRegionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
	switch(++iTest->iState)
		{
/**
@SYMTestCaseID		GRAPHICS-WSERV-0272

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test drawing to a region including clipping

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Draw to a region that has clipping enabled and the check the
					drawing occurs correctly

@SYMTestExpectedResults Drawing to the region occurs correctly
*/
		case 1:
			{
			((CTRegionStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0272"));
			iTest->LogSubTest(_L("Main"));
			RRegion clippingRegion;
			CreateChildWindowsL();
			TheClient->iWs.Finish();
			TheClient->WaitForRedrawsToFinish();
			TSize scrSize(TheClient->iScreen->SizeInPixels());
			for(TUint index=0;index<(sizeof(regionRectList)/sizeof(regionRectList[0]));index++)
				{
				regionRectList[index].SetWidth((regionRectList[index].Width()*scrSize.iWidth)/640);
				regionRectList[index].SetHeight((regionRectList[index].Height()*scrSize.iHeight)/240);
				clippingRectList[index].SetWidth((clippingRectList[index].Width()*scrSize.iWidth)/640);
				clippingRectList[index].SetHeight((clippingRectList[index].Height()*scrSize.iHeight)/240);
				originList[index].iX = (originList[index].iX*scrSize.iWidth)/640;
				originList[index].iY = (originList[index].iY*scrSize.iHeight)/240;

				clippingRegion.AddRect(regionRectList[index]);
				TestRegionL(clippingRegion,clippingRectList[index],originList[index]);
				}
			clippingRegion.Close();
			DeleteChildWindows();
			}
			break;
/**
@SYMTestCaseID		GRAPHICS-WSERV-0273

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test drawing to a region including clipping as it is exposed

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Draw to a region that has clipping enabled as it is exposed
					and the check the drawing occurs correctly

@SYMTestExpectedResults Drawing to the region occurs correctly
*/
		case 2:
			((CTRegionStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0273"));
			//PeterI This appears to be testing "flicker" of a window after an expose
			//Mk3 doesn't exhibit this behaviour. Is the flicker expected behaviour?
//			iTest->LogSubTest(_L("Expose Test"));
//			ExposeTestL();
			break;
/**
@SYMTestCaseID		GRAPHICS-WSERV-0274

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test drawing to a region including clipping as it is exposed

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Draw to a region that has clipping enabled as it is exposed
					and the check the drawing occurs correctly

@SYMTestExpectedResults Drawing to the region occurs correctly
*/
		case 3:
			((CTRegionStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0274"));
			iTest->LogSubTest(_L("Expose Test2"));
			ExposeTest2L();
			break;
/**
@SYMTestCaseID		GRAPHICS-WSERV-0275

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test drawing to a region including clipping as it is covered

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Draw to a region that has clipping enabled as it is covered
					and the check the drawing occurs correctly

@SYMTestExpectedResults Drawing to the region occurs correctly
*/
		case 4:
			((CTRegionStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0275"));
			iTest->LogSubTest(_L("Cover Test"));
			CoverTestL();
			break;
/**
@SYMTestCaseID		GRAPHICS-WSERV-0276

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test drawing to a region including clipping and with an offset

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Draw to a region that has clipping enabled and with an offset
					and the check the drawing occurs correctly

@SYMTestExpectedResults Drawing to the region occurs correctly
*/
		case 5:
			((CTRegionStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0276"));
			iTest->LogSubTest(_L("Offset Test"));
			OffsetTestL();
			break;
/**
@SYMTestCaseID		GRAPHICS-WSERV-0277

@SYMDEF             DEF081259

@SYMTestCaseDesc    Test drawing to a region including clipping

@SYMTestPriority    High

@SYMTestStatus      Implemented

@SYMTestActions     Draw to a region that has clipping enabled
					and the check the drawing occurs correctly

@SYMTestExpectedResults Drawing to the region occurs correctly
*/
		case 6:
			((CTRegionStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0277"));
			iTest->LogSubTest(_L("Clip Test"));
			ClipTestL();
			break;
		default:
			((CTRegionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
			((CTRegionStep*)iStep)->CloseTMSGraphicsStep();
			TestComplete();
		}
	((CTRegionStep*)iStep)->RecordTestResultL();
	}

	
__WS_CONSTRUCT_STEP__(Region)