--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tdirectgdioom.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,260 @@
+// 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 "tdirectgdioom.h"
+#include <graphics/directgdicontext.h>
+
+CTDirectGdiOom::CTDirectGdiOom()
+ {
+ SetTestStepName(KTDirectGdiOom);
+ }
+
+CTDirectGdiOom::~CTDirectGdiOom()
+ {
+ }
+
+/**
+@SYMTestCaseID
+ GRAPHICS-DIRECTGDI-OOM-0001
+
+@SYMTestPriority
+ Medium
+
+@SYMPREQ
+ PREQ39
+
+@SYMREQ
+ REQ9195
+ REQ9201
+ REQ9202
+ REQ9222
+ REQ9223
+ REQ9236
+ REQ9237
+
+@SYMTestCaseDesc
+ Draw a line with many points to increase coverage of path drawing in OOM conditions.
+
+@SYMTestActions
+ Create an array of 1000 points.
+ Draw it as a line.
+
+@SYMTestExpectedResults
+ No image is produced by this test, it is purely for checking that no OOM errors occur.
+*/
+void CTDirectGdiOom::TestDrawLargePolyLineL()
+ {
+ _LIT(KTestName, "OOM_TestDrawLargePolyLine");
+ 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);
+ TESTL(gc != NULL);
+ CleanupStack::PushL(gc);
+
+ // Set the bitmap up...
+ RSgImage rsgImage;
+ TSgImageInfo imageInfo;
+ imageInfo.iSizeInPixels = TSize (320, 240);
+ imageInfo.iPixelFormat = iTestParams.iTargetPixelFormat;
+ imageInfo.iUsage = ESgUsageDirectGdiTarget;
+ err = rsgImage.Create(imageInfo, NULL,0);
+ TESTNOERRORL(err);
+ CleanupClosePushL(rsgImage);
+
+ RDirectGdiImageTarget dgdiImageTarget(*dgdiDriver);
+ err = dgdiImageTarget.Create(rsgImage);
+ TESTNOERRORL(err);
+ CleanupClosePushL(dgdiImageTarget);
+
+ err = gc->Activate(dgdiImageTarget);
+ TESTNOERRORL(err);
+
+ // Draw a polygon that had lots of points to attempt to make the AppendPathCommand
+ // methods in vgengine fail
+ const TInt pCount = 1000;
+ CArrayFixFlat<TPoint>* points = new (ELeave)CArrayFixFlat<TPoint>(pCount);
+ TESTL(points != NULL);
+ CleanupStack::PushL(points);
+
+ for(TInt i = pCount; i > 0; --i)
+ {
+ points->AppendL(TPoint(i, i));
+ }
+
+ gc->DrawPolyLine(points->Array());
+ TESTNOERRORL(dgdiDriver->GetError());
+
+ CleanupStack::PopAndDestroy(5, dgdiDriver);
+
+ FreeSgImagePixelFormatCache();
+ }
+
+/**
+@SYMTestCaseID
+ GRAPHICS-DIRECTGDI-OOM-0002
+
+@SYMTestPriority
+ Medium
+
+@SYMPREQ
+ PREQ39
+
+@SYMREQ
+ REQ9195
+ REQ9201
+ REQ9202
+ REQ9222
+ REQ9223
+ REQ9236
+ REQ9237
+
+@SYMTestCaseDesc
+ Set the pen size in OOM conditions.
+
+@SYMTestActions
+ Create a graphics context.
+ Call SetPenSize().
+
+@SYMTestExpectedResults
+ No memory leak should occur.
+*/
+void CTDirectGdiOom::TestSetPenSizeL()
+ {
+ _LIT(KTestName, "OOM_TestSetPenSize");
+ 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);
+ TESTL(gc != NULL);
+ CleanupStack::PushL(gc);
+
+ // Set the bitmap up...
+ RSgImage rsgImage;
+ TSgImageInfo imageInfo;
+ imageInfo.iSizeInPixels = TSize (320, 240);
+ imageInfo.iPixelFormat = iTestParams.iTargetPixelFormat;
+ imageInfo.iUsage = ESgUsageDirectGdiTarget;
+ err = rsgImage.Create(imageInfo, NULL,0);
+ TESTNOERRORL(err);
+ CleanupClosePushL(rsgImage);
+
+ RDirectGdiImageTarget dgdiImageTarget(*dgdiDriver);
+ err = dgdiImageTarget.Create(rsgImage);
+ TESTNOERRORL(err);
+ CleanupClosePushL(dgdiImageTarget);
+
+ err = gc->Activate(dgdiImageTarget);
+ TESTNOERRORL(err);
+
+ TRect rect(0, 0, 200, 1000);
+ TSize csize(300, 300);
+
+ for(TInt i = 0; i < 10; i++)
+ {
+ gc->SetPenSize(TSize(i,i));
+ gc->SetPenStyle(DirectGdi::ENullPen);
+ gc->SetBrushStyle(DirectGdi::ESolidBrush);
+ gc->DrawRoundRect(rect, csize);
+ gc->SetPenStyle(DirectGdi::ESolidPen);
+ gc->DrawRoundRect(rect, csize);
+ TESTNOERRORL(dgdiDriver->GetError());
+ }
+
+ CleanupStack::PopAndDestroy(4, dgdiDriver);
+
+ FreeSgImagePixelFormatCache();
+ }
+
+/**
+Helper function to force SgImage's internal cache of pixel formats to be emptied,
+by asking it to lookup a configuration that will always return 0.
+*/
+void CTDirectGdiOom::FreeSgImagePixelFormatCache()
+ {
+ // This will force the SgImage's cached array of pixel formats to be freed.
+ TInt count;
+ TSgImageInfo info;
+ info.iSizeInPixels = TSize(10, 10);
+ info.iUsage = ESgUsageDirectGdiSource;
+ info.iShareable = EFalse;
+ info.iCpuAccess = ESgCpuAccessReadWrite;
+ info.iScreenId = 100;
+ TEST(KErrNone == RSgImage::GetPixelFormats(info, NULL, count));
+ TEST(count == 0);
+ }
+
+/**
+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 CTDirectGdiOom::doTestStepL()
+ {
+ if (iUseDirectGdi)
+ {
+ // Just test for one pixel format to speed up testing
+ iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[0];
+ RunOomTestsL();
+ }
+ SetOverallTestStepID(_L("GRAPHICS-DIRECTGDI-OOM-0001"));
+ RecordTestResultL();
+ SetOverallTestStepID(_L("GRAPHICS-DIRECTGDI-OOM-0002"));
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTDirectGdiOom::doTestStepPreambleL()
+ {
+ CTDirectGdiStepBase::doTestStepPreambleL();
+ return TestStepResult();
+ }
+
+/**
+Override of base class pure virtual
+Lists the tests to be run
+*/
+void CTDirectGdiOom::RunTestsL()
+ {
+ TestDrawLargePolyLineL();
+ TestSetPenSizeL();
+ }
+