graphicstest/uibench/src/tsimpledrawing_directgdi.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/tsimpledrawing_directgdi.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,621 @@
+// Copyright (c) 2008-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 "tsimpledrawing_directgdi.h" 
+
+#include <graphics/directgdidriver.h>
+
+// The number of iterations to perform for each test. All but the line drawing tests
+// will use this figure. Line tests use the figure below as more repetition is needed.
+const TInt KIterationsToTest = 200;
+
+// This value must not be greater than the extents of the pixmap, otherwise
+// line-drawing tests will get clipped and results will be distorted.
+const TInt KLineDrawingIterationsToTest = 750;
+
+// Number of iterations for all text-rendering tests.
+const TInt KTextDrawingIterationsToTest = 2000;
+
+_LIT(KTestBitmap, "z:\\system\\data\\uibench_24bit.mbm");
+
+// The following constants should match those in tsimpledrawing.cpp for a like-for-like 
+// comparison.
+//
+_LIT(KTextPhrase, "abcdefABCDEF0123456789");
+const TInt KTextPhraseLength = KTextPhrase().Length();
+
+CTSimpleDrawingDirectGdi::CTSimpleDrawingDirectGdi()
+	{
+	SetTestStepName(KTSimpleDrawingPerfDirectGdi);
+	}
+	
+CTSimpleDrawingDirectGdi::~CTSimpleDrawingDirectGdi()	
+	{		
+	}
+
+TVerdict CTSimpleDrawingDirectGdi::doTestStepPreambleL()
+	{	
+	CTDirectGdiTestBase::doTestStepPreambleL();
+		
+	iBitmap = new(ELeave) CFbsBitmap;
+	TInt ret = iBitmap->Load(KTestBitmap, 0, EFalse);
+	TESTL(ret == KErrNone);
+	INFO_PRINTF3(_L("Size of bitmap: %d x %d"), iBitmap->SizeInPixels().iWidth, iBitmap->SizeInPixels().iHeight);
+	
+	iScreenRect = TRect(1,1,GetPixmapSizeInPixels().iWidth, GetPixmapSizeInPixels().iHeight);
+
+	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 CTSimpleDrawingDirectGdi::doTestStepL()
+	{
+	// Perform all tests for each display mode.
+	for(TInt dispModeIndex = 0; dispModeIndex < iTargetPixelFormatArray.Count(); ++dispModeIndex)
+		{
+		iDisplayMode = TDisplayModeMapping::MapPixelFormatToDisplayMode(iTargetPixelFormatArray[dispModeIndex]);
+		if(SetTargetPixelFormatL(iDisplayMode))
+			{
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0098"));
+			ClearingL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0099"));
+			LineDrawingL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0103"));
+			VerticalLinesL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0104"));
+			HorizontalLinesL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0101"));
+			CopyRectL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0102"));
+			DrawRectL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0100"));
+			ThickLinesL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0105"));
+			TextDrawingL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0171"));
+			TextDrawingAntiAliasedL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0106"));
+			TextDrawingWithOverheadL();
+			RecordTestResultL();
+			SetTestStepID(_L("GRAPHICS-UI-BENCH-0107"));
+			LargeTextDrawingL();
+			RecordTestResultL();
+			}
+		}
+	
+    CloseTMSGraphicsStep();
+    return TestStepResult();
+	}
+
+TVerdict CTSimpleDrawingDirectGdi::doTestStepPostambleL()
+	{	
+	delete iBitmap;
+	iBitmap = NULL;
+	return CTDirectGdiTestBase::doTestStepPostambleL();
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0098
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measures the performance of Clear().
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+For KIterationsToTest, clear the entire contents of the screen, and Finish().
+Calculate and log the results as a pixel rate.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::ClearingL()
+	{
+	_LIT (KTestName, "DirectGdi Clear Screen");
+	
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+
+	iProfiler->InitResults ();
+	for (TInt count = 0; count < KIterationsToTest; count++)
+		{
+		iContext->Clear (iScreenRect);
+		iDGdiDriver->Finish ();
+		}
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	
+	iProfiler->ResultsAnalysisPixelRate(KTestName, 0, 0, iDisplayMode, KIterationsToTest, iScreenRect.Width()*iScreenRect.Height() );
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0099
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measures the performance of DrawLine().
+Draws a diagonal one pixel line. With each iteration, the left edge of the line is moved down 
+whilst the right edge is moved up, so that varying diagonals are tested.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+For KLineDrawingIterationsToTest, a line is drawn from from the left edge to the right edge of the 
+target. With each iteration, the left edge is moved down and the right edge is moved up to cover 
+varying angles of line. The lines are drawn with a pen size 1,1.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::LineDrawingL()
+	{
+	_LIT(KTestName, "DirectGdi Line Drawing");
+	
+	DoLineDrawingL(KTestName(), TSize(1,1));
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0100
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measures the performance of DrawLine().
+Draws a diagonal thick line. With each iteration, the left edge is moved down and the right edge is
+moved up so that varying angles are tested.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+For KLineDrawingIterationsToTest, a line is drawn from from the left edge to the right edge of the 
+target. With each iteration, the left edge is moved down and the right edge is moved up to cover 
+varying angles of line. The lines are drawn with a pen size 10,10.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::ThickLinesL()
+	{
+	_LIT(KTestName, "DirectGdi Draw Thick Lines");
+	
+	DoLineDrawingL(KTestName(), TSize(10,10));
+
+	// Reset the pensize.
+	iContext->SetPenSize(TSize(1, 1));	
+	}
+
+/**
+Helper method. Used by diagonal line drawing tests.
+@param aName The test name.
+@param aPenSize The pen size.
+*/
+void CTSimpleDrawingDirectGdi::DoLineDrawingL(TPtrC aName, const TSize& aPenSize)
+	{
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+	
+	TRect rect(iScreenRect);
+	iContext->SetPenSize(aPenSize);	
+	iProfiler->InitResults();
+	for (TInt count = KLineDrawingIterationsToTest; count > 0 ; --count)
+		{
+		iContext->DrawLine(rect.iTl, rect.iBr);
+		++rect.iTl.iY;
+		--rect.iBr.iY;
+		}		
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	WriteTargetOutput(aName);
+	
+	iProfiler->ResultsAnalysisPixelRate(aName, 0, 0, iDisplayMode, KLineDrawingIterationsToTest, rect.Width()*aPenSize.iHeight);
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0101
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measure the performance of CopyRect(), by copying a rectangle from one part of the screen to another.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+For KIterationsToTest, the entire screen contents to a location 2 pixels away in X/Y.
+Call Finish() to force the drawing to complete, before logging the time.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::CopyRectL()
+	{	
+	_LIT(KTestName, "DirectGdi CopyRect");
+	
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+		
+	iProfiler->InitResults();
+	for (TInt count = 0; count < KIterationsToTest; count++)
+		{	
+		iContext->CopyRect(TPoint(2,2), iScreenRect);
+		}												
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	WriteTargetOutput(KTestName());
+	
+	iProfiler->ResultsAnalysisPixelRate(KTestName, 0, 0, iDisplayMode, KIterationsToTest, iScreenRect.Width()*iScreenRect.Height());		
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0102
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measure the performance of DrawRect(), with a patterned fill.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+Set bitmap as brush and draw rectangle using this brush for KIterationsToTest.
+Call Finish() to force the drawing to complete, before logging the time.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::DrawRectL()
+	{			
+	_LIT(KTestName, "DirectGdi DrawRect");
+	TEST(iBitmap->Handle() != 0);
+	
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+	
+	iContext->SetBrushPattern(*iBitmap);
+	iContext->SetBrushStyle(DirectGdi::EPatternedBrush);	
+	iProfiler->InitResults();
+	for (TInt count = 0; count < KIterationsToTest; count++)
+		{
+			iContext->DrawRect(iScreenRect);
+		}		
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	WriteTargetOutput(KTestName());
+	
+	iProfiler->ResultsAnalysisPixelRate(KTestName, 0, 0, iDisplayMode, KIterationsToTest, iScreenRect.Width() * iScreenRect.Height());
+	iContext->SetBrushStyle(DirectGdi::ENullBrush);			
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0103
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measures the performance of DrawLine(), drawing vertical lines.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+For KLineDrawingIterationsToTest, draw a vertical line from the far left of the target to the right.
+Call Finish() to force the drawing to complete, before logging the time.
+The pen size is 1,1.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::VerticalLinesL()
+	{
+	_LIT(KTestName, "DirectGdi Vertical Lines");
+	
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+	
+	iContext->SetPenSize(TSize(1, 1));	
+	iProfiler->InitResults();
+	for (TInt count = 0; count < KLineDrawingIterationsToTest; ++count)
+		{
+		iContext->DrawLine(TPoint(iScreenRect.iTl.iX+count, iScreenRect.iTl.iY), TPoint(iScreenRect.iTl.iX+count, iScreenRect.iBr.iY));
+		}		
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	WriteTargetOutput(KTestName());
+	
+	iProfiler->ResultsAnalysisPixelRate(KTestName, 0, 0, iDisplayMode, KLineDrawingIterationsToTest, iScreenRect.Height());
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0104
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measures the performance of DrawLine(), drawing horizontal lines.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+For KLineDrawingIterationsToTest, draw a horizontal line from the top of the target to the bottom.
+Call Finish() to force the drawing to complete, before logging the time. The pen size is 1,1.
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::HorizontalLinesL()
+	{
+	_LIT(KTestName, "DirectGdi Horizontal Lines");	
+	
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+	
+	iContext->SetPenSize(TSize(1, 1));
+	iProfiler->InitResults();
+	for (TInt count = 0; count < KLineDrawingIterationsToTest; ++count)
+		{
+		iContext->DrawLine(TPoint(iScreenRect.iTl.iX, iScreenRect.iTl.iY+count), TPoint(iScreenRect.iBr.iX, iScreenRect.iTl.iY+count));
+		}		
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	WriteTargetOutput(KTestName());
+	
+	iProfiler->ResultsAnalysisPixelRate(KTestName, 0, 0, iDisplayMode, KLineDrawingIterationsToTest, iScreenRect.Width());	
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0105
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measure the performance of DrawText() when rendering monochrome text.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+Set the font.
+Call DrawText() once to force the glyphs into the cache.
+For KTextDrawingIterationsToTest, draw the same string of text.
+Call Finish() to force the drawing to complete, before logging the time. 
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::TextDrawingL()
+	{
+	_LIT(KTestName, "DirectGdi Text Drawing");
+	// Erase the target
+	iContext->Clear();
+	iContext->SetFont(iFont);
+	iDGdiDriver->Finish();
+	
+	// Draw the text once so that we aren't timing the time to load it into the cache.
+	iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+		
+	iProfiler->InitResults();
+	for(TInt count = KTextDrawingIterationsToTest; count > 0; --count)
+		{
+		iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+		}
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	iProfiler->ResultsAnalysisCharacterRate(KTestName, 0, 0, iDisplayMode, KTextDrawingIterationsToTest, KTextPhraseLength);
+	
+	WriteTargetOutput(KTestName());
+	iContext->ResetFont();	
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0171
+
+@SYMDEF 135375
+
+@SYMTestCaseDesc
+Measure the performance of DrawText() when rendering anti-aliased text.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+Set the font.
+Call DrawText() once to force the glyphs into the cache.
+For KTextDrawingIterationsToTest, draw the same string of text.
+Call Finish() to force the drawing to complete, before logging the time. 
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::TextDrawingAntiAliasedL()
+	{
+	_LIT(KTestName, "DirectGdi Text Drawing Antialiased");
+	// Erase the target
+	iContext->Clear();
+	CFont* font = NULL;
+	TFontSpec fs(KFontTypeface, KFontSize);	
+	fs.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap);
+	TESTL(iTs->GetNearestFontToDesignHeightInPixels(font, fs) == KErrNone);
+	iContext->SetFont(font);
+	iDGdiDriver->Finish();
+	
+	// Draw the text once so that we aren't timing the time to load it into the cache.
+	iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+	
+	iProfiler->InitResults();
+	for(TInt count = KTextDrawingIterationsToTest; count > 0; --count)
+		{
+		iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+		}
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	iProfiler->ResultsAnalysisCharacterRate(KTestName, 0, 0, iDisplayMode, KTextDrawingIterationsToTest, KTextPhrase().Length());
+	
+	WriteTargetOutput(KTestName());
+	iContext->ResetFont();	
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0106
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measure the performance of DrawText(), with other overhead.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+Set the font.
+Call DrawText() once to force the glyphs into the cache.
+For KTextDrawingIterationsToTest, calculate the text width in pixels, the ascent in pixels, and finally draw the text.
+Call Finish() to force the drawing to complete, before logging the time. 
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::TextDrawingWithOverheadL()
+	{
+	_LIT(KTestName, "DirectGdi Text Drawing With Overhead");
+	// Erase the target
+	iContext->Clear();
+	iContext->SetFont(iFont);
+	iDGdiDriver->Finish();
+	
+	// Draw the text once so that we aren't timing the time to load it into the cache.
+	iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+	
+	iProfiler->InitResults();
+	for(TInt count = KTextDrawingIterationsToTest; count > 0; --count)
+		{
+		(void)iFont->TextWidthInPixels(KTextPhrase); //do nothing with this, just need the overhead
+		(void)iFont->AscentInPixels(); //more typical overhead in a drawtext operation
+		iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+		}
+	iDGdiDriver->Finish();
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	iProfiler->ResultsAnalysisCharacterRate(KTestName, 0, 0, iDisplayMode, KTextDrawingIterationsToTest, KTextPhraseLength);
+	
+	WriteTargetOutput(KTestName());
+	iContext->ResetFont();	
+	}
+
+/**
+@SYMTestCaseID
+GRAPHICS-UI-BENCH-0107
+
+@SYMPREQ PREQ39
+
+@SYMREQ REQ9236 
+@SYMREQ REQ9237
+
+@SYMTestCaseDesc
+Measure the performance of DrawText() when using a large font.
+
+@SYMTestActions
+Clear the target, call Finish() so that when the timer begins all outstanding drawing has finished.
+Set the large font.
+For KTextDrawingIterationsToTest, draw the same string of text.
+Call Finish() to force the drawing to complete, before logging the time. 
+
+@SYMTestExpectedResults
+The performance to be logged as a pixel rate.
+*/
+void CTSimpleDrawingDirectGdi::LargeTextDrawingL()
+	{
+	_LIT(KTestName, "DirectGdi Large Text Drawing");
+	// Erase the target
+	iContext->Clear();
+	iDGdiDriver->Finish();
+	iContext->SetFont(iLargeFont);	
+	// Draw the text once so that we aren't timing the time to load it into the cache.
+	iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+	
+	iProfiler->InitResults();
+	for(TInt count=0;count<KTextDrawingIterationsToTest;count++)
+		{
+		iContext->DrawText(KTextPhrase,NULL,TPoint(10,100));
+		}
+	iDGdiDriver->Finish();	
+	iProfiler->MarkResultSetL();
+	TEST(iDGdiDriver->GetError() == KErrNone);
+	
+	iProfiler->ResultsAnalysisCharacterRate(KTestName, 0, 0, iDisplayMode, KTextDrawingIterationsToTest, KTextPhraseLength);
+	WriteTargetOutput(KTestName());
+	iContext->ResetFont();	
+	}