author | Gareth Stockwell <gareth.stockwell@accenture.com> |
Fri, 22 Oct 2010 11:38:29 +0100 | |
branch | bug235_bringup_0 |
changeset 206 | c170e304623f |
parent 0 | 5d03bc08d59c |
permissions | -rw-r--r-- |
// 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; }