graphicstest/uibench/src/talphadrawing.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/talphadrawing.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,540 @@
+// Copyright (c) 2005-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 "talphadrawing.h"
+#include <hal.h>
+
+// When enabled allows testing with a variable windows size rather than fixed size
+#define _TESTWITHVARIABLEWINDOWSIZE
+
+// Test bitmap file location
+_LIT(KAlphaTestBitmap,"z:\\system\\data\\uibench_24bit.mbm");
+
+const TInt KIterationsToTest = 100; 		// Number of iterations to run tests
+const TInt KDelay = 100000; 		// 0.1 seconds
+const TInt KRotationGranulatity = 8;// Rotation array granularity
+
+/**
+Clear window to selected colour
+*/
+LOCAL_C void ClearWindow(RWsSession& aSession, RWindow& aWindow, CWindowGc* aGc, TRgb aColor)
+{
+	// clear so we can see bitmap version has completed
+	aWindow.Invalidate();
+	aWindow.BeginRedraw();
+	aGc->Activate(aWindow);
+	aGc->SetBrushColor(aColor);
+	aGc->Clear();
+	aGc->Deactivate();
+	aWindow.EndRedraw();
+	aSession.Flush();
+}
+
+/**
+Draws a b/w checkerboard onto a RWindow
+*/
+LOCAL_C void ChessBoard(RWsSession& aSession, RWindow& aWindow, CWindowGc* aGc)
+	{
+	const TSize size = aWindow.Size();
+	
+	aGc->Activate(aWindow);
+	aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
+	aGc->SetPenStyle(CGraphicsContext::ENullPen);
+
+	aGc->SetBrushColor(KRgbBlack);
+	aGc->Clear();
+	aGc->SetBrushColor(KRgbWhite);
+	TInt x0 = 0;
+	TPoint point;
+	const TInt checkerSize = 32;
+	for(point.iY=0; point.iY < size.iHeight; point.iY += checkerSize)
+		{
+		for(point.iX=x0; point.iX < size.iWidth; point.iX += checkerSize*2)
+			{
+			TRect rect(point, TSize(checkerSize, checkerSize));
+			aGc->DrawRect(rect);
+			}
+		x0 = checkerSize - x0;
+		}
+	aGc->Deactivate();
+	aSession.Flush();
+	}
+	
+/**
+RBlankWindow on top layer gets set visible/invisible to measure timing of drawing the windows below
+*/
+void CTAlphaDrawing::DrawBlankWindowL (RWindow& /*aForeGndWin*/, TInt aIters)
+	{	
+	// Create a blank window that is the size of the screen so that we can set this visible to hide the window underneath
+	// and then hide it to force redraw of the window underneath
+	RBlankWindow blankWindow = RBlankWindow(iWsSession);
+	CleanupClosePushL(blankWindow);
+	User::LeaveIfError(blankWindow.Construct(iWinGroup, (TInt)this+1));	
+	blankWindow.SetSize(iScreenDevice->SizeInPixels());
+	blankWindow.SetColor(TRgb(0x3399ff));	
+	blankWindow.Activate();
+	
+#ifdef _TESTWITHVARIABLEWINDOWSIZE
+	// Create a small window that moves position
+	RBlankWindow blankWindow2 = RBlankWindow(iWsSession);
+	CleanupClosePushL(blankWindow2);
+	User::LeaveIfError(blankWindow2.Construct(iWinGroup, (TInt)this+2));
+	blankWindow2.SetSize(TSize(10,10));
+	blankWindow2.SetColor(TRgb(0x99ff33));
+	TInt px = iScreenDevice->SizeInPixels().iWidth/2;
+	TInt py = iScreenDevice->SizeInPixels().iHeight/2;
+	blankWindow2.SetPosition(TPoint(px, py));
+	blankWindow2.Activate();
+#endif	
+	
+	TBool onoff=ETrue;
+	
+	iProfiler->InitResults();
+	for(TInt i=aIters; i>=0; i--)
+		{
+		blankWindow.SetVisible(onoff=!onoff);
+				
+#ifdef _TESTWITHVARIABLEWINDOWSIZE
+		blankWindow2.SetSize(TSize(10+i, 10+i));
+		blankWindow2.SetPosition(TPoint(px--, py--));
+		if (px<0) px=150; 
+		if (py<0) py=150;
+#endif
+
+		iWsSession.Flush();
+		iProfiler->MarkResultSetL();
+		}	
+	
+#ifdef _TESTWITHVARIABLEWINDOWSIZE
+	CleanupStack::PopAndDestroy(&blankWindow2);
+#endif
+	CleanupStack::PopAndDestroy(&blankWindow);
+	}
+
+/**
+Helper function to calculate processor cycles per pixel as a characteristic number for rendering speed
+*/
+TInt CTAlphaDrawing::CyclesPerPixel(TInt64 aDuration, TInt aIters, TInt aWidth, TInt aHeight, TInt aCPUSpeed) 
+	{	
+	TInt64 pixs=aWidth*aHeight;
+	TInt64 cpuHz=aCPUSpeed;
+	
+	TInt64 ret=(aDuration*cpuHz)/pixs/1000/aIters;
+	return ret;
+	}
+
+/*
+Helper function that draws a window
+*/
+void CTAlphaDrawing::TestDrawWindowL(TDisplayMode aMode, TInt aIters, TTestCase aTestCase, const TDesC& aTestName)
+	{
+	RWindow foregndWindow = RWindow(iWsSession);
+	User::LeaveIfError(foregndWindow.Construct(iWinGroup, (TInt)this+3));
+	
+	CFbsBitmap * bmpModeDep = CreateSoftwareBitmapLC(iScreenDevice->SizeInPixels(), aMode);
+	CopyBitmapL(bmpModeDep, iSourceImage);
+	
+	foregndWindow.BeginRedraw();
+	iWindowGc->Activate(foregndWindow);
+	iWindowGc->SetBrushStyle(CGraphicsContext::ENullBrush);
+	iWindowGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	iWindowGc->DrawBitmap(iScreenDevice->SizeInPixels(), bmpModeDep, bmpModeDep->SizeInPixels());
+	iWindowGc->Deactivate();
+	foregndWindow.EndRedraw();
+	iWsSession.Flush();
+		
+	switch (aTestCase)
+		{
+		case EUseOpaqueDraw:
+			foregndWindow.SetNonTransparent();	
+			break;
+		case EUseTransparencyFactor:
+			User::LeaveIfError(foregndWindow.SetTransparencyFactor(TRgb(0xbbbbbb,128)));
+			break;
+		}
+		
+	foregndWindow.Activate();
+
+	// Start performance test and analyse results
+	DrawBlankWindowL(foregndWindow, aIters);
+	iProfiler->ResultsAnalysis(aTestName, 0, aMode, 0, aIters);
+
+	foregndWindow.Close();
+	
+	CleanupStack::PopAndDestroy(bmpModeDep);
+	User::After(KDelay);
+	}
+
+/**
+   @SYMTestCaseID
+   GRAPHICS-UI-BENCH-0013
+
+   @SYMTestCaseDesc
+   The test determines how long it takes to draw an opaque (non-transparent) window composition.
+
+   @SYMTestActions
+   Compare the results over time, and before and after changes to wserv code.
+
+   @SYMTestExpectedResults
+   Test should pass and display total test time and cycles per pixel
+*/
+void CTAlphaDrawing::DoTestDrawOpaqueWindowL(TDisplayMode aMode, TInt aIters) 
+	{
+	TestDrawWindowL(aMode, aIters, EUseOpaqueDraw, _L("WinOpaque"));
+	}
+	
+/**
+   @SYMTestCaseID
+   GRAPHICS-UI-BENCH-0014
+
+   @SYMTestCaseDesc
+   The test determines how long it takes to draw transparent window compositions with window SetTransparencyFactor.
+
+   @SYMTestActions
+   Compare the results over time, and before and after changes to wserv code.
+
+   @SYMTestExpectedResults
+   Test should pass and display total test time and cycles per pixel
+*/
+void CTAlphaDrawing::DoTestDrawTransparentWindowFactorL(TDisplayMode aMode, TInt aIters) 
+	{	
+	TestDrawWindowL(aMode, aIters, EUseTransparencyFactor, _L("WinTrFac"));	
+	}
+
+/**
+   @SYMTestCaseID
+   GRAPHICS-UI-BENCH-0015
+
+   @SYMTestCaseDesc
+   The test determines how long it takes to draw transparent window compositions with SetTransparencyBitmap.
+
+   @SYMTestActions
+   Compare the results over time, and before and after changes to wserv code.
+
+   @SYMTestExpectedResults
+   Test should pass and display total test time and cycles per pixel
+*/
+void CTAlphaDrawing::DoTestDrawTransparentWindowBitmapL(TDisplayMode aMode, TInt aIters) 
+	{	
+	RWindow foregndWindow;
+	foregndWindow = RWindow(iWsSession);
+	User::LeaveIfError(foregndWindow.Construct(iWinGroup, (TInt)this+5));
+	
+	CFbsBitmap * sourceAlpha  = CreateSoftwareBitmapLC(iScreenDevice->SizeInPixels(), EGray256);
+	VerticalGradientAlphaL(sourceAlpha, TRgb(0xffffffff), TRgb(0x00000000));
+	
+	CFbsBitmap * bmpModeDep  = CreateSoftwareBitmapLC(iScreenDevice->SizeInPixels(), aMode);
+	CopyBitmapL(bmpModeDep, iSourceImage);
+	
+	foregndWindow.BeginRedraw();
+	iWindowGc->Activate(foregndWindow);
+	iWindowGc->SetBrushStyle(CGraphicsContext::ENullBrush);
+	iWindowGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	iWindowGc->DrawBitmap(iScreenDevice->SizeInPixels(), bmpModeDep, bmpModeDep->SizeInPixels());
+	
+	// Set transparency bitmap for this window
+	User::LeaveIfError(foregndWindow.SetTransparencyBitmap(*sourceAlpha));
+	
+	iWindowGc->Deactivate();
+	foregndWindow.EndRedraw();
+	iWsSession.Flush();
+
+	foregndWindow.Activate();
+	
+	DrawBlankWindowL(foregndWindow,aIters);
+	iProfiler->ResultsAnalysis(_L("WinTrBmp"), 0, aMode, 0, aIters);
+	
+	foregndWindow.Close();
+	
+	CleanupStack::PopAndDestroy(2, sourceAlpha);
+	User::After(KDelay);
+	}
+
+/**
+@SYMTestCaseID GRAPHICS-UI-BENCH-0016
+@SYMTestPriority High
+@SYMREQ 0000
+@SYMTestCaseDesc 
+Test test determines how long it takes to draw transparent window compositions with SetTransparencyAlphaChannel.
+
+@SYMTestActions
+Compare the results over time, and before and after changes to wserv code.
+
+@SYMTestExpectedResults
+Test should pass and display total test time and cycles per pixel
+*/
+void CTAlphaDrawing::DoTestDrawTransparentWindowAlphaChannelL(TDisplayMode aMode, TInt aIters) 
+	{		
+	RWindow foregndWindow;
+	foregndWindow = RWindow(iWsSession);
+	User::LeaveIfError(foregndWindow.Construct(iWinGroup, (TInt)this+6));	
+	
+	CFbsBitmap * sourceAlpha  = CreateSoftwareBitmapLC(iSourceImage->SizeInPixels(), EGray256);
+	VerticalGradientAlphaL(sourceAlpha, TRgb(0xffffffff), TRgb(0x00000000));
+	
+	CFbsBitmap * bmpModeDep  = CreateSoftwareBitmapLC(iScreenDevice->SizeInPixels(), aMode);
+	CopyBitmapL(bmpModeDep, iSourceImage);
+		
+	TPoint point;
+	TRect  rect(iScreenDevice->SizeInPixels());
+			
+	foregndWindow.BeginRedraw();
+	iWindowGc->Activate(foregndWindow);
+	iWindowGc->SetBrushStyle(CGraphicsContext::ENullBrush);
+	iWindowGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+	
+	iWindowGc->DrawBitmapMasked(rect, bmpModeDep, bmpModeDep->SizeInPixels(), sourceAlpha, EFalse);
+	
+	User::LeaveIfError(foregndWindow.SetTransparencyAlphaChannel());
+	
+	iWindowGc->Deactivate();
+	foregndWindow.EndRedraw();
+	iWsSession.Flush();
+
+	foregndWindow.Activate();
+	
+	DrawBlankWindowL(foregndWindow,aIters);
+	iProfiler->ResultsAnalysis(_L("WinTrAlphaCh"), 0, aMode, 0, aIters);
+			
+	foregndWindow.Close();
+	CleanupStack::PopAndDestroy(2, sourceAlpha);			
+	User::After(KDelay);
+	}
+
+/**
+   @SYMTestCaseID
+   GRAPHICS-UI-BENCH-0017
+
+   @SYMTestCaseDesc
+   Creates foreground window with alpha channel transparency.
+   An image with alpha mask is bitblitted to this window.
+   The test determines how long it takes to create a window
+
+   @SYMTestActions
+   Compare the results over time, and before and after changes to wserv code.
+
+   @SYMTestExpectedResults
+   Test should pass and display total test time and cycles per pixel
+*/
+void CTAlphaDrawing::DoTestCreateWindowL(TDisplayMode aMode, TInt aIters) 
+	{
+	RWindow foregndWindow;
+	
+	CFbsBitmap * sourceAlpha  = CreateSoftwareBitmapLC(iSourceImage->SizeInPixels(), EGray256);
+	VerticalGradientAlphaL(sourceAlpha, TRgb(0xffffffff), TRgb(0x00000000));
+		
+	CFbsBitmap * bmpModeDep  = CreateSoftwareBitmapLC(iScreenDevice->SizeInPixels(), aMode);
+	CopyBitmapL(bmpModeDep, iSourceImage);
+	
+	TPoint point;
+	TRect  rect(iScreenDevice->SizeInPixels());
+	iProfiler->InitResults();
+	for(TInt i=KIterationsToTest; i>=0; i--)
+		{
+		foregndWindow = RWindow(iWsSession);
+		User::LeaveIfError(foregndWindow.Construct(iWinGroup, (TInt)this+7));
+		
+		foregndWindow.BeginRedraw();
+		iWindowGc->Activate(foregndWindow);
+		iWindowGc->SetBrushStyle(CGraphicsContext::ENullBrush);
+		iWindowGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
+		iWindowGc->DrawBitmapMasked(rect, bmpModeDep, bmpModeDep->SizeInPixels(), sourceAlpha, EFalse);
+					
+		TInt ret = foregndWindow.SetTransparencyAlphaChannel();
+		if (ret == KErrNotSupported)
+			ERR_PRINTF1(_L("Transparency not enabled - Turn on transparency in wsini.ini file"));			
+		User::LeaveIfError(ret);			
+		
+		iWindowGc->Deactivate();
+		foregndWindow.EndRedraw();
+		iWsSession.Flush();
+
+		foregndWindow.Activate();
+				
+		iWsSession.Flush();
+		iProfiler->MarkResultSetL();
+				
+		foregndWindow.Close();
+		}
+	iProfiler->ResultsAnalysis(_L("WinCreation"), 0, aMode, 0, aIters);
+	CleanupStack::PopAndDestroy(2, sourceAlpha);					
+	User::After(KDelay);
+	}
+
+CTAlphaDrawing::~CTAlphaDrawing()
+	{
+	delete iSourceImage;
+	delete iWindowGc;	
+	delete iScreenDevice;
+	iBackgndWindow.Close();
+	iWinGroup.Close();
+	iWsSession.Close();
+	RFbsSession::Disconnect();
+	}
+	
+CTAlphaDrawing::CTAlphaDrawing()
+	{
+	SetTestStepName(KTAlphaDrawing);
+	}
+
+/**
+Override of base class virtual
+
+@return - TVerdict code
+*/
+TVerdict CTAlphaDrawing::doTestStepPreambleL()
+	{			
+	CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
+	
+	HAL::Get(HALData::ECPUSpeed,iCPUSpeed);
+	
+	User::LeaveIfError(RFbsSession::Connect());
+	User::LeaveIfError(iWsSession.Connect());
+
+	iScreenDevice = new (ELeave) CWsScreenDevice(iWsSession);
+	User::LeaveIfError(iScreenDevice->Construct(0));	// screen number (0 is first screen)
+	
+	iSourceImage  = LoadBitmapL(KAlphaTestBitmap,0);
+	
+	iWindowGc = new (ELeave) CWindowGc(iScreenDevice);
+	User::LeaveIfError(iWindowGc->Construct());
+	
+	TDisplayMode windowMode = iScreenDevice->DisplayMode();
+	
+	iWinGroup  = RWindowGroup(iWsSession);
+	User::LeaveIfError(iWinGroup.Construct(1, EFalse));
+	
+	iBackgndWindow = RWindow(iWsSession);
+	User::LeaveIfError(iBackgndWindow.Construct(iWinGroup, (TInt)this+8));
+	iBackgndWindow.Activate();
+	
+	iBackgndWindow.SetNonTransparent();	
+	iBackgndWindow.Invalidate();
+	
+	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.
+
+Creates background window with black & white checker board. 
+This background windows is used for each test case in this file
+
+@return TVerdict code
+*/	
+TVerdict CTAlphaDrawing::doTestStepL()
+	{	
+	TInt iters = KIterationsToTest;
+	
+	INFO_PRINTF5(_L("TAlphaDrawing - Iterations:%d, CPUSpeed:%d kHz, Width: %d px, Height: %d px"),iters,iCPUSpeed,iScreenDevice->SizeInPixels().iWidth,iScreenDevice->SizeInPixels().iHeight);
+	
+	// tests to execute
+	TBool iniok; TInt inival;
+	iniok = GetIntFromConfig(_L("AlphaDrawingTests"), _L("testCreateWindowAlpha"), inival);
+	TBool testCreateWindowAlpha					= ((iniok==EFalse) || (inival > 0));
+	iniok = GetIntFromConfig(_L("AlphaDrawingTests"), _L("testDrawOpaqueWindow"), inival);	
+	TBool testDrawOpaqueWindow					= ((iniok==EFalse) || (inival > 0));
+	iniok = GetIntFromConfig(_L("AlphaDrawingTests"), _L("testDrawTransparentFactorWindow"), inival);
+	TBool testDrawTransparentFactorWindow			= ((iniok==EFalse) || (inival > 0));
+	iniok = GetIntFromConfig(_L("AlphaDrawingTests"), _L("testDrawTransparentWindowPerPixel"), inival);
+	TBool testDrawTransparentWindowPerPixel			= ((iniok==EFalse) || (inival > 0));
+	iniok = GetIntFromConfig(_L("AlphaDrawingTests"), _L("testDrawTransparentWindowPerPixelAlpha"), inival);
+	TBool testDrawTransparentWindowPerPixelAlpha 	= ((iniok==EFalse) || (inival > 0));
+	
+	const TSize iWindowSize=iBackgndWindow.Size();
+	
+	// Initalise test - clear window and create checker board on background windows
+	ClearWindow(iWsSession, iBackgndWindow, iWindowGc, BLACK_SEMI_TRANSPARENT);
+	ChessBoard(iWsSession, iBackgndWindow, iWindowGc);
+	
+	iWsSession.Flush();
+	
+	TInt screenModesCnt=iScreenDevice->NumScreenModes();
+	CArrayFixFlat<TInt> * rotationList=NULL;
+
+	rotationList = new (ELeave) CArrayFixFlat<TInt>(KRotationGranulatity);
+	CleanupStack::PushL(rotationList);
+	
+	for (TInt scm=0; scm<screenModesCnt; scm++) 
+		{			
+		iScreenDevice->GetRotationsList(scm,rotationList);
+		
+		for (TInt rot = 0; rot < rotationList->Count(); rot++) 
+			{		
+			TPixelsAndRotation	pxrot;
+			pxrot.iPixelSize	=iWindowSize;
+			
+			iRotation=(CFbsBitGc::TGraphicsOrientation)rotationList->At(rot);
+			pxrot.iRotation	=iRotation;
+			
+			iScreenDevice->SetScreenSizeAndRotation(pxrot);
+			
+			for(int m=0; m<1; m++)
+				{
+				// test drawing speed of window creation and destruction
+				if ( testCreateWindowAlpha )
+					{
+					SetTestStepID(_L("GRAPHICS-UI-BENCH-0017"));
+					DoTestCreateWindowL(KValidDisplayModes[m],iters);	
+					RecordTestResultL();
+					}
+					
+				// test drawing speed of an opaque window composition
+				if ( testDrawOpaqueWindow )
+					{	
+					SetTestStepID(_L("GRAPHICS-UI-BENCH-0013"));
+					DoTestDrawOpaqueWindowL(KValidDisplayModes[m],iters);	
+					RecordTestResultL();
+					}
+				
+				// test drawing speed of a transparent window composition with a transparency factor
+				if ( testDrawTransparentFactorWindow )
+					{
+					SetTestStepID(_L("GRAPHICS-UI-BENCH-0014"));
+					DoTestDrawTransparentWindowFactorL(KValidDisplayModes[m],iters);	
+					RecordTestResultL();
+					}
+					
+				// test drawing speed of a transparent window composition with a transparency bitmap
+				if ( testDrawTransparentWindowPerPixel )
+					{
+					SetTestStepID(_L("GRAPHICS-UI-BENCH-0015"));
+					DoTestDrawTransparentWindowBitmapL(KValidDisplayModes[m],iters);	
+					RecordTestResultL();
+					}
+				
+				// test drawing speed of a transparent window composition with alpha channel transparency
+				if ( testDrawTransparentWindowPerPixelAlpha )
+					{
+					SetTestStepID(_L("GRAPHICS-UI-BENCH-0016"));
+					DoTestDrawTransparentWindowAlphaChannelL(KValidDisplayModes[m],iters);	
+					RecordTestResultL();
+					}						
+				} // m...Modes				
+			} // rot ... Rotations			
+		}	
+	CleanupStack::PopAndDestroy(rotationList);
+	TVerdict a = TestStepResult();
+	return TestStepResult();
+	}