graphicstest/uibench/src/tnonredrawdrawing.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/tnonredrawdrawing.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,151 @@
+// 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:
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include "tnonredrawdrawing.h"
+#include <gdi.h>
+#include <hal.h>
+
+
+const TInt KIterationsToTest = 100; // Number of iterations to run tests
+
+
+CTNonRedrawDrawing::CTNonRedrawDrawing()
+	{
+	SetTestStepName(KTNonRedrawDrawing);
+	}
+
+CTNonRedrawDrawing::~CTNonRedrawDrawing()
+	{
+	delete iWindowGc;
+	delete iScreenDevice;
+	iBackgroundWindow.Close();
+	iWinGroup.Close();
+	iWsSession.Close();
+	RFbsSession::Disconnect();
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0075
+@SYMTestType UT
+@SYMTestPriority Critical
+@SYMDEF PDEF102791
+
+@SYMTestCaseDesc
+The test determines how long it takes to do non-redraw drawing on a transparent window
+compared to non-redraw drawing on an opaque window.
+
+@SYMTestActions
+The test creates a background window that takes a relatively long time to render from its
+redraw store by issuing a number of ellipse drawing commands. After that it creates a
+foreground window, opaque then transparent, and does some non-redraw drawing on it for a
+number of iterations.
+
+@SYMTestExpectedResults
+The test should pass and display test time both using an opaque window and a transparent one.
+*/
+void CTNonRedrawDrawing::NonRedrawDrawingL(TTestCase aTestCase)
+	{
+	iProfiler->InitResults();
+	// Create foreground window
+	RWindow foregroundWindow = RWindow(iWsSession);
+	User::LeaveIfError(foregroundWindow.Construct(iWinGroup, 3));
+	CleanupClosePushL(foregroundWindow);
+	if (aTestCase == EUseTransparencyFactor)
+		User::LeaveIfError(foregroundWindow.SetTransparencyFactor(TRgb(0xAA, 0xAA, 0xAA)));
+	foregroundWindow.Activate();
+	for (TInt i = KIterationsToTest; i > 0; --i)
+		{
+		// Initialize its redraw store
+		foregroundWindow.BeginRedraw();
+		iWindowGc->Activate(foregroundWindow);
+		iWindowGc->SetBrushColor(KRgbYellow);
+		iWindowGc->Clear();
+		iWindowGc->Deactivate();
+		foregroundWindow.EndRedraw();
+		iWsSession.Flush();
+		iProfiler->StartTimer();
+		// Now do some non-redraw drawing
+		iWindowGc->Activate(foregroundWindow);
+		iWindowGc->SetBrushColor(KRgbRed);
+		for (TInt x = 0; x < 200; x += 4)
+			iWindowGc->Clear(TRect(x, x, x + 4, x + 4));
+		iWindowGc->Deactivate();
+		iWsSession.Flush();
+		iProfiler->MarkResultSetL();
+		// Empty redraw store to avoid OOM
+		foregroundWindow.Invalidate();
+		}
+	CleanupStack::PopAndDestroy(&foregroundWindow);
+	}
+
+/**
+Override of base class virtual
+
+@return - TVerdict code
+*/
+TVerdict CTNonRedrawDrawing::doTestStepPreambleL()
+	{
+	CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
+	User::LeaveIfError(RFbsSession::Connect());
+	User::LeaveIfError(iWsSession.Connect());
+	iScreenDevice = new(ELeave) CWsScreenDevice(iWsSession);
+	User::LeaveIfError(iScreenDevice->Construct(0)); // screen number (0 is first screen)
+	iWindowGc = new(ELeave) CWindowGc(iScreenDevice);
+	User::LeaveIfError(iWindowGc->Construct());
+	iWinGroup = RWindowGroup(iWsSession);
+	User::LeaveIfError(iWinGroup.Construct(1, EFalse));
+	// Create background window
+	iBackgroundWindow = RWindow(iWsSession);
+	User::LeaveIfError(iBackgroundWindow.Construct(iWinGroup, 2));
+	iBackgroundWindow.SetRequiredDisplayMode(EColor64K);
+	iBackgroundWindow.Activate();
+	// Initialize its redraw store with time-consuming ellipse drawing commands
+	iBackgroundWindow.BeginRedraw();
+	iWindowGc->Activate(iBackgroundWindow);
+	TSize size = iBackgroundWindow.Size();
+	for (TInt x = 0; x < 80; x += 4)
+		{
+		iWindowGc->SetPenColor(TRgb(0, x << 1, 0xFF));
+		iWindowGc->DrawEllipse(TRect(x, x, size.iWidth - x, size.iHeight - x));
+		}
+	iWindowGc->Deactivate();
+	iBackgroundWindow.EndRedraw();
+	iWsSession.Flush();
+	return TestStepResult();
+	}
+
+/**
+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.
+
+@return TVerdict code
+*/
+TVerdict CTNonRedrawDrawing::doTestStepL()
+	{
+	SetTestStepID(_L("GRAPHICS-UI-BENCH-0075"));
+	NonRedrawDrawingL(EUseOpaqueDraw);
+	iProfiler->ResultsAnalysis(_L("Opaque Non-Redraw Drawing"), 0, 0, EColor64K, KIterationsToTest);
+	NonRedrawDrawingL(EUseTransparencyFactor);
+	iProfiler->ResultsAnalysis(_L("Transparent Non-Redraw Drawing"), 0, 0, EColor64K, KIterationsToTest);
+	RecordTestResultL();
+	return TestStepResult();
+	}