graphicsdeviceinterface/directgdi/test/tdirectgdiresource.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tdirectgdiresource.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1433 @@
+// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "tdirectgdiresource.h"
+#include <s32mem.h>
+#include <graphics/directgditypes.h>
+#include <graphics/directgdicontext.h>
+
+_LIT(KClip, "Clip");
+_LIT(KWriteAlpha, "WriteAlpha");
+
+const DirectGdi::TGraphicsRotation TestRot[] =
+  	{
+  	DirectGdi::EGraphicsRotationNone,
+  	DirectGdi::EGraphicsRotation90,
+  	DirectGdi::EGraphicsRotation180,
+  	DirectGdi::EGraphicsRotation270
+  	};
+
+CTDirectGdiResource::CTDirectGdiResource() :
+	CActive(CActive::EPriorityStandard),
+	iCurrentState(EStartup)
+	{
+	SetTestStepName(KTDirectGdiResourceStep);
+	}
+
+CTDirectGdiResource::~CTDirectGdiResource()
+	{
+	Cancel();
+	DestroyCommonResource();
+	}
+
+/**
+Writes output image to file. Append dest + src pixel format to the given file name.
+*/
+void CTDirectGdiResource::SaveOutput(const TDesC& aName)
+	{
+	TBuf<KFileNameLength> postfix;
+	postfix.Append(KSourceString);
+	postfix.Append(KSeparator);
+	postfix.Append(TDisplayModeMapping::ConvertPixelFormatToShortPixelFormatString(
+				iTestParams.iSourceResourcePixelFormat));
+
+	TESTNOERROR(WriteTargetOutput(iTestParams, aName, &postfix));
+	}
+
+/**
+Check to see if the current source resource pixel format contains alpha.
+@return ETrue if the current source resource pixel format contais alpha, EFalse otherwise.
+*/
+TBool CTDirectGdiResource::SourceResourceHasAlpha() const
+	{
+	return iTestParams.iSourceResourcePixelFormat==EUidPixelFormatARGB_8888 ||
+		iTestParams.iSourceResourcePixelFormat==EUidPixelFormatARGB_8888_PRE;
+	}
+
+/**
+Check to see if tests should run that only need to be run with one pixel format,
+for example tests to check that clipping regions are working correctly. Tests that are
+only run once are run when the target pixel format and the source pixel format are
+both EUidPixelFormatARGB_8888_PRE.
+@return ETrue if both the current source and target pixel formats are EUidPixelFormatARGB_8888_PRE.
+*/
+TBool CTDirectGdiResource::OneTimeTestEnabled() const
+	{
+	return iTestParams.iTargetPixelFormat==iTestParams.iSourceResourcePixelFormat &&
+		iTestParams.iTargetPixelFormat==EUidPixelFormatARGB_8888_PRE;
+	}
+
+/**
+Draws an image with 4 different orientation using given position as the
+origin e.g
+A B
+ o
+D C
+*/
+void CTDirectGdiResource::DrawTestPattern1(const TPoint& aPos)
+	{
+	const TInt w = iImgSz.iWidth;
+	const TInt h = iImgSz.iHeight;
+
+	iGc->DrawResource(TPoint(aPos.iX-w, aPos.iY-h), iImgSrc, DirectGdi::EGraphicsRotationNone);
+	iGc->DrawResource(TPoint(aPos.iX, aPos.iY-w), iImgSrc, DirectGdi::EGraphicsRotation90);
+	iGc->DrawResource(aPos, iImgSrc, DirectGdi::EGraphicsRotation180);
+	iGc->DrawResource(TPoint(aPos.iX-h, aPos.iY), iImgSrc, DirectGdi::EGraphicsRotation270);
+	}
+
+/**
+Draws two drawables to fit dest rect in the following pattern:
+AB
+*/
+void CTDirectGdiResource::DrawTestPattern1(const TRect& aDestRect,
+			const TDrawableSourceAndEquivRotatedBmps& aDrawable1, const TDrawableSourceAndEquivRotatedBmps& aDrawable2)
+	{
+	const TInt dw = aDestRect.Width();
+	const TInt dh = aDestRect.Height();
+	const TInt xu = dw/2;
+	const TInt yu = dh;
+	
+	iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), aDrawable1, KNullDesC8);
+	iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(xu, yu)),
+			aDrawable2, KNullDesC8);
+	}
+
+/**
+Draws two drawables to fit dest rect in the following pattern:
+A
+B
+*/
+void CTDirectGdiResource::DrawTestPattern2(const TRect& aDestRect,
+			const TDrawableSourceAndEquivRotatedBmps& aDrawable1, const TDrawableSourceAndEquivRotatedBmps& aDrawable2)
+	{
+	const TInt dw = aDestRect.Width();
+	const TInt dh = aDestRect.Height();
+	const TInt xu = dw;
+	const TInt yu = dh/2;
+	
+	iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), aDrawable1, KNullDesC8);
+	iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(xu, yu)),
+			aDrawable2, KNullDesC8);
+	}
+
+/**
+Draws image rotated to fit dest rect in the following pattern:
+AB
+CC
+DD
+*/
+void CTDirectGdiResource::DrawTestPattern1(const TRect& aDestRect, const TRect* aSrcRect)
+	{
+	const TInt dw = aDestRect.Width();
+	const TInt dh = aDestRect.Height();
+	const TInt xu = dw/2;
+	const TInt yu = dh/5;
+	
+	if (aSrcRect)
+		{
+		// use DrawResource(destRect, img, srcRect, rot) API
+		iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), iImgSrc, *aSrcRect, DirectGdi::EGraphicsRotationNone);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(xu, yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation180);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(dw, 2*yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotationNone);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+3*yu), TSize(dw, 2*yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation180);
+		}
+	else
+		{
+		// use DrawResource(destRect, img, rot) API
+		iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), iImgSrc, DirectGdi::EGraphicsRotationNone);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(xu, yu)), iImgSrc,
+				DirectGdi::EGraphicsRotation180);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(dw, 2*yu)), iImgSrc,
+				DirectGdi::EGraphicsRotationNone);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+3*yu), TSize(dw, 2*yu)), iImgSrc,
+				DirectGdi::EGraphicsRotation180);
+		}
+	}
+
+/**
+Draws image rotated to fit dest rect in the following pattern:
+ACD
+BCD
+*/
+void CTDirectGdiResource::DrawTestPattern2(const TRect& aDestRect, const TRect* aSrcRect)
+	{
+	const TInt dw = aDestRect.Width();
+	const TInt dh = aDestRect.Height();
+	const TInt xu = dw/5;
+	const TInt yu = dh/2;
+
+	if (aSrcRect)
+		{
+		// use DrawResource(destRect, img, srcRect, rot) API
+		iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), iImgSrc, *aSrcRect, DirectGdi::EGraphicsRotation90);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(xu, yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation270);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(2*xu, dh)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation90);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+3*xu, aDestRect.iTl.iY), TSize(2*xu, dh)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation270);
+		}
+	else
+		{
+		// use DrawResource(destRect, img, rot) API
+		iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), iImgSrc, DirectGdi::EGraphicsRotation90);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(xu, yu)), iImgSrc,
+				DirectGdi::EGraphicsRotation270);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(2*xu, dh)), iImgSrc,
+				DirectGdi::EGraphicsRotation90);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+3*xu, aDestRect.iTl.iY), TSize(2*xu, dh)), iImgSrc,
+				DirectGdi::EGraphicsRotation270);
+		}
+	}
+
+/**
+Draws image rotated to fit dest rect in the following pattern:
+AB
+CD
+*/
+void CTDirectGdiResource::DrawTestPattern3(const TRect& aDestRect, const TRect* aSrcRect)
+	{
+	TInt dw = aDestRect.Width();
+	TInt dh = aDestRect.Height();
+	TInt xu = dw/2;
+	TInt yu = dh/2;
+
+	if (aSrcRect)
+		{
+		// use DrawResource(destRect, img, srcRect, rot) API
+		iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), iImgSrc, *aSrcRect, DirectGdi::EGraphicsRotationNone);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(xu, yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation180);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(xu, yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation90);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY+yu), TSize(xu, yu)), iImgSrc,
+				*aSrcRect, DirectGdi::EGraphicsRotation270);
+		}
+	else
+		{
+		// use DrawResource(destRect, img, rot) API
+		iGc->DrawResource(TRect(aDestRect.iTl, TSize(xu, yu)), iImgSrc, DirectGdi::EGraphicsRotationNone);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY), TSize(xu, yu)), iImgSrc,
+				DirectGdi::EGraphicsRotation180);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX, aDestRect.iTl.iY+yu), TSize(xu, yu)), iImgSrc,
+				DirectGdi::EGraphicsRotation90);
+		iGc->DrawResource(TRect(TPoint(aDestRect.iTl.iX+xu, aDestRect.iTl.iY+yu), TSize(xu, yu)), iImgSrc,
+				DirectGdi::EGraphicsRotation270);
+		}
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0001
+
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draws drawable resources created from RSgDrawable and RSgImage objects.
+	
+@SYMTestActions			
+	Draw drawble resources with the various combination of parameters:
+	-with and without clipping region
+	-drawable from RSgDrawable and RSgImage
+	-in various destination positions and scaling factor
+	-using write or blend
+		
+@SYMTestExpectedResults	
+	Resources are drawn on the given position, scaled to fit the destination
+	rectangle, clipped to current clipping region (if set).
+*/
+void CTDirectGdiResource::TestDrawResource_ImageAsDrawableL()
+	{
+	_LIT(KTestName, "DrawResource_ImageAsDrawable");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	TBuf<KFileNameLength> tag;
+	tag.Append(KTestName);
+
+	ResetGc();
+	if (iEnableClipRegion)
+		{
+		iGc->SetClippingRegion(iClip);
+		tag.Append(KClip);
+		}
+
+	if (iUseWriteAlpha)
+		{
+		iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+		tag.Append(KWriteAlpha);
+		}
+
+	DrawTestPattern1(TRect(0,0,100,20), iDwbSrc[0], iDwbSrc[1]);
+	DrawTestPattern2(TRect(0,20,100,100), iDwbSrc[0], iDwbSrc[1]);
+	DrawTestPattern1(TRect(0,100,100,200), iDwbSrc[0], iDwbSrc[1]);
+	DrawTestPattern2(TRect(100,0,200,200), iDwbSrc[0], iDwbSrc[1]);
+
+	if (iEnableClipRegion)
+		{
+		iGc->ResetClippingRegion();
+		iGc->SetDrawMode(DirectGdi::EDrawModePEN);
+		}
+
+	SaveOutput(tag);
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0002
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draw an image resource created from RSgImage object.
+	
+@SYMTestActions			
+	Draw an image resource with the various combination of parameters:
+	-with and without clipping region
+	-in various destination positions on/off target
+	-using write or blend
+	-no scaling is performed in this test
+	
+@SYMTestExpectedResults	
+	Resources are drawn on the given position, unscaled, rotated and
+	clipped to current clipping region (if set).
+*/
+void CTDirectGdiResource::TestDrawResource_PosL()
+	{
+	_LIT(KTestName, "DrawResource_Pos");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	TBuf<KFileNameLength> tag;
+	tag.Append(KTestName);
+	
+	ResetGc();
+
+	if (iEnableClipRegion)
+		{
+		iGc->SetClippingRegion(iClip);
+		tag.Append(KClip);
+		}
+
+	if (iUseWriteAlpha)
+		{
+		iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+		tag.Append(KWriteAlpha);
+		}
+
+	DrawTestPattern1(TPoint(0,0));
+	DrawTestPattern1(TPoint(100,0));
+	DrawTestPattern1(TPoint(200,0));
+
+	DrawTestPattern1(TPoint(50,50));
+	DrawTestPattern1(TPoint(150,50));
+
+	DrawTestPattern1(TPoint(0,100));
+	DrawTestPattern1(TPoint(100,100));
+	DrawTestPattern1(TPoint(200,100));
+
+	DrawTestPattern1(TPoint(50,150));
+	DrawTestPattern1(TPoint(150,150));
+
+	DrawTestPattern1(TPoint(0,200));
+	DrawTestPattern1(TPoint(100,200));
+	DrawTestPattern1(TPoint(200,200));
+
+	if (iEnableClipRegion)
+		{
+		iGc->ResetClippingRegion();
+		iGc->SetDrawMode(DirectGdi::EDrawModePEN);
+		}
+
+	SaveOutput(tag);
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0003
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draw a scaled image resource created from RSgImage object.
+	
+@SYMTestActions			
+	Draw a scaled image resource with the various combination of parameters:
+	-with and without clipping region
+	-in various destination positions and scaling factor
+	-using write or blend
+	-the destination rectangle that the image is drawn to scaled
+	
+@SYMTestExpectedResults	
+	Resources are drawn on the given position, scaled to fit the
+	destination rectangle, rotated and clipped to current clipping region (if set).
+*/
+void CTDirectGdiResource::TestDrawResource_DestRectL()
+	{
+	_LIT(KTestName, "DrawResource_DestRect");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	TBuf<KFileNameLength> tag;
+	tag.Append(KTestName);
+
+	ResetGc();
+
+	if (iEnableClipRegion)
+		{
+		iGc->SetClippingRegion(iClip);
+		tag.Append(KClip);
+		}
+
+	if (iUseWriteAlpha)
+		{
+		iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+		tag.Append(KWriteAlpha);
+		}
+
+	DrawTestPattern1(TRect(0,0,100,100));
+	DrawTestPattern2(TRect(100,0,200,100));
+	DrawTestPattern3(TRect(0,100,100,200));
+	DrawTestPattern1(TRect(100,100,150,150));
+	DrawTestPattern2(TRect(150,100,200,150));
+	DrawTestPattern3(TRect(100,150,200,200));
+
+	if (iEnableClipRegion)
+		{
+		iGc->ResetClippingRegion();
+		iGc->SetDrawMode(DirectGdi::EDrawModePEN);		
+		}
+
+	SaveOutput(tag);
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0004
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draw a scaled portion of an image resource created from RSgImage object.
+	
+@SYMTestActions			
+	Draw a scaled portion of an image resource with the various combination of parameters:
+	-with and without clipping region
+	-various destination positions and size
+	-using write or blend
+	-only a portion of the image resource is drawn, it is drawn scaled
+	
+@SYMTestExpectedResults	
+	Resources are drawn on the given position, scaled to fit the
+	destination rectangle, rotated and clipped to current clipping region (if set).
+*/
+void CTDirectGdiResource::TestDrawResource_DestRectSrcRectL()
+	{
+	_LIT(KTestName, "DrawResource_DestRectSrcRect");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	TBuf<KFileNameLength> tag;
+	tag.Append(KTestName);
+
+	ResetGc();
+	if (iEnableClipRegion)
+		{
+		iGc->SetClippingRegion(iClip);
+		tag.Append(KClip);
+		}
+
+	if (iUseWriteAlpha)
+		{
+		iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+		tag.Append(KWriteAlpha);
+		}
+
+	TRect srcRect(TPoint(1,1), TSize(48,18));
+	DrawTestPattern1(TRect(0,0,100,100), &srcRect);
+	DrawTestPattern2(TRect(100,0,200,100), &srcRect);
+	DrawTestPattern3(TRect(0,100,100,200), &srcRect);
+	DrawTestPattern1(TRect(100,100,150,150), &srcRect);
+	DrawTestPattern2(TRect(150,100,200,150), &srcRect);
+	DrawTestPattern3(TRect(100,150,200,200), &srcRect);
+
+	if (iEnableClipRegion)
+		{
+		iGc->ResetClippingRegion();
+		iGc->SetDrawMode(DirectGdi::EDrawModePEN);		
+		}
+
+	SaveOutput(tag);
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0005
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc
+	Attempt to draw a resource with a NULL handle for each of the DrawResource methods
+	that draw image sources to improve code coverage.
+	
+@SYMTestActions	
+	Create an RSgImage,
+	Create a RDirectGdiDrawableSource from it,
+	Attempt to draw the RDirectGdiDrawableSource with each of the DrawResource methods.
+	Each method should set an error of KErrBadHandle.
+	
+@SYMTestExpectedResults	
+	Driver returns KErrBadHandle for each attempt to draw invalid resource.
+ */
+void CTDirectGdiResource::TestDrawResource_NullHandleL()
+	{
+	_LIT(KTestName, "DrawResource_NullHandle");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	CDirectGdiDriver* drv = CDirectGdiDriver::Static();
+	TESTL(drv != NULL);
+
+	// null handle
+	//
+	RDirectGdiDrawableSource dwb(*drv);
+	RDirectGdiDrawableSource img(*drv);
+	
+	// Convert the image source, drawable source and bitmaps to TDrawableSourceAndEquivRotatedBmps so it can be
+	// drawn using the BitGdi test code as well as the DirectGdi code
+	TDrawableSourceAndEquivRotatedBmps imageSource;
+	imageSource.iDrawableSrc = &img;
+	TDrawableSourceAndEquivRotatedBmps drawableSource;
+	drawableSource.iDrawableSrc = &dwb;
+
+	TPoint pos;
+	TRect dstRect(pos, TSize(100,100));
+	TRect srcRect(pos, TSize(10,10));	
+	
+	// DrawResource(const TRect&, const RDirectGdiDrawableSource&, const TDesC8&)
+	iGc->DrawResource(dstRect, drawableSource, KNullDesC8);
+	TESTL(iGc->GetError() == KErrBadHandle);
+
+	for (TInt rot=0; rot<sizeof(TestRot)/sizeof(TestRot[0]); ++rot)
+		{
+		// DrawResource(const TPoint&, const RDirectGdiDrawableSource&, DirectGdi::TGraphicsRotation)
+		iGc->DrawResource(pos, imageSource, TestRot[rot]);
+		TESTL(iGc->GetError() == KErrBadHandle);
+
+		// DrawResource(const TRect&, const RDirectGdiDrawableSource&, DirectGdi::TGraphicsRotation)
+		iGc->DrawResource(dstRect, imageSource, TestRot[rot]);
+		TESTL(iGc->GetError() == KErrBadHandle);
+
+		// DrawResource(const TRectt&, const RDirectGdiDrawableSource&, const TRect&, DirectGdi::TGraphicsRotation)
+		iGc->DrawResource(dstRect, imageSource, srcRect, TestRot[rot]);
+		TESTL(iGc->GetError() == KErrBadHandle);
+		}
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0006
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draw onto an RSgImage as a target, then convert to it a source and draw that 
+	as a resource.
+	
+@SYMTestActions			
+	Test the use case where we:
+	Draw red, green and blue rectangles to a target.
+	Create a source from the targets' bitmap.
+	Clear the target.
+	Draw the source to the target.
+	
+@SYMTestExpectedResults	
+	The three rectangles should have been appear when the source is copied to the target. 
+*/
+void CTDirectGdiResource::TestDrawTargetAsSourceL()
+	{
+	_LIT(KTestName, "DrawResource_TestDrawTargetAsSource");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();		
+	
+	// draw to the current target
+	TRect rect(20,20,100,100);	
+	iGc->SetPenColor(TRgb(255,0,0));
+	iGc->DrawRect(rect);
+	iGc->SetPenColor(TRgb(0,255,0));
+	rect.Move(20,20);
+	iGc->DrawRect(rect);
+	iGc->SetPenColor(TRgb(0,0,255));
+	rect.Move(20,20);
+	iGc->DrawRect(rect);
+	TESTNOERROR(iGc->GetError());
+	
+	// Only do the second part of the test if using DirectGdi. The resultant test bitmap should looks the
+	// same when using DirectGdi as the one drawn using BitGdi that only uses the above calls.
+	if (iUseDirectGdi)
+		{
+		iGdiTarget->Finish();
+		TESTNOERROR(iGc->GetError());
+		
+		// get the target bitmap
+		CFbsBitmap* bitmap = iGdiTarget->GetTargetFbsBitmapL();
+		TESTL(bitmap != NULL);
+		
+		// Create an RSgImage using the target bitmap	
+		TSgImageInfo imageInfo;
+		imageInfo.iSizeInPixels = bitmap->SizeInPixels();
+		imageInfo.iPixelFormat = iTestParams.iTargetPixelFormat; // only call this test when the target and the source resource pixel format are the same
+		imageInfo.iUsage = ESgUsageDirectGdiSource;
+		RSgImage sgImage;	
+		TInt err = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+		CleanupClosePushL(sgImage);	
+		TESTNOERRORL(err);
+		
+		CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static();	
+		TESTL(dgdiDriver != NULL);	
+		
+		// Create a RDirectGdiDrawableSource from the RSgImage
+		RDirectGdiDrawableSource dgdiImageSource(*dgdiDriver);
+		err = dgdiImageSource.Create(sgImage);
+		TESTNOERRORL(err);
+		
+		iGc->Clear();
+		
+		// Convert the image source and bitmap to TDrawableSourceAndEquivRotatedBmps so it can be
+		// drawn using the BitGdi test code as well as the DirectGdi code
+		TDrawableSourceAndEquivRotatedBmps imageSource;
+		imageSource.iDrawableSrc = &dgdiImageSource;
+		imageSource.iBmpRotNone = bitmap;
+		
+		// Draw the RDirectGdiDrawableSource using CDirectGdiContext::DrawResource	
+		iGc->DrawResource(TPoint(0,0), imageSource);		
+		
+		dgdiImageSource.Close();
+		CleanupStack::PopAndDestroy(1, &sgImage);
+		}
+	
+	// Output the target image to make sure it contains what was drawn onto the source
+	TESTNOERROR(WriteTargetOutput(iTestParams, KTestName()));
+	}
+
+/**
+@SYMTestCaseID				
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0007
+	
+@SYMTestPriority			
+	Critical
+	
+@SYMPREQ					
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus				
+	Implemented
+	
+@SYMTestCaseDesc			
+	Create two CDirectGdiImageSource object from the same RSgImage
+	
+@SYMTestActions				
+	Test the use case where we:
+	Create an RSgImage
+	Create two CDirectGdiImageSource objects.
+	The CDirectGdiImageSource objects should share the EGL image created from
+	the RSgImage
+	as only one EGL image can be created per RSgImage per process.
+	If the EGL image sharing is not working an error will occur when creating the
+	second CDirectGdiImageSource object.
+	
+@SYMTestExpectedResults		
+	This test does not output an image, it is just for testing that no errors or panics occur.
+*/
+void CTDirectGdiResource::TestShareEGLImageBetweenSourcesL()
+	{
+	_LIT(KTestName, "ShareEGLImageBetweenSources");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();	
+	
+	CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static();
+	TESTL(dgdiDriver != NULL);	
+	
+	// Create a CFbsBitmap
+	TSize patternSize(90,50);
+	TRect rect(0,0,90,50);
+	CFbsBitmap* bitmap = CreateCheckedBoardBitmapL(iTestParams.iSourceResourcePixelFormat, patternSize);
+	TESTL(NULL != bitmap);
+	CleanupStack::PushL(bitmap);	
+	
+	// Create an RSgImage from the CFbsBitmap
+	TSgImageInfo imageInfo;
+	imageInfo.iSizeInPixels = patternSize;
+	imageInfo.iPixelFormat = iTestParams.iSourceResourcePixelFormat;
+	imageInfo.iUsage = ESgUsageDirectGdiSource;
+	RSgImage sgImage;	
+	TInt res = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());	
+	TESTNOERRORL(res);	
+	CleanupClosePushL(sgImage);
+	
+	// Create a RDirectGdiDrawableSource from the RSgImage
+	RDirectGdiDrawableSource dgdiImageSource1(*dgdiDriver);	
+	res = dgdiImageSource1.Create(sgImage);		
+	TESTNOERRORL(res);
+	CleanupClosePushL(dgdiImageSource1);
+	
+	// Create a second RDirectGdiDrawableSource from the same RSgImage,
+	// no error should occur here, the underlying EGL images created should be
+	// shared between sources
+	RDirectGdiDrawableSource dgdiImageSource2(*dgdiDriver);	
+	res = dgdiImageSource2.Create(sgImage);		
+	TESTNOERRORL(res);	
+	
+	dgdiImageSource1.Close();
+	dgdiImageSource2.Close();
+	CleanupStack::PopAndDestroy(3, bitmap);
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0008
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draw resource with valid resource but other invalid parameters
+	
+@SYMTestActions			
+	Draw valid RDirectGdiDrawableSource objects with invalid
+	parameters. Test the following for each valid rotation:
+	- drawing a resource where the source rectangle does not intersect the actual image extent
+	- drawing a resource where the source rectangle is not fully contained by the image extent
+	
+	
+@SYMTestExpectedResults	
+	Driver returns KErrArgument for each attempt to draw resource with invalid parameters.
+*/
+void CTDirectGdiResource::TestDrawResource_InvalidParameterL()
+	{
+	_LIT(KTestName, "DrawResource_InvalidParameter");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	// destRect can be anything
+	TPoint pos;
+	TRect dstRect(pos, iImgSz);
+
+	// srcRect doesn't intersect image extent at all
+	TRect srcRect1(TPoint(1000,1000), TSize(1,1));
+	// srcRect is not fully contained within image extent
+	TRect srcRect2(TPoint(10,10), TSize(1000,1000));
+	TRect srcRect3(TPoint(-10,0), iImgSz);
+	
+	for (TInt rot=0; rot<sizeof(TestRot)/sizeof(TestRot[0]); ++rot)
+		{
+		iGc->DrawResource(dstRect, iImgSrc, srcRect1, TestRot[rot]);
+		TESTL(iGc->GetError() == KErrArgument);
+
+		iGc->DrawResource(dstRect, iImgSrc, srcRect2, TestRot[rot]);
+		TESTL(iGc->GetError() == KErrArgument);
+
+		iGc->DrawResource(dstRect, iImgSrc, srcRect3, TestRot[rot]);
+		TESTL(iGc->GetError() == KErrArgument);
+		}
+	}
+
+/**
+@SYMTestCaseID			
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0009
+	
+@SYMTestPriority		
+	Critical
+	
+@SYMPREQ				
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestStatus			
+	Implemented
+	
+@SYMTestCaseDesc		
+	Draw resources with a non-zero origin set.
+	
+@SYMTestActions			
+	Set drawing context origin to various non-zero values and draw RDirectGdiDrawableSource
+	objects using generic underlying DrawResource implementation that takes destination
+	and source rectangle.
+	
+@SYMTestExpectedResults	
+	Resource drawn at the specified location relative to drawing context origin.
+*/
+void CTDirectGdiResource::TestDrawResource_NonZeroOriginL()
+	{
+	_LIT(KTestName, "DrawResource_NonZeroOrigin");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	const TPoint origin[] = 
+		{
+		TPoint(-100,-100),
+		TPoint(100,-100),
+		TPoint(100,0),
+		TPoint(-100,100),
+		TPoint(0,100),
+		TPoint(100,100)		
+		};
+
+	for (TInt idx=0; idx<sizeof(origin)/sizeof(origin[0]); ++idx)
+		{
+		TBuf<KFileNameLength> tag;
+		tag.Append(KTestName);
+		tag.AppendNum(idx);
+
+		ResetGc();	
+		iGc->SetOrigin(origin[idx]);
+
+		TRect srcRect(TPoint(0,0), iImgSz);
+
+		DrawTestPattern1(TRect(0,0,100,100), &srcRect);
+		DrawTestPattern2(TRect(100,0,200,100), &srcRect);
+		DrawTestPattern3(TRect(0,100,100,200), &srcRect);
+		DrawTestPattern1(TRect(100,100,150,150), &srcRect);
+		DrawTestPattern2(TRect(150,100,200,150), &srcRect);
+		DrawTestPattern3(TRect(100,150,200,200), &srcRect);
+
+		SaveOutput(tag);
+		}
+	}
+
+/**
+@SYMTestCaseID		
+	GRAPHICS-DIRECTGDI-DRAWRESOURCE-0010
+
+@SYMTestPriority
+	Critical
+
+@SYMPREQ
+	PREQ39
+
+@SYMREQ
+	REQ9178 
+	REQ9200 
+	REQ9201 
+	REQ9202 
+	REQ9203 
+	REQ9222 
+	REQ9228 
+	REQ9223 
+	REQ9236 
+	REQ9237
+
+@SYMTestCaseDesc
+	Tests if DirectGDI methods returns an error when called on a not constructed RDirectGdiDrawableSource object.
+
+@SYMTestActions		
+	Create a CFbsBitmap. 
+	Create an RSgImage from the CFbsBitmap.
+	Allocate a RDirectGdiDrawableSource but do not call Create() method.
+	Draw the RDirectGdiDrawableSource using CDirectGdiContext::DrawResource.
+
+@SYMTestExpectedResults
+	CDirectGdiContext::DrawResource should return KErrBadHandle.
+*/
+void CTDirectGdiResource::TestDrawResourceSourceNotCreatedL()
+	{
+	_LIT(KTestName, "DrawResource_SourceNotCreated");
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	if (iUseDirectGdi)
+		{
+		ResetGc();
+		
+		TInt res = CDirectGdiDriver::Open();
+		TESTNOERRORL(res);		
+		
+		CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static();
+		TESTL(dgdiDriver != NULL);	
+		CleanupClosePushL(*dgdiDriver);	
+		
+		// Create a CFbsBitmap
+		TSize patternSize(90,50);
+		CFbsBitmap* bitmap = CreateCheckedBoardBitmapL(iTestParams.iSourceResourcePixelFormat, patternSize);
+		TESTL(NULL != bitmap);
+		CleanupStack::PushL(bitmap);	
+		
+		// Create an RSgImage from the CFbsBitmap
+		TSgImageInfo imageInfo;
+		imageInfo.iSizeInPixels = patternSize;
+		imageInfo.iPixelFormat = iTestParams.iSourceResourcePixelFormat;
+		imageInfo.iUsage = ESgUsageDirectGdiSource;
+		RSgImage sgImage;	
+		res = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+		CleanupClosePushL(sgImage);
+		TESTNOERRORL(res);		
+		
+		//allocate RDirectGdiDrawableSource, but do not call Create() method
+		RDirectGdiDrawableSource dgdiImageSource(*dgdiDriver);	
+		
+		// Draw the RDirectGdiDrawableSource using CDirectGdiContext::DrawResource
+		TDrawableSourceAndEquivRotatedBmps imageSource;
+		imageSource.iDrawableSrc = &dgdiImageSource;
+		iGc->DrawResource(TPoint(10,10), imageSource);
+		TESTL(iGc->GetError() == KErrBadHandle);		
+		dgdiImageSource.Close();
+		CleanupStack::PopAndDestroy(3, dgdiDriver); 
+		}
+	}
+
+/** 
+Override of base class pure virtual
+Our implementation only gets called if the base class doTestStepPreambleL() did
+not leave. That being the case, the current test result value will be EPass.
+@leave Gets system wide error code
+@return TVerdict code
+*/	
+TVerdict CTDirectGdiResource::doTestStepL()
+	{			
+	INFO_PRINTF1(_L("DirectGdi Resource Tests"));	
+		
+	// Test for each target pixel format
+	for(TInt targetPixelFormatIndex = iTargetPixelFormatArray.Count() - 1; targetPixelFormatIndex >= 0 ; targetPixelFormatIndex--)
+		{ 
+		iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[targetPixelFormatIndex];
+		TBuf<KPixelFormatNameLength> targetPixelFormatName(TDisplayModeMapping::ConvertPixelFormatToPixelFormatString(iTestParams.iTargetPixelFormat));
+		// Test for each source pixel format
+		for (TInt sourceResourcePixelFormatIndex = iSourceResourcePixelFormatArray.Count() - 1; sourceResourcePixelFormatIndex >= 0; sourceResourcePixelFormatIndex--)
+			{
+			TBool doOOM = EFalse;
+			iTestParams.iSourceResourcePixelFormat = iSourceResourcePixelFormatArray[sourceResourcePixelFormatIndex];
+			if(EUidPixelFormatXRGB_8888 == iTestParams.iSourceResourcePixelFormat)
+				doOOM = ETrue;
+			TBuf<KPixelFormatNameLength> sourcePixelFormatName(TDisplayModeMapping::ConvertPixelFormatToPixelFormatString(iTestParams.iSourceResourcePixelFormat));
+			INFO_PRINTF3(_L("Target Pixel Format: %S;  Source Resource Pixel Format: %S"), &targetPixelFormatName, &sourcePixelFormatName);							
+					
+			SetTargetL(iTestParams.iTargetPixelFormat);
+			CreateCommonResourceL();					
+			
+			RunTestsL();
+			
+			// only run OOM tests for one target pixel format to prevent duplication of tests
+			if (targetPixelFormatIndex == 0 && doOOM)
+				{		
+				RunOomTestsL(); // from base class
+				}
+			
+			DestroyCommonResource();			
+			}
+		}
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+/**
+Helper function used to create the resources that are shared between all the tests in this file.
+ */
+void CTDirectGdiResource::CreateCommonResourceL()
+	{
+	// Create a CFbsBitmap
+	CFbsBitmap* bitmap;
+	RSgDrawable sgDwb;
+
+	// Generate tiled color pattern, test expects original image size to be 50x20 and has alpha values
+	TSize patternSize(50,20);
+	bitmap = CreateCheckedBoardBitmapL(iTestParams.iSourceResourcePixelFormat, patternSize, TSize(10, 10), ETrue);	
+	iImgSrc.iBmpRotNone = bitmap;		
+	iImgSz = bitmap->SizeInPixels();
+	
+	// Create rotated versions of the bitmap so they can be used when drawing BitGdi equivalent
+	// test images for the new DrawResource methods
+	iImgSrc.iBmpRot90 = new(ELeave) CFbsBitmap;		
+	iImgSrc.iBmpRot180 = new(ELeave) CFbsBitmap;		
+	iImgSrc.iBmpRot270 = new(ELeave) CFbsBitmap;	
+
+	// Create an RSgImage from the CFbsBitmap
+	TSgImageInfo imageInfo;
+	imageInfo.iSizeInPixels = iImgSz;
+	imageInfo.iPixelFormat = iTestParams.iSourceResourcePixelFormat;
+	imageInfo.iUsage = ESgUsageDirectGdiSource;
+
+	RSgImage sgImage;	
+	TInt res = sgImage.Create(imageInfo, bitmap->DataAddress(), bitmap->DataStride());
+	TESTNOERRORL(res);
+	CleanupClosePushL(sgImage);	
+
+	if (iUseDirectGdi)
+		{
+		// Create a RDirectGdiDrawableSource from the RSgImage
+
+		// Driver must've been initialised by framework, no need to re-open
+		//
+		// Driver behaviour i.e. Sg::Open/Close, CDirectGdiDriver::Open/Close should be tested
+		// somewhere else not in details drawing ops test like this
+		CDirectGdiDriver* drv = CDirectGdiDriver::Static();
+		TEST(drv != NULL);
+		
+		iImgSrc.iDrawableSrc = new RDirectGdiDrawableSource(*drv);
+		TEST(iImgSrc.iDrawableSrc != NULL);
+		res = iImgSrc.iDrawableSrc->Create(sgImage);		
+		TESTNOERRORL(res);	
+
+		// Create drawable source from drawable
+		res = sgDwb.Open(sgImage.Id());
+		TESTNOERRORL(res);
+		CleanupClosePushL(sgDwb);
+
+		iDwbSrc[0].iDrawableSrc = new RDirectGdiDrawableSource(*drv);
+		TEST(iDwbSrc[0].iDrawableSrc != NULL);
+		res = iDwbSrc[0].iDrawableSrc->Create(sgDwb);
+		TESTNOERRORL(res);
+		
+		// Create drawable source from image
+		iDwbSrc[1].iDrawableSrc = new RDirectGdiDrawableSource(*drv);
+		TEST(iDwbSrc[1].iDrawableSrc != NULL);
+		res = iDwbSrc[1].iDrawableSrc->Create(sgImage);
+		TESTNOERRORL(res);
+		}
+	else
+		{
+		// Share the bitmaps from iImgSrc with this drawable for testing
+		iDwbSrc[0].iBmpRotNone = iImgSrc.iBmpRotNone; 
+		iDwbSrc[0].iBmpRot90 = iImgSrc.iBmpRot90; 
+		iDwbSrc[0].iBmpRot180 = iImgSrc.iBmpRot180;
+		iDwbSrc[0].iBmpRot270 = iImgSrc.iBmpRot270;
+		
+		// Share the bitmaps from iImgSrc with this drawable for testing
+		iDwbSrc[1].iBmpRotNone = iImgSrc.iBmpRotNone; 
+		iDwbSrc[1].iBmpRot90 = iImgSrc.iBmpRot90; 
+		iDwbSrc[1].iBmpRot180 = iImgSrc.iBmpRot180;
+		iDwbSrc[1].iBmpRot270 = iImgSrc.iBmpRot270;
+		}
+
+	// Create horizontal and vertical stripe clipping region
+	TInt w = 1;
+	TBool on = EFalse;
+	for (TInt x=0; x<50; x+=w)
+		{
+		on = !on;
+		if (on && x+w<50)
+			{
+			TRect r1(TPoint(x,0), TSize(w, 200));
+			TRect r2(TPoint(100+x,0), TSize(w, 200));
+			iClip.AddRect(r1);
+			iClip.AddRect(r2);
+			}
+		++w;
+		}
+	TInt h = 1;
+	on = EFalse;
+	for (TInt y=0; y<200; y+=h)
+		{
+		on = !on;
+		if (on && y+h<200)
+			{
+			TRect r1(TPoint(0,y), TSize(100, h));
+			TRect r2(TPoint(100,y), TSize(100, h));
+			iClip.AddRect(r1);
+			iClip.AddRect(r2);
+			}
+		++h;
+		}
+	
+	if (!iUseDirectGdi)
+		{
+		// We need to create 3 rotated copies of the bitmap we are drawing when testing using BitGdi
+		// using the CBitmapRotator active object, start rotating the first one here
+		iCurrentState = ERotatingBitmap90;
+		iBitmapRotator->Rotate(&iStatus, *bitmap, *(iImgSrc.iBmpRot90), CBitmapRotator::ERotation90DegreesClockwise);
+		SetActive();
+		CActiveScheduler::Start();
+		}
+	
+	// Destroy bitmap, image and drawable.
+	CleanupStack::PopAndDestroy(iUseDirectGdi ? 2 : 1, &sgImage);
+	}
+
+/**
+Helper function used to destroy the resources that are shared between all the tests in this file.
+ */
+void CTDirectGdiResource::DestroyCommonResource()
+	{
+	if (iImgSrc.iDrawableSrc)
+		{
+		iImgSrc.iDrawableSrc->Close();
+		delete iImgSrc.iDrawableSrc;
+		iImgSrc.iDrawableSrc = NULL;
+		}
+	
+	delete iImgSrc.iBmpRotNone;
+	iImgSrc.iBmpRotNone = NULL;
+	delete iImgSrc.iBmpRot90;
+	iImgSrc.iBmpRot90 = NULL;
+	delete iImgSrc.iBmpRot180;
+	iImgSrc.iBmpRot180 = NULL;
+	delete iImgSrc.iBmpRot270;
+	iImgSrc.iBmpRot270 = NULL;	
+
+	for (TInt ii=0; ii<2; ++ii)
+		{
+		if (iDwbSrc[ii].iDrawableSrc)
+			{
+			iDwbSrc[ii].iDrawableSrc->Close();
+			delete iDwbSrc[ii].iDrawableSrc;
+			iDwbSrc[ii].iDrawableSrc = NULL;
+			}
+		
+		iDwbSrc[ii].iBmpRotNone = NULL;
+		iDwbSrc[ii].iBmpRot90 = NULL;
+		iDwbSrc[ii].iBmpRot180 = NULL;
+		iDwbSrc[ii].iBmpRot270 = NULL;		
+		}
+
+	iClip.Close();
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTDirectGdiResource::doTestStepPreambleL()
+	{				
+	CTDirectGdiStepBase::doTestStepPreambleL();
+	CActiveScheduler::Add(this);
+	iBitmapRotator = CBitmapRotator::NewL();		
+	return TestStepResult();
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTDirectGdiResource::doTestStepPostambleL()
+	{		 
+	delete iBitmapRotator;	
+	iBitmapRotator = NULL;
+	CTDirectGdiStepBase::doTestStepPostambleL();
+	return TestStepResult();
+}
+
+void CTDirectGdiResource::DoDrawTestL()
+	{
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0001"));
+	TestDrawResource_ImageAsDrawableL();
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0002"));
+	TestDrawResource_PosL();
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0003"));
+	TestDrawResource_DestRectL();
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0004"));
+	TestDrawResource_DestRectSrcRectL();
+	RecordTestResultL();
+	}
+
+/**
+Override of base class pure virtual
+Lists the tests to be run
+*/
+void CTDirectGdiResource::RunTestsL()
+	{		
+	// For all combination of destination and source pixel format do the following tests
+	//
+	DoDrawTestL();
+	
+	// Extra test using EDrawModeWriteAlpha. Geometry tests are irrelevant here, only contents tests are.
+	//
+	if (SourceResourceHasAlpha())
+		{
+		iUseWriteAlpha = ETrue;
+		DoDrawTestL();
+		iUseWriteAlpha = EFalse;
+		}
+
+	// Geometry and negative tests doesn't need repeating, do it once
+	//
+	if (OneTimeTestEnabled())
+		{
+		iEnableClipRegion = ETrue;
+		DoDrawTestL();
+		iEnableClipRegion = EFalse;
+
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0009"));
+		TestDrawResource_NonZeroOriginL();
+		RecordTestResultL();
+		if (iUseDirectGdi)
+			{
+			// These test for errors being set that are specific to DirectGdi and
+			// have no output so there is no need to run for BitGdi
+			SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0005"));
+			TestDrawResource_NullHandleL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0008"));
+			TestDrawResource_InvalidParameterL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0010"));
+			TestDrawResourceSourceNotCreatedL();
+			RecordTestResultL();
+			}		
+		}
+
+	// This test uses the target as a source, so only call it when the target
+	// pixel format is the same as the source resource pixel format
+	//
+	if (iTestParams.iTargetPixelFormat == iTestParams.iSourceResourcePixelFormat)
+		{
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0006"));
+		TestDrawTargetAsSourceL();
+		RecordTestResultL();
+		}
+
+	if (iUseDirectGdi)
+		{
+		// This test is only appropriate when using DirectGdi as it tests sharing of EGL images
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWRESOURCE-0007"));
+		TestShareEGLImageBetweenSourcesL();
+		RecordTestResultL();
+		}
+	}
+
+/**
+From CActive
+ */
+void CTDirectGdiResource::RunL()
+	{
+	switch (iCurrentState)
+		{
+		case ERotatingBitmap90:
+			// Rotate the next bitmap (180)
+			iCurrentState = ERotatingBitmap180;
+			iBitmapRotator->Rotate(&iStatus, *(iImgSrc.iBmpRotNone), *(iImgSrc.iBmpRot180), CBitmapRotator::ERotation180DegreesClockwise);
+			SetActive();
+			break;
+			
+		case ERotatingBitmap180:
+			// Rotate the next bitmap (270)
+			iCurrentState = ERotatingBitmap270;
+			iBitmapRotator->Rotate(&iStatus, *(iImgSrc.iBmpRotNone), *(iImgSrc.iBmpRot270), CBitmapRotator::ERotation270DegreesClockwise);
+			SetActive();
+			break;
+			
+		case ERotatingBitmap270:
+			// Finished rotating the bitmaps, run the tests now
+			iCurrentState = EDone;			
+			CActiveScheduler::Stop();
+			break;
+		}
+	}
+
+/**
+From CActive
+ */
+void CTDirectGdiResource::DoCancel()
+	{
+	}