graphicsdeviceinterface/directgdi/test/tdirectgdicontexttarget.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tdirectgdicontexttarget.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,429 @@
+// 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 "tdirectgdicontexttarget.h"
+#include <graphics/directgdicontext.h>
+
+CTDirectGdiContextTarget::CTDirectGdiContextTarget()
+	{
+	SetTestStepName(KTDirectGdiContextTargetStep);
+	}
+
+CTDirectGdiContextTarget::~CTDirectGdiContextTarget()
+	{
+	}
+
+/**
+@SYMTestCaseID		
+	GRAPHICS-DIRECTGDI-CONTEXTTARGET-0001
+
+@SYMTestPriority
+	Critical
+
+@SYMPREQ
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+
+@SYMTestCaseDesc
+	Use case - Single context and multiple targets.
+
+@SYMTestActions		
+	Construct CDirectGdiDriver.
+	Construct CDirectGdiContext.
+
+	Construct RSgImage1.
+	Construct MDirectGdiImageTarget1. 
+ 	Create MDirectGdiImageTarget1, using RSgImage1.
+
+	Activate CDirectGdiContext using MDirectGdiImageTarget1.
+	Do some drawing operations using a different pen/brush setting
+  
+	Construct RSgImage2.
+	Construct MDirectGdiImageTarget2. 
+	Create MDirectGdiImageTarget2, using RSgImage2.
+
+	Activate CDirectGdiContext using MDirectGdiImageTarget2.
+	Do some drawing operations using a different pen/brush setting
+  
+	Destroy RSgImage.
+	Destroy MDirectGdiImageTarget.
+
+	Destroy CDirectGdiContext.
+	Close CDirectGdiDriver.	
+
+@SYMTestExpectedResults
+	It should be able to switch the targets between the same context.
+	
+@SYMTestStatus 		
+	Implemented
+*/
+void CTDirectGdiContextTarget::TestSwitchingTargetsL()
+	{
+	TInt result = KErrNone;
+	_LIT(KTestName, "ContextTarget-SwitchingTargets"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	if (iTargetPixelFormatArray.Count() <= 1)
+		{
+		// The MBX driver only supports one pixelformat. This test has no purpose
+		// when both targets are the same, so in this case we don't run it.
+		INFO_PRINTF1(_L("Not enough formats supported. Skipping test..."));
+		return;
+		}
+	
+	TInt err = CDirectGdiDriver::Open();
+	TESTNOERRORL(err);
+			
+	CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static();
+	TESTL(dgdiDriver != NULL);	
+	CleanupClosePushL(*dgdiDriver);	
+	
+	CDirectGdiContext* gc = CDirectGdiContext::NewL(*dgdiDriver);	
+	CleanupStack::PushL(gc);
+	
+	RSgImage rsgImage1;	
+	RSgImage rsgImage2;	
+	
+	// Set the bitmap up...
+	TSgImageInfo imageInfo;
+	imageInfo.iSizeInPixels = TSize (320, 240);
+	imageInfo.iPixelFormat = iTargetPixelFormatArray[0];
+	imageInfo.iUsage = ESgUsageDirectGdiTarget;
+	result = rsgImage1.Create(imageInfo, NULL,0);
+	TESTNOERRORL(result);
+	CleanupClosePushL(rsgImage1);
+	
+	imageInfo.iSizeInPixels = TSize (300, 300);
+	imageInfo.iPixelFormat =  iTargetPixelFormatArray[1];
+	result = rsgImage2.Create(imageInfo, NULL,0);
+	TESTNOERRORL(result);
+	CleanupClosePushL(rsgImage2);	
+
+	RDirectGdiImageTarget dgdiImageTarget1(*dgdiDriver);	
+	result = dgdiImageTarget1.Create(rsgImage1);
+	TESTNOERRORL(result);
+	CleanupClosePushL(dgdiImageTarget1);
+
+	result = gc->Activate (dgdiImageTarget1);
+	TESTNOERRORL(result);
+	gc->SetPenColor(TRgb(100,100,100));
+	TEST(gc->PenColor() == TRgb(100,100,100));
+	gc->DrawEllipse(TRect(0,0,30,30));
+	TESTNOERROR(dgdiDriver->GetError());
+
+	RDirectGdiImageTarget dgdiImageTarget2(*dgdiDriver);	
+	result = dgdiImageTarget2.Create(rsgImage1);
+	TESTNOERRORL(result);
+	CleanupClosePushL(dgdiImageTarget2);
+
+	result = gc->Activate (dgdiImageTarget2);
+	TESTNOERRORL(result);
+	gc->SetPenColor(TRgb(0,0,0));
+	TEST(gc->PenColor() == TRgb(0,0,0));	
+	gc->DrawEllipse(TRect(0,0,30,30));
+	TESTNOERROR(dgdiDriver->GetError());		
+
+	CleanupStack::PopAndDestroy(6, dgdiDriver); //dgdiImageTarget1&2, rsgImage1&2, gc, dgdiDriver
+	
+	}
+
+/**
+@SYMTestCaseID		
+	GRAPHICS-DIRECTGDI-CONTEXTTARGET-0002
+
+@SYMTestPriority
+	Critical
+
+@SYMPREQ
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+
+@SYMTestCaseDesc
+	Test the integrity of RSgImage metadata after being written to.
+
+@SYMTestActions		
+	Construct CDirectGdiDriver.
+	Construct CDirectGdiContext.
+	Construct RSgImage.
+	Construct MDirectGdiImageTarget. 
+	Create MDirectGdiImageTarget1, using RSgImage.
+	Check the current RSgImage info matches that at creation time.
+	Activate CDirectGdiContext using MDirectGdiImageTarget.
+	Do some drawing operations on the target.
+	Check the current RSgImage info matches that at creation time.  
+	Destroy RSgImage.
+	Destroy MDirectGdiImageTarget.
+	Destroy CDirectGdiContext.
+	Close CDirectGdiDriver.
+
+@SYMTestExpectedResults
+	The RSgImage info should be the same at all times.
+  
+@SYMTestStatus 		
+	Implemented
+*/
+void CTDirectGdiContextTarget::TestRSgImageMetadataIntegrityL()
+	{
+	_LIT(KTestName, "ContextTarget-RSgImageMetadataIntegrity"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	TInt err = CDirectGdiDriver::Open();
+	TESTNOERRORL(err);			
+	CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static();
+	TESTL(dgdiDriver != NULL);	
+	CleanupClosePushL(*dgdiDriver);	
+	CDirectGdiContext* gc = CDirectGdiContext::NewL(*dgdiDriver);
+	CleanupStack::PushL(gc);
+	
+	// Create RSgImage, initialise some info.
+	RSgImage rsgImage;	
+	TSgImageInfo imageInfo;
+	imageInfo.iSizeInPixels = TSize (320, 240);
+	imageInfo.iPixelFormat = iTestParams.iTargetPixelFormat;
+	imageInfo.iUsage = ESgUsageDirectGdiTarget;
+	TInt result = rsgImage.Create(imageInfo, NULL,0);
+	TESTNOERRORL(result);
+	CleanupClosePushL(rsgImage);
+	
+	// Test that after creation, the info is still the same.
+	TSgImageInfo retrievedInfo;
+	TESTNOERRORL(rsgImage.GetInfo(retrievedInfo));
+	TBool match = CompareInfos(retrievedInfo, imageInfo);
+	TEST(match);
+	
+	// Perform writing to the target.
+	RDirectGdiImageTarget dgdiImageTarget(*dgdiDriver);	
+	TESTNOERRORL(dgdiImageTarget.Create(rsgImage));
+	CleanupClosePushL(dgdiImageTarget);
+	TESTNOERRORL(gc->Activate (dgdiImageTarget) );
+	gc->SetBrushColor(TRgb(255,0,0,255));
+	gc->Clear();
+	dgdiDriver->Finish();
+	
+	// Test that after being written to, the info is still the same. If this fails, 
+	// an indication that image data is being written over the metadata.
+	TESTNOERRORL(rsgImage.GetInfo(retrievedInfo));
+	match = CompareInfos(retrievedInfo, imageInfo);
+	TEST(match);
+	
+	CleanupStack::PopAndDestroy(4); //dgdiImageTarget, rsgImage, gc, dgdiDriver	
+	}
+
+/**
+@SYMTestCaseID		
+	GRAPHICS-DIRECTGDI-CONTEXTTARGET-0003
+
+@SYMTestPriority
+	Critical
+
+@SYMPREQ
+	PREQ39
+
+@SYMREQ
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+
+@SYMTestCaseDesc
+	Test that the RdirectGdiImageTarget::Create() and RDirectGdiDrawableSource::Create() methods 
+	validate their arguments.
+	- Test that creation of a target from an RSgImage that was created as a source fails.
+	- Test that creation of a source from an RSgImage that was created as a target fails.
+
+@SYMTestActions		
+	Construct CDirectGdiDriver.
+	Construct CDirectGdiContext.
+	Create a RSgImage 1 as a source.
+	Create a RSgImage 2 as a target.
+	Attempt to create RDirectGdiImageTarget from RSgImage 1 (a source).
+	KErrNotSupported should be returned.
+	Attempt to create RDirectGdiDrawableSource from RSgImage 2 (a target).
+	KErrNotSupported should be returned.
+
+@SYMTestExpectedResults
+	Functions return the correct error code.
+  
+@SYMTestStatus 		
+	Implemented
+*/
+void CTDirectGdiContextTarget::TestCreateCloseSourceTargetInvalidParametersL()
+	{
+	_LIT(KTestName, "ContextTarget-CreateCloseSourceTargetInvalidParameters"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	TInt err = CDirectGdiDriver::Open();
+	TESTNOERRORL(err);			
+	CDirectGdiDriver* dgdiDriver = CDirectGdiDriver::Static();
+	TESTL(dgdiDriver != NULL);	
+	CleanupClosePushL(*dgdiDriver);	
+	
+	CDirectGdiContext* gc = CDirectGdiContext::NewL(*dgdiDriver);	
+	CleanupStack::PushL(gc);
+	
+	//Create an image with usage set to ESgUsageDirectGdiSource	
+	TSgImageInfo info1;
+	info1.iSizeInPixels = TSize(8, 8);
+	info1.iUsage = ESgUsageDirectGdiSource;
+	info1.iPixelFormat = EUidPixelFormatARGB_8888;
+	info1.iCpuAccess = ESgCpuAccessReadWrite;
+	info1.iShareable = ETrue;	
+	RSgImage image1;
+	TESTNOERRORL(image1.Create(info1, NULL, 0));
+	CleanupClosePushL(image1);	
+	
+	//Create an image with usage set to ESgUsageDirectGdiTarget
+	TSgImageInfo info2;
+	info2.iSizeInPixels = TSize(8, 8);
+	info2.iUsage = ESgUsageDirectGdiTarget;
+	info2.iPixelFormat = EUidPixelFormatRGB_565;
+	info2.iCpuAccess = ESgCpuAccessNone;
+	info2.iShareable = ETrue;
+	RSgImage image2;
+	TESTNOERRORL(image2.Create(info2, NULL, 0));
+	CleanupClosePushL(image2);
+	
+	//create a RDirectGdiImageTarget from an image with 
+	//usage set to ESgUsageDirectGdiSource
+	RDirectGdiImageTarget dgdiImageTarget(*dgdiDriver);	
+	TESTL(KErrNotSupported == dgdiImageTarget.Create(image1));	
+	
+	//create a RDirectGdiDrawableSource from an image with
+	//usage set to ESgUsageDirectGdiTarget	
+	RDirectGdiDrawableSource dgdiImageSource(*dgdiDriver);
+	TESTL(KErrNotSupported == dgdiImageSource.Create(image2));
+	
+	//create a RDirectGdiImageTarget from an image with 
+	//usage set to ESgUsageDirectGdiTarget	
+	//should succeed
+	TESTNOERRORL(dgdiImageTarget.Create(image2));
+	CleanupClosePushL(dgdiImageTarget);
+	
+	// Need to activate a target before we can create a source due to OpenVG limitation.
+	// An OpenVG context must exist before a source can be created, but is not available
+	// until a target is activated.
+	gc->Activate(dgdiImageTarget);	
+
+	//create a RDirectGdiDrawableSource from an image with
+	//usage set to ESgUsageDirectGdiSource	
+	//should succeed
+	TESTNOERRORL(dgdiImageSource.Create(image1));
+	CleanupClosePushL(dgdiImageSource);
+	
+	CleanupStack::PopAndDestroy(6, 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 CTDirectGdiContextTarget::doTestStepL()
+	{
+	if(iUseDirectGdi)
+		{
+		// Test for each pixel format
+		for(TInt targetPixelFormatIndex = iTargetPixelFormatArray.Count() - 1; targetPixelFormatIndex >= 0 ; targetPixelFormatIndex--)
+			{	
+			iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[targetPixelFormatIndex];
+			RunTestsL();
+			RunOomTestsL();			
+			}
+		}
+	else
+		{
+		INFO_PRINTF1(_L("BitGDI has no RSgImage to test!"));
+		}
+	CloseTMSGraphicsStep();
+	return TestStepResult();
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTDirectGdiContextTarget::doTestStepPreambleL()
+	{			
+	CTDirectGdiStepBase::doTestStepPreambleL();	
+	return TestStepResult();
+	}
+
+/**
+Override of base class pure virtual
+Lists the tests to be run
+*/
+void CTDirectGdiContextTarget::RunTestsL()
+	{
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-CONTEXTTARGET-0001"));
+	TestSwitchingTargetsL();	
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-CONTEXTTARGET-0002"));
+	TestRSgImageMetadataIntegrityL();
+	RecordTestResultL();
+	SetTestStepID(_L("GRAPHICS-DIRECTGDI-CONTEXTTARGET-0003"));
+	TestCreateCloseSourceTargetInvalidParametersL();
+	RecordTestResultL();
+	}
+
+/**
+Helper function to test the equivalence of two TSgImageInfo structures.
+
+@see     CTSgTestStepBase::CompareInfos
+@param   info1 A TSgImageInfo structure to compare.
+@param   info2 A TSgImageInfo structure to compare.
+
+@return  ETrue if the two are identical, EFalse otherwise.
+*/
+TBool CTDirectGdiContextTarget::CompareInfos(const TSgImageInfo& info1, const TSgImageInfo& info2)
+	{
+	return info1.iCpuAccess == info2.iCpuAccess 
+			&& info1.iPixelFormat == info2.iPixelFormat
+			&& info1.iScreenId == info2.iScreenId
+			&& info1.iShareable == info2.iShareable
+			&& info1.iSizeInPixels == info2.iSizeInPixels
+			&& info1.iUsage | info2.iUsage
+			&& info1.iUserAttributeCount == info2.iUserAttributeCount;
+	}