windowing/windowserver/tauto/tdrawresource.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tauto/tdrawresource.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1144 @@
+// Copyright (c) 2008-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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "tdrawresource.h"
+#include <graphics/sgimage.h>
+#include <graphics/sgutils.h>
+#include <graphics/directgdidrawablesource.h>
+#include <graphics/sgresourceinternal.h>
+#include <graphics/wsdrawresource.h>
+
+
+__WS_CONSTRUCT_STEP__(DrawResource);
+
+
+#if defined(__X86GCC__)
+extern "C" TInt atexit(void (*function)(void))
+	{
+	return KErrNone;
+	}
+#endif
+
+//
+// class CTestWsGraphicsContext
+//
+CTestWsGraphicsContext* CTestWsGraphicsContext::NewL(RDirectGdiImageTarget& aTarget)
+	{
+	CTestWsGraphicsContext* self = new(ELeave) CTestWsGraphicsContext;
+	CleanupStack::PushL(self);
+	self->ConstructL(aTarget);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CTestWsGraphicsContext::ConstructL(RDirectGdiImageTarget& aTarget)
+	{
+	CDirectGdiDriver* driver = CDirectGdiDriver::Static();
+	User::LeaveIfNull(driver);
+	iContext = CDirectGdiContext::NewL(*driver);
+	TInt err = iContext->Activate(aTarget);
+	User::LeaveIfError(err);
+	}
+
+CTestWsGraphicsContext::~CTestWsGraphicsContext()
+	{
+	delete iContext;
+	}
+
+TAny* CTestWsGraphicsContext::ResolveObjectInterface(TUint aTypeId)
+	{
+	switch(aTypeId)
+		{
+	case MWsDrawableSourceProvider::EWsObjectInterfaceId:
+		return static_cast<MWsDrawableSourceProvider*>(this);
+		}
+	return NULL;
+
+	}
+	
+TInt CTestWsGraphicsContext::CreateDrawableSource(const TSgDrawableId& aDrawableId, TAny*& aSource)
+	{
+	TRAPD(err, DoCreateDrawableSourceL(aDrawableId, aSource));
+	return err;
+	}
+
+void CTestWsGraphicsContext::DoCreateDrawableSourceL(const TSgDrawableId& aDrawableId, TAny*& aSource)
+	{
+	CDirectGdiDriver* driver = CDirectGdiDriver::Static();
+	if (!driver)
+		{
+		User::Leave(KErrNotReady);
+		}
+	RDirectGdiDrawableSource* drawableSource = new(ELeave) RDirectGdiDrawableSource(*driver);
+	CleanupStack::PushL(drawableSource);
+	RSgDrawable drawable;
+	User::LeaveIfError(drawable.Open(aDrawableId, ESgDoNotRestrictUsage));
+	CleanupClosePushL(drawable);
+	User::LeaveIfError(drawableSource->Create(drawable));
+	CleanupStack::PopAndDestroy();
+	CleanupStack::Pop(drawableSource);
+	aSource = drawableSource;
+	}
+
+void CTestWsGraphicsContext::CloseDrawableSource(TAny* aSource)
+	{
+	RDirectGdiDrawableSource* drawableSource = static_cast<RDirectGdiDrawableSource*>(aSource);
+	drawableSource->Close();
+	delete drawableSource;
+	}
+
+void CTestWsGraphicsContext::DrawResource(const TAny* aSource, const TPoint& aPos, CWindowGc::TGraphicsRotation aRotation)
+	{
+	const RDirectGdiDrawableSource* drawableSource = static_cast<const RDirectGdiDrawableSource*>(aSource);
+	iContext->DrawResource(aPos, *drawableSource, (DirectGdi::TGraphicsRotation)aRotation);
+	iPos = aPos;
+	iRotation = (DirectGdi::TGraphicsRotation)aRotation;
+	}
+
+void CTestWsGraphicsContext::DrawResource(const TAny* aSource, const TRect& aRect, CWindowGc::TGraphicsRotation aRotation)
+	{
+	const RDirectGdiDrawableSource* drawableSource = static_cast<const RDirectGdiDrawableSource*>(aSource);
+	iContext->DrawResource(aRect, *drawableSource, (DirectGdi::TGraphicsRotation)aRotation);
+	iDestRect = aRect;
+	iRotation = (DirectGdi::TGraphicsRotation)aRotation;
+	}
+
+void CTestWsGraphicsContext::DrawResource(const TAny* aSource, const TRect& aRectDest, const TRect& aRectSrc, CWindowGc::TGraphicsRotation aRotation)
+	{
+	const RDirectGdiDrawableSource* drawableSource = static_cast<const RDirectGdiDrawableSource*>(aSource);
+	iContext->DrawResource(aRectDest, *drawableSource, aRectSrc, (DirectGdi::TGraphicsRotation)aRotation);
+	iDestRect = aRectDest;
+	iSrcRect = aRectSrc;
+	iRotation = (DirectGdi::TGraphicsRotation)aRotation;
+	}
+
+void CTestWsGraphicsContext::DrawResource(const TAny* aSource, const TRect& aRect, const TDesC8& aParam)
+	{
+	const RDirectGdiDrawableSource* drawableSource = static_cast<const RDirectGdiDrawableSource*>(aSource);
+	iContext->DrawResource(aRect, *drawableSource, aParam);
+	iDestRect = aRect;
+	}
+
+
+void CTestWsGraphicsContext::Clear()
+	{
+	iContext->Clear();
+	}
+
+//
+// class CTDrawResource
+//
+
+CTDrawResource::CTDrawResource(CTestStep* aStep)
+	: CTWsGraphicsBase(aStep)
+	{
+	}
+
+CTDrawResource::~CTDrawResource()
+	{
+	iWindow.Close();
+	delete iRefBitmap;
+	delete iRotatedRefBitmap;
+	delete iScaledBitmap;
+	delete iScaledCroppedBitmap;
+	delete iCopyBitmap;
+	delete iBitmapWrongScreenNumber;
+
+	delete iWsGrapicResolver;
+	delete iGraphicsCon;
+
+	iWsDrawableSource.Close();
+	iImage.Close();
+	iImageTarget.Close();
+	iImageCollection.Close();
+
+	CDirectGdiDriver* dGdiDriver = CDirectGdiDriver::Static();
+	if(dGdiDriver)
+		{
+		dGdiDriver->Close();
+		}
+	SgDriver::Close();
+	}
+
+void CTDrawResource::ConstructL()
+	{
+	//Constrcut and setup window to be drawn to
+	iWindow = RWindow(TheClient->iWs);
+    User::LeaveIfError(iWindow.Construct(*TheClient->iGroup->GroupWin(),ENullWsHandle));
+    TSize iWinSize=TSize(TheClient->iScreen->SizeInPixels());
+    iWindow.SetExtent(TPoint(0,0),iWinSize);
+	iWindow.Activate();
+	iWindow.BeginRedraw();
+	iWindow.EndRedraw();
+	
+	//Creates all reference and copy bitmaps required for all tests
+	CreateReferenceAndCopyBitmapsL();
+
+	TInt err = CDirectGdiDriver::Open();
+	User::LeaveIfError(err);
+	err = SgDriver::Open();
+	User::LeaveIfError(err);
+	
+	//create image target
+	CDirectGdiDriver* theDGdiDriver = CDirectGdiDriver::Static();
+	if(!theDGdiDriver)
+		{
+		User::Leave(KErrNotReady);
+		}
+	TSgImageInfo info;
+	info.iUsage = ESgUsageDirectGdiTarget | ESgUsageDirectGdiSource | ESgUsageCompositionSource;
+	info.iPixelFormat = EUidPixelFormatRGB_565;
+	info.iSizeInPixels = TSize(200, 200);
+	info.iShareable = ETrue;
+	const TInt KImageCount = 1;
+	err = iImageCollection.Create(info, KImageCount);
+	User::LeaveIfError(err);
+	
+	err = iImageCollection.OpenImage(0, iImage);
+	User::LeaveIfError(err);
+	iImageTarget = RDirectGdiImageTarget(*theDGdiDriver);
+	err = iImageTarget.Create(iImage);
+	User::LeaveIfError(err);
+	
+	// construction of image source
+	RSgImage sgImage;
+	CreateSgImageFromBitmapL(sgImage);
+	CleanupClosePushL(sgImage);
+	iWsDrawableSource = RWsDrawableSource(TheClient->iWs);
+	User::LeaveIfError(iWsDrawableSource.Create(sgImage, TheClient->iScreen->GetScreenNumber()));
+	
+    //Create dummy MWsGraphicResolver - required RemoteGc testing
+	iWsGrapicResolver = new (ELeave) CWSGraphicsRes();
+	
+	//Create dummy MWsGraphicsContext - required RemoteGc testing
+	iGraphicsCon =  CTestWsGraphicsContext::NewL(iImageTarget);
+	
+	CleanupStack::PopAndDestroy(&sgImage);
+	}
+
+void CTDrawResource::RunTestCaseL(TInt aCurTestCase)
+	{	
+	((CTDrawResourceStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
+	switch(aCurTestCase)
+		{
+	case 1:		
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0001"));
+		INFO_PRINTF1(_L("DrawResourcePos Test"));		
+		TestDrawResourcePos();
+		break;
+	case 2:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0002"));
+		INFO_PRINTF1(_L("DrawResourceRect Test"));	
+		TestDrawResourceRect();
+		break;
+	case 3:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0003"));
+		INFO_PRINTF1(_L("DrawResourceScale Test"));		
+		TestDrawResourceScale();
+		break;
+	case 4:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0004"));
+		INFO_PRINTF1(_L("RWsDrawableSource Reference Counting Test"));		
+		TestRWsDrawableSourceReferenceCountingL();
+		break;	
+	case 5:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0005"));
+		INFO_PRINTF1(_L("RemoteGcDrawResourcePos Test"));	
+		TestRemoteGcDrawResourcePosL();
+		break;
+	case 6:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0006"));
+		INFO_PRINTF1(_L("RemoteGcDrawResourceRect Test"));	
+		TestRemoteGcDrawResourceRectL();
+		break;
+	case 7:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0007"));
+		INFO_PRINTF1(_L("RemoteGcDrawResourceScale Test"));	
+		TestRemoteGcDrawResourceScaleL();
+		break;
+	case 8:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-DRAWRESOURCE-0008"));
+		INFO_PRINTF1(_L("DrawResourceScreens Test"));	
+		TestDrawResourceScreensL();
+		break;
+	case 9:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-TestCopyScreenToBitmapWithDifferentDisplayModes-0001"));
+		INFO_PRINTF1(_L("CopyScreenToBitmapWithDifferentDisplayModes Test\n"));
+		TestCopyScreenToBitmapWithDifferentDisplayModesL();
+		break;
+	case 10:
+		((CTDrawResourceStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
+		((CTDrawResourceStep*)iStep)->CloseTMSGraphicsStep();
+		INFO_PRINTF1(_L("Test complete\n"));
+		TestComplete();
+		break;
+		}
+	((CTDrawResourceStep*)iStep)->RecordTestResultL();
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0001
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using DrawResource(const TPoint&, const RWsDrawableSource&, TGraphicsRotation)
+@SYMTestActions          Draw to position (0,0) with default rotation (none)
+						 Draw to position (10,10) with 90 degrees rotation 
+@SYMTestExpectedResults  Drawn images should match reference CFbsBitmap
+*/
+void CTDrawResource::TestDrawResourcePos()
+	{
+	// Draw to TPoint(0,0) with EGraphicsRotationNone
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(TheGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestPoint, iWsDrawableSource, CWindowGc::EGraphicsRotationNone);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();  
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Draw to TPoint(0,0) with EGraphicsRotationNone"));
+	TBool compRes = CompareBitmapsByPixel(iCopyBitmap, iRefBitmap);
+	TEST(compRes);
+
+	/*** Draw to position (10,10) with 90 degrees rotation ***/
+	TPoint const KDestPoint2(10,10);
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+    TheGc->Clear();
+	dr->DrawResource(KDestPoint2, iWsDrawableSource, KTestRotation);
+    TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish(); 
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, TRect(KDestPoint2, KSourceSize));
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Draw to position (10,10) with 90 degrees rotation"));
+	compRes = CompareBitmapsByPixel(iCopyBitmap, iRotatedRefBitmap);
+	TEST(compRes);
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0002
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using DrawResource(const TRect& , const RWsDrawableSource&, TGraphicsRotation aRotation)
+@SYMTestActions          Draw to rect pos (10,10), rect size (60,60) with 90 degrees rotation
+@SYMTestExpectedResults  Drawn images should match the reference CFbsBitmap
+*/
+void CTDrawResource::TestDrawResourceRect()
+	{
+	//Use DrawResource
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(TheGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestRect, iWsDrawableSource, KTestRotation);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();  
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Draw to rect pos (10,10), rect size (60,60) with 90 degrees rotation"));
+	TInt compRes = CompareBitmapsByPixel(iCopyBitmap, iScaledBitmap);
+	TEST(compRes);
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0003
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using DrawResource(const TRect& , const RWsDrawableSource&, const TRect&, TGraphicsRotation aRotation)
+@SYMTestActions          Draw the part of the source image (rect Pos (0,0), rect size(50,50))
+						 to rect pos(10,10), rect size(60,60) and and 90 degrees rotation
+@SYMTestExpectedResults  Drawn images should match the reference CFbsBitmap
+*/
+void CTDrawResource::TestDrawResourceScale()
+	{
+	//Use DrawResource
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(TheGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestRect, iWsDrawableSource, KSourceRect, KTestRotation);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();  
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Draw the part of the source image to rect pos(10,10), rect size(60,60) and and 90 degrees rotation"));
+	TInt compRes = CompareBitmapsByPixel(iCopyBitmap, iScaledCroppedBitmap);
+	TEST(compRes);
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0004
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using DrawResource(const TPoint&, const RWsDrawableSource&, TGraphicsRotation) after closing the image source
+@SYMTestActions          Draw to position (0,0) with default rotation (none) after closing the image source
+@SYMTestExpectedResults  Drawn image should match reference CFbsBitmap
+*/
+void CTDrawResource::TestRWsDrawableSourceReferenceCountingL()
+	{	
+	// construction of image source
+	RSgImage sgImage;
+	CreateSgImageFromBitmapL(sgImage);
+	CleanupClosePushL(sgImage);
+	RWsDrawableSource drawableSource(TheClient->iWs);
+	CleanupClosePushL(drawableSource);
+	User::LeaveIfError(drawableSource.Create(sgImage, TheClient->iScreen->GetScreenNumber())); 
+
+	//Draw using DrawResource
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(TheGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestPoint, drawableSource, CWindowGc::EGraphicsRotationNone);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+
+	//Close the image source but this should not stop the source from being drawn 
+	drawableSource.Close();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Draw to TPoint(0,0) with EGraphicsRotationNone"));
+	TBool compRes = CompareBitmapsByPixel(iCopyBitmap, iRefBitmap);
+	TEST(compRes);
+
+	CleanupStack::PopAndDestroy(2, &sgImage);
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0005
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using RemotGc->DrawResource(const TPoint&, const RWsDrawableSource&, TGraphicsRotation)
+@SYMTestActions          Record the draw resource commands using CRemoteGc and play the recorded commands on a window using
+ 						 Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&) and then play the recorded commands using . 
+						 Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&).
+@SYMTestExpectedResults  Drawn images should match reference CFbsBitmap and also values received by MWsGraphicsContext should 
+ 						 match what was originally sent to DrawResource.
+*/
+void CTDrawResource::TestRemoteGcDrawResourcePosL()
+	{
+	const TRect KRemotGcSourceRect(0, 0, iWindow.Size().iWidth, iWindow.Size().iHeight);
+	const TRegionFix<1> KClippingRegion(KRemotGcSourceRect);
+	CWindowGc::TGraphicsRotation testRotation= CWindowGc::EGraphicsRotationNone;
+	
+	//Create remote gc - required RemoteGc testing
+	CRemoteGc* remoteGc = CRemoteGc::NewL(TheClient->iScreen);
+	CleanupStack::PushL(remoteGc);
+
+	//Record draw messages
+	remoteGc->ResetCommandBuffer();
+	remoteGc->BeginDraw(KRemotGcSourceRect);
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(remoteGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestPoint, iWsDrawableSource, CWindowGc::EGraphicsRotationNone);
+	remoteGc->EndDraw();
+	
+	RWsGraphicMsgBuf msgBuf;
+	CleanupClosePushL(msgBuf);
+	//Externalize the captured commands from remote gc in to a buffer
+	remoteGc->ExternalizeL(msgBuf, ETrue);
+	//Create command buffer - required RemoteGc testing
+	CCommandBuffer* cmdBuffer = CCommandBuffer::NewL();
+	CleanupStack::PushL(cmdBuffer);
+	//Internalize the buffer with captured commands (from CRemoteGC) in to CCommandBuffer
+	cmdBuffer->InternalizeL(msgBuf.Pckg());
+
+	// Play stored commands using Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&) 
+	remoteGc->ResetCommandBuffer();
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	cmdBuffer->Play(KPlayOffset, &KClippingRegion, KRemotGcSourceRect, TheClient->iWs, *TheGc);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Using Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&)"));
+	TBool compRes = CompareBitmapsByPixel(iCopyBitmap, iRefBitmap);
+	TEST(compRes);
+
+	// Play stored commands using Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&) 
+	remoteGc->ResetCommandBuffer();
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	cmdBuffer->Play(KPlayOffset,&KClippingRegion,KRemotGcSourceRect,*iWsGrapicResolver,*iGraphicsCon);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+
+	//Compare the values received by CTestWsGraphicsContext and the values sent to it
+	INFO_PRINTF1(_L("Using Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&)"));
+	TBool valuesSame = EFalse;
+	CFbsBitmap* bmp;
+	BitmapLC(bmp);
+	compRes = CompareBitmapsByPixel(bmp, iRefBitmap);
+	CleanupStack::PopAndDestroy(bmp);
+
+	if((iGraphicsCon->iPos == KDestPoint) && (compRes)
+									&& (reinterpret_cast<TInt&>(iGraphicsCon->iRotation)==reinterpret_cast<TInt&>(testRotation)))
+		valuesSame = ETrue;
+	TEST(valuesSame);
+	CleanupStack::PopAndDestroy(3, remoteGc);
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0006
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using RemotGc->DrawResource(const TRect&, const RWsDrawableSource&, TGraphicsRotation)
+@SYMTestActions          Record the draw resource commands using CRemoteGc and play the recorded commands on a window using
+ 						 Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&) and then play the recorded commands using . 
+						 Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&).
+@SYMTestExpectedResults  Drawn images should match reference CFbsBitmap and also values received by MWsGraphicsContext should 
+ 						 match what was originally sent to DrawResource.
+*/
+void CTDrawResource::TestRemoteGcDrawResourceRectL()
+	{
+	const TRect KRemotGcSourceRect(0, 0, iWindow.Size().iWidth, iWindow.Size().iHeight);
+	const TRegionFix<1> KClippingRegion(KRemotGcSourceRect);
+	
+	//Create remote gc - required RemoteGc testing
+	CRemoteGc* remoteGc = CRemoteGc::NewL(TheClient->iScreen);
+	CleanupStack::PushL(remoteGc);
+
+	//Record draw messages
+	remoteGc->BeginDraw(KRemotGcSourceRect);
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(remoteGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestRect, iWsDrawableSource, KTestRotation);
+	remoteGc->EndDraw();
+	
+	RWsGraphicMsgBuf msgBuf;
+	CleanupClosePushL(msgBuf);
+	//Externalize the captured commands from remote gc in to a buffer
+	remoteGc->ExternalizeL(msgBuf, ETrue);
+
+	//Create command buffer - required RemoteGc testing
+	CCommandBuffer* cmdBuffer = CCommandBuffer::NewL();
+	CleanupStack::PushL(cmdBuffer);
+	//Internalize the buffer with captured commands (from CRemoteGC) in to CCommandBuffer
+	cmdBuffer->InternalizeL(msgBuf.Pckg());
+
+	// Play stored commands using Play(const TRect&, const TRect&, RWsSession&, CWindowGc&)
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	cmdBuffer->Play(KPlayOffset, &KClippingRegion, KRemotGcSourceRect, TheClient->iWs, *TheGc);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Using Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&)"));
+	TBool compRes = CompareBitmapsByPixel(iCopyBitmap, iScaledBitmap);
+	TEST(compRes);
+
+	// Play stored commands using Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&) 
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	iGraphicsCon->Clear();
+	cmdBuffer->Play(KPlayOffset,&KClippingRegion,KRemotGcSourceRect,*iWsGrapicResolver,*iGraphicsCon);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	//Compare the values received by CTestWsGraphicsContext and the values sent to it
+	INFO_PRINTF1(_L("Using Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&)"));
+	TBool valuesSame = EFalse;
+
+	CFbsBitmap* bmp;
+	BitmapLC(bmp);
+	compRes = CompareBitmapsByPixel(bmp, iScaledBitmap);
+	CleanupStack::PopAndDestroy(bmp);
+
+	if((iGraphicsCon->iDestRect == KDestRect) && (compRes)
+								&& (reinterpret_cast<TInt&>(iGraphicsCon->iRotation)==reinterpret_cast<const TInt&>(KTestRotation)))
+		valuesSame = ETrue;
+	TEST(valuesSame);
+	CleanupStack::PopAndDestroy(3, remoteGc);
+	}
+
+/**
+@SYMTestCaseID           GRAPHICS-WSERV-DRAWRESOURCE-0007
+@SYMPREQ                 PREQ2095
+@SYMTestPriority         High
+@SYMTestCaseDesc         Draw RSgImage using RemotGc->DrawResource(const TRect&, const RWsDrawableSource&, const TRect&, TGraphicsRotation)
+@SYMTestActions          Record the draw resource commands using CRemoteGc and play the recorded commands on a window using
+ 						 Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&) and then play the recorded commands using . 
+						 Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&).
+@SYMTestExpectedResults  Drawn images should match reference CFbsBitmap and also values received by MWsGraphicsContext should 
+ 						 match what was originally sent to DrawResource.
+*/
+void CTDrawResource::TestRemoteGcDrawResourceScaleL()
+	{
+	const TRect KRemotGcSourceRect(0, 0, iWindow.Size().iWidth, iWindow.Size().iHeight);
+	const TRegionFix<1> KClippingRegion(KRemotGcSourceRect);
+	
+	//Create remote gc - required RemoteGc testing
+	CRemoteGc* remoteGc = CRemoteGc::NewL(TheClient->iScreen);
+	CleanupStack::PushL(remoteGc);
+
+	//Record draw messages
+	remoteGc->BeginDraw(KRemotGcSourceRect);
+	MWsDrawResource* dr = static_cast<MWsDrawResource*>(remoteGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(dr != NULL);
+	dr->DrawResource(KDestRect, iWsDrawableSource, KSourceRect, KTestRotation);
+	remoteGc->EndDraw();
+	
+	RWsGraphicMsgBuf msgBuf;
+	CleanupClosePushL(msgBuf);
+	//Externalize the captured commands from remote gc in to a buffer
+	remoteGc->ExternalizeL(msgBuf, ETrue);
+
+	//Create command buffer - required RemoteGc testing
+	CCommandBuffer* cmdBuffer = CCommandBuffer::NewL();
+	CleanupStack::PushL(cmdBuffer);
+	//Internalize the buffer with captured commands (from CRemoteGC) in to CCommandBuffer
+	cmdBuffer->InternalizeL(msgBuf.Pckg());
+
+	// Play the stored commands using Play(const TRect&, const TRect&, RWsSession&, CWindowGc&)
+	remoteGc->ResetCommandBuffer();
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	cmdBuffer->Play(KPlayOffset, &KClippingRegion, KRemotGcSourceRect, TheClient->iWs, *TheGc);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Using Play(const TPoint&, const TRect&, RWsSession&, CWindowGc&)"));
+	TBool compRes = CompareBitmapsByPixel(iCopyBitmap, iScaledCroppedBitmap);
+	TEST(compRes);
+
+	// Play the stored commands using Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&) 	
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	iGraphicsCon->Clear();
+	cmdBuffer->Play(KPlayOffset,&KClippingRegion,KRemotGcSourceRect,*iWsGrapicResolver,*iGraphicsCon);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	//Compare the values received by CTestWsGraphicsContext and the values sent to it
+	INFO_PRINTF1(_L("Using Play(const TPoint&, const TRect&, const MWsGraphicResolver&, MWsGraphicsContext&)"));
+	TBool valuesSame = EFalse;
+
+	CFbsBitmap* bmp;
+	BitmapLC(bmp);
+	compRes = CompareBitmapsByPixel(bmp, iScaledCroppedBitmap);
+	CleanupStack::PopAndDestroy(bmp);
+
+	if((iGraphicsCon->iDestRect == KDestRect) && (compRes) && (iGraphicsCon->iSrcRect == KSourceRect)
+								&& (reinterpret_cast<TInt&>(iGraphicsCon->iRotation)==reinterpret_cast<const TInt&>(KTestRotation)))
+		valuesSame = ETrue;
+	TEST(valuesSame);
+	CleanupStack::PopAndDestroy(3, remoteGc);
+	}
+
+/**
+@SYMTestCaseID          GRAPHICS-WSERV-DRAWRESOURCE-0008
+@SYMPREQ                PREQ2095
+@SYMTestPriority        High
+@SYMTestCaseDesc        Negative testing. Draw graphics recourses which associated with different screens.
+@SYMTestActions         Open RWsDrawableSource associated with the screen which doesn’ exist.  
+						Open RWsDrawableSource associated with the screen which exists but differes from drawing target.
+						Draw Rectangle and Resource to the screen via CWindowGc
+						Draw Rectangle and Resource to the screen via CRemoteGc
+@SYMTestExpectedResults  Opening drawable resource on the screen which doesn’t exist must fail with error code KErrArgument 
+						Drawing primitives will result only rectangles be drawn as drawable recourses get associated with different screen
+*/
+void CTDrawResource::TestDrawResourceScreensL()
+	{
+	TInt numOfScreens = TheClient->iWs.NumberOfScreens();
+	if(numOfScreens < 2)
+		{
+		INFO_PRINTF2(_L("This test case will be running if the number of available screens more than 1, current number is %d"), numOfScreens);
+		return;
+		}
+	TInt screenNumber = TheClient->iScreen->GetScreenNumber();
+	TInt differentScreen = (screenNumber == 0) ? 1 : 0;
+
+	RSgImage sgImage;
+	CreateSgImageFromBitmapL(sgImage);
+	CleanupClosePushL(sgImage);
+
+	RWsDrawableSource drawableSource(TheClient->iWs);
+	TInt res = drawableSource.Create(sgImage, differentScreen + 200); //wrong screen number
+	TEST(res == KErrArgument);
+
+	res = drawableSource.Create(iImage, differentScreen);
+	TEST(res == KErrNotSupported); //in order to succeed the image must be created with flag usage ESgUsageWindowGcSource
+	
+	TSgImageInfo info; 
+	User::LeaveIfError(sgImage.GetInfo(info));
+
+	res = drawableSource.Create(sgImage, differentScreen);
+	if(res == KErrNotSupported)
+		{
+		INFO_PRINTF1(_L("The second screen is not supports drawable source. This test case terminates now."));
+		CleanupStack::PopAndDestroy(&sgImage);
+		return;
+		}
+	TEST(res == KErrNone);
+	User::LeaveIfError(res);
+	CleanupClosePushL(drawableSource);
+	
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	TheGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
+	TheGc->SetPenStyle(CFbsBitGc::ENullPen);
+	TheGc->SetBrushColor(KRgbGreen);
+	TheGc->DrawRect(TRect(KDestPoint, info.iSizeInPixels));
+	// Draw to TPoint(0,0) with EGraphicsRotationNone but to the different screen
+	MWsDrawResource* winDr = static_cast<MWsDrawResource*>(TheGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(winDr != NULL);
+	winDr->DrawResource(KDestPoint, drawableSource, CWindowGc::EGraphicsRotationNone);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();  
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	//Compare the bitmaps
+	INFO_PRINTF1(_L("Draw to TPoint(0,0) with EGraphicsRotationNone but to different screen"));
+	TBool compRes = CompareBitmapsByPixel(iCopyBitmap, iBitmapWrongScreenNumber);
+	TEST(compRes);
+
+	//--------------------------- remoteGc 
+	const TRect KRemotGcSourceRect(0, 0, iWindow.Size().iWidth, iWindow.Size().iHeight);
+	const TRegionFix<1> KClippingRegion(KRemotGcSourceRect);
+	
+	//Create remote gc - required RemoteGc testing
+	CRemoteGc* remoteGc = CRemoteGc::NewL(TheClient->iScreen);
+	CleanupStack::PushL(remoteGc);
+
+	//Record draw messages
+	remoteGc->BeginDraw(KRemotGcSourceRect);
+	remoteGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
+	remoteGc->SetPenStyle(CFbsBitGc::ENullPen);
+	remoteGc->SetBrushColor(KRgbGreen);
+	remoteGc->DrawRect(TRect(KDestPoint, info.iSizeInPixels));
+	MWsDrawResource* remDr = static_cast<MWsDrawResource*>(remoteGc->Interface(KMWsDrawResourceInterfaceUid));
+	TEST(remDr != NULL);
+	remDr->DrawResource(KDestRect, drawableSource, CWindowGc::EGraphicsRotationNone);
+	remoteGc->EndDraw();
+	
+	RWsGraphicMsgBuf msgBuf;
+	CleanupClosePushL(msgBuf);
+	//Externalize the captured commands from remote gc in to a buffer
+	remoteGc->ExternalizeL(msgBuf, ETrue);
+
+	//Create command buffer - required RemoteGc testing
+	CCommandBuffer* cmdBuffer = CCommandBuffer::NewL();
+	CleanupStack::PushL(cmdBuffer);
+	//Internalize the buffer with captured commands (from CRemoteGC) in to CCommandBuffer
+	cmdBuffer->InternalizeL(msgBuf.Pckg());
+	
+	// Play stored commands using Play(const TRect&, const TRect&, RWsSession&, CWindowGc&)
+	iWindow.Invalidate();
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->Clear();
+	cmdBuffer->Play(KPlayOffset, &KClippingRegion, KRemotGcSourceRect, TheClient->iWs, *TheGc);
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	//Copy the screen to the copy bitmap
+	TheClient->iScreen->CopyScreenToBitmap(iCopyBitmap, KCopyTestRect);
+
+	INFO_PRINTF1(_L("Draw to TPoint(0,0) with EGraphicsRotationNone but to different screen"));
+	TBool compRes1 = CompareBitmapsByPixel(iCopyBitmap, iBitmapWrongScreenNumber);
+	TEST(compRes1);
+
+	CleanupStack::PopAndDestroy(5, &sgImage);
+	}
+
+/**
+@SYMTestCaseID          GRAPHICS-WSERV-TestCopyScreenToBitmapWithDifferentDisplayModes-0001
+@SYMPREQ                PREQ2095
+@SYMTestPriority        High
+@SYMTestCaseDesc        Get bitmap and scanline from the screen.  
+@SYMTestActions         Draw bitmap in various display modes to the screen. 
+						Retrieve scan line and bitmap from the screen using standard WSERV API.  
+
+@SYMTestExpectedResults Checks that obtained bitmap matches with the reference bitmap.
+*/
+void CTDrawResource::TestCopyScreenToBitmapWithDifferentDisplayModesL()
+	{
+	TDisplayMode mode = TheClient->iScreen->DisplayMode();
+    INFO_PRINTF2(_L("Screen display mode %d"), mode);
+	CFbsBitmap* bitmap = NULL;
+	
+	TSize bitmapSize(163, 120);
+	CreateBitmapLC(bitmap, bitmapSize, mode);
+	
+	iWindow.BeginRedraw();
+	TheGc->Activate(iWindow);
+	TheGc->SetBrushStyle(CWindowGc::ESolidBrush);
+	TheGc->SetBrushColor(KRgbYellow);
+	TheGc->Clear();
+	const TPoint ptOffset(10, 15);
+	TheGc->BitBlt(KDestPoint + ptOffset, bitmap);
+
+	TheGc->Deactivate();
+	iWindow.EndRedraw();
+	TheClient->iWs.Finish();
+	TheClient->WaitForRedrawsToFinish();
+
+	const TInt length = bitmapSize.iWidth;
+	const TInt height = bitmapSize.iHeight;
+	const TInt buffersSize = length * 4;
+	TUint8 *screenData = (TUint8*) User::AllocL(buffersSize);
+	CleanupStack::PushL(screenData);
+	TUint8 *bitmapData = (TUint8*) User::AllocL(buffersSize);
+	CleanupStack::PushL(bitmapData);
+	TPtr8 ptrScreen (screenData, buffersSize, buffersSize);
+	TPtr8 ptrBitmap (bitmapData, buffersSize, buffersSize);
+	
+	//EGray mode uses dithering in BitGdi, wserv doesnt support this, thus skipping the first mode 
+	for(TInt ii =2; ; ii++)
+		{
+		TDisplayMode dispMode = (TDisplayMode)ii; 
+		if(dispMode >= EColorLast)
+			break;
+		if(dispMode == ERgb)
+			continue;
+
+	    INFO_PRINTF2(_L("Copy Screen to bitmap, destination mode %d"), dispMode);
+		
+		CFbsBitmap *bmp = new (ELeave) CFbsBitmap;
+		CleanupStack::PushL(bmp);
+		User::LeaveIfError(bmp->Create(bitmapSize, dispMode));
+		TUidPixelFormat pixelFormat = SgUtils::DisplayModeToPixelFormat(dispMode);
+    	const TInt minStride = SgUtils::MinDataStride(length, pixelFormat);
+    	const TInt bitmapStride = bmp->DataStride();
+    	TEST(minStride <= bitmapStride);
+	
+	//Copy the screen to the copy bitmap
+		TRect rc = bitmapSize;
+		rc.Move(ptOffset);
+		TheClient->iScreen->CopyScreenToBitmap(bmp, rc);
+		CFbsBitmap *bmpRef = NULL;
+		CreateReferenceBitmapLC(bmpRef, bitmap, dispMode);
+		TEST(bmpRef->DisplayMode() == dispMode);
+		
+		//Compare the bitmaps
+	    TBool compRes = CompareBitmapsByPixel(bmp, bmpRef);
+	    TEST(compRes);
+	    
+	    for(TInt jj = 0; jj < height; jj++)
+	    	{
+	    	TPoint pt(0, jj);
+	    	TPoint ptScreen = pt + ptOffset;
+	    	
+	    	Mem::Fill(screenData, bitmapStride, 0xff);
+	    	Mem::Fill(bitmapData, bitmapStride, 0xff);
+	    	
+	    	TheClient->iScreen->GetScanLine(ptrScreen, ptScreen, length, dispMode);
+	    	bitmap->GetScanLine(ptrBitmap, pt, length, dispMode);
+	    	TInt length1 = ptrScreen.Length();
+	    	
+	    	TInt res = Mem::Compare(screenData, length1, bitmapData, length1);
+	    	TEST(res == 0);
+	    	}
+	    CleanupStack::PopAndDestroy(2, bmp);
+		}//screen modes;
+		
+	CleanupStack::PopAndDestroy(3, bitmap);
+	}
+
+//Helper function: Creates reference bitmap with specified display mode
+void CTDrawResource::CreateReferenceBitmapLC(CFbsBitmap*& aBmpTarget, CFbsBitmap* aBmpSrc, TDisplayMode aDestMode) 
+	{
+	TSize size = aBmpSrc->SizeInPixels();
+	aBmpTarget = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(aBmpTarget);
+	User::LeaveIfError(aBmpTarget->Create(size, aDestMode));
+    CFbsBitmapDevice *refBitmapDev = CFbsBitmapDevice::NewL(aBmpTarget);
+    CleanupStack::PushL(refBitmapDev);
+    CFbsBitGc *originalBitGc;
+	User::LeaveIfError(refBitmapDev->CreateContext(originalBitGc));
+	CleanupStack::PushL(originalBitGc);
+	originalBitGc->BitBlt(TPoint(0,0), aBmpSrc);
+	CleanupStack::PopAndDestroy(2, refBitmapDev);
+	}
+
+//Helper function: Creates reference bitmap with specified display mode
+void CTDrawResource::CreateBitmapLC(CFbsBitmap*& aBmpTarget, const TSize& aSize, TDisplayMode aDispMode) const
+	{
+	aBmpTarget = new (ELeave) CFbsBitmap;
+	CleanupStack::PushL(aBmpTarget);
+	User::LeaveIfError(aBmpTarget->Create(aSize, aDispMode));
+    CFbsBitmapDevice *refBitmapDev = CFbsBitmapDevice::NewL(aBmpTarget);
+    CleanupStack::PushL(refBitmapDev);
+    CFbsBitGc *originalBitGc;
+	User::LeaveIfError(refBitmapDev->CreateContext(originalBitGc));
+	CleanupStack::PushL(originalBitGc);
+	
+	TRect rect = TRect(aSize); 
+	rect.Shrink(21, 15);
+	
+	originalBitGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
+	originalBitGc->SetBrushColor(TRgb(0,150,150));
+	originalBitGc->DrawRect(TRect(TPoint(0,0), TSize(aSize.iWidth, aSize.iHeight / 2)));
+	originalBitGc->SetBrushColor(TRgb(150,100,150));
+	originalBitGc->DrawRect(TRect(TPoint(0,aSize.iHeight / 2), TSize(aSize.iWidth, aSize.iHeight)));
+
+	originalBitGc->SetBrushColor(TRgb(0,0,128));
+	originalBitGc->DrawRect(rect);
+	
+	
+	CleanupStack::PopAndDestroy(2, refBitmapDev);
+	}
+
+//Helper function: Creates a RSgImage from a bitmap
+void CTDrawResource::CreateSgImageFromBitmapL(RSgImage& aSgImage)
+	{
+	TUint32* data = iRefBitmap->DataAddress();
+	TInt stride = iRefBitmap->DataStride();
+	TSize size = iRefBitmap->SizeInPixels();
+
+	TSgImageInfo info;
+	info.iSizeInPixels = size;
+	info.iScreenId = TheClient->iScreen->CurrentScreenMode();
+	info.iShareable = ETrue; //must be shareable since wserv is in other process
+	info.iUsage = ESgUsageWindowGcSource;
+	info.iPixelFormat = SgUtils::DisplayModeToPixelFormat(iRefBitmap->DisplayMode());
+
+	User::LeaveIfError(aSgImage.Create(info, data, stride));
+	}
+
+//Helper function: Creates all reference bitmaps required for all tests
+void CTDrawResource::CreateReferenceAndCopyBitmapsL()
+	{
+	//Create reference bitmap
+	iRefBitmap = new (ELeave) CFbsBitmap();
+	User::LeaveIfError(iRefBitmap->Create(TSize(160,120),EColor64K));
+	
+	//Setup to draw to original reference bitmap
+    CFbsBitmapDevice *refBitmapDev = CFbsBitmapDevice::NewL(iRefBitmap);
+    CleanupStack::PushL(refBitmapDev);
+    CFbsBitGc *originalBitGc;
+	User::LeaveIfError(refBitmapDev->CreateContext(originalBitGc));
+	CleanupStack::PushL(originalBitGc);
+	
+	//Draw to reference bitmap
+	originalBitGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
+	originalBitGc->SetBrushColor(TRgb(0,150,150));
+	originalBitGc->DrawRect(TRect(TPoint(0,0), TSize(160,60)));
+	originalBitGc->SetBrushColor(TRgb(150,100,150));
+	originalBitGc->DrawRect(TRect(TPoint(0,60), TSize(160,60)));
+	
+	//create a rotated version of the reference bitmap
+	iRotatedRefBitmap = new (ELeave) CFbsBitmap();
+	User::LeaveIfError(iRotatedRefBitmap->Create(TSize(120,160),EColor64K));
+	
+	//Setup to draw to rotated reference bitmap
+    CFbsBitmapDevice *rotRefBitmapDev = CFbsBitmapDevice::NewL(iRotatedRefBitmap);
+    CleanupStack::PushL(rotRefBitmapDev);
+    CFbsBitGc *rotatedBitGc;
+	User::LeaveIfError(rotRefBitmapDev->CreateContext(rotatedBitGc));
+	CleanupStack::PushL(rotatedBitGc);
+	
+	//Draw to rotated reference bitmap
+	rotatedBitGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
+	rotatedBitGc->SetBrushColor(TRgb(0,150,150));
+	rotatedBitGc->DrawRect(TRect(TPoint(60,0), TSize(60,160)));
+	rotatedBitGc->SetBrushColor(TRgb(150,100,150));
+	rotatedBitGc->DrawRect(TRect(TPoint(0,0), TSize(60,160)));
+	
+	//Prepare a scaled version of the rotated reference bitmap to later compare against
+    iScaledBitmap = new (ELeave) CFbsBitmap();
+    User::LeaveIfError(iScaledBitmap->Create(TSize(160,120),EColor64K));
+	//Setup to draw to bitmap
+    CFbsBitmapDevice *scaledBitDev = CFbsBitmapDevice::NewL(iScaledBitmap);
+    CleanupStack::PushL(scaledBitDev);
+    CFbsBitGc *scaledBitGc;
+	User::LeaveIfError(scaledBitDev->CreateContext(scaledBitGc));
+	CleanupStack::PushL(scaledBitGc);
+	//Draw the rotated reference bitmap scaled
+	scaledBitGc->DrawBitmap(KDestRect, iRotatedRefBitmap); 
+	
+	//Prepare a scaled version of the rotated reference bitmap to later compare against
+	iScaledCroppedBitmap = new (ELeave) CFbsBitmap();
+	User::LeaveIfError(iScaledCroppedBitmap->Create(TSize(160,120),EColor64K));
+    
+	//Setup to draw to bitmap
+    CFbsBitmapDevice *scaledCroppedBitDev = CFbsBitmapDevice::NewL(iScaledCroppedBitmap);
+    CleanupStack::PushL(scaledCroppedBitDev);
+    CFbsBitGc *scaledCroppedBitGc;
+	User::LeaveIfError(scaledCroppedBitDev->CreateContext(scaledCroppedBitGc));
+	CleanupStack::PushL(scaledCroppedBitGc);
+	
+	//Draw the rotated reference bitmap scaled
+	TInt width = iRotatedRefBitmap->SizeInPixels().iWidth;
+	TInt height = iRotatedRefBitmap->SizeInPixels().iHeight; 
+	
+	TRect rectSrc;
+	rectSrc.iTl.iX= width - KSourceRect.Height();
+	rectSrc.iTl.iY= 0;
+	rectSrc.iBr.iX= width;
+	rectSrc.iBr.iY= KSourceRect.Width();
+
+	scaledCroppedBitGc->DrawBitmap(KDestRect, iRotatedRefBitmap, rectSrc); 
+	
+	//Prepare bitmap for testing drawable which opened with different screen number
+	iBitmapWrongScreenNumber = new (ELeave) CFbsBitmap();
+    User::LeaveIfError(iBitmapWrongScreenNumber->Create(TSize(160,120),EColor64K));
+	//Setup to draw to bitmap
+    CFbsBitmapDevice *wrongScreenNumberBitDev = CFbsBitmapDevice::NewL(iBitmapWrongScreenNumber);
+    CleanupStack::PushL(wrongScreenNumberBitDev);
+    CFbsBitGc *wrongScreenNumberBitGc;
+	User::LeaveIfError(wrongScreenNumberBitDev->CreateContext(wrongScreenNumberBitGc));
+	CleanupStack::PushL(wrongScreenNumberBitGc);
+	//Draw the rotated reference bitmap scaled
+	wrongScreenNumberBitGc->SetBrushColor(KRgbGreen);
+	wrongScreenNumberBitGc->SetBrushStyle(CFbsBitGc::ESolidBrush);
+	wrongScreenNumberBitGc->SetPenStyle(CFbsBitGc::ENullPen);
+	wrongScreenNumberBitGc->DrawRect(TRect(0, 0, 160, 120)); //
+	
+	//Create a bitmap  to copy to with the same display mode as the reference bitmap
+	iCopyBitmap = new (ELeave) CFbsBitmap();
+	User::LeaveIfError(iCopyBitmap->Create(TSize(640,240),EColor64K));
+	
+	CleanupStack::PopAndDestroy(10, refBitmapDev);
+	}
+
+//Helper function: This function compares two bitmaps on a pixel by pixel basis */
+TBool CTDrawResource::CompareBitmapsByPixel(CFbsBitmap* aCandidateBitmap, CFbsBitmap* aReferenceBitmap)
+	{
+	TBool result = ETrue;
+
+	TSize candidateSize = aCandidateBitmap->SizeInPixels();
+	TSize referenceSize = aReferenceBitmap->SizeInPixels();
+
+	TInt mismatchedPixels = 0;
+	
+	TRgb nativePixel;
+	TRgb referencePixel;
+	for (TInt x = 0; x < referenceSize.iWidth; x++)
+		{
+		for (TInt y = 0; y < referenceSize.iHeight; y++)
+			{
+			TPoint point(x,y);
+			nativePixel = TRgb(0,0,0,0);
+			referencePixel = TRgb(0,0,0,0);
+			aCandidateBitmap->GetPixel(nativePixel, point);
+			aReferenceBitmap->GetPixel(referencePixel, point);
+
+			if (nativePixel != referencePixel)
+				{
+				mismatchedPixels++;
+				result = EFalse;
+				}
+			}
+		}
+	
+	INFO_PRINTF2(_L("Number of different pixels: %i"), mismatchedPixels);
+	return result;
+	}
+//Helper function: This function extracts content of the image associated with the image target and copies it into bitmap
+void CTDrawResource::BitmapLC(CFbsBitmap*& aBmp)
+	{
+	aBmp = new(ELeave) CFbsBitmap;
+    CleanupStack::PushL(aBmp);
+	
+	TSgImageInfo info;
+	TInt res = iImage.GetInfo(info);
+	User::LeaveIfError(res);
+	
+	res = aBmp ->Create(info.iSizeInPixels, SgUtils::PixelFormatToDisplayMode(info.iPixelFormat));
+	User::LeaveIfError(res);
+	TUint32* dataAddressDest = aBmp->DataAddress();
+	
+	RSgImage image;
+	info.iUsage = ESgUsageNone;
+	info.iCpuAccess = ESgCpuAccessReadOnly;
+	res = image.Create(info, iImage);
+	User::LeaveIfError(res);
+	CleanupClosePushL(image);
+	const TAny* dataAddress = NULL; 
+	TInt dataStride;
+	res = image.MapReadOnly(dataAddress, dataStride);
+	User::LeaveIfError(res);
+	Mem::Copy(dataAddressDest, dataAddress, dataStride * info.iSizeInPixels.iHeight);
+	image.Unmap();
+	CleanupStack::PopAndDestroy(&image);
+	}