graphicsdeviceinterface/directgdi/test/tdrawbitmap.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tdrawbitmap.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,534 @@
+// 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 "tdrawbitmap.h"
+
+CTDrawBitmap::CTDrawBitmap()
+	{
+	SetTestStepName(KTDirectGdiDrawBitmapStep);
+	}
+
+CTDrawBitmap::~CTDrawBitmap()
+	{
+	}
+
+/**
+Override of base class pure virtual
+Lists the tests to be run
+*/
+void CTDrawBitmap::RunTestsL()
+	{
+	if (iUseDirectGdi && !iUseSwDirectGdi)
+		{
+		// In the event that a test leaves after a BitBlt() or DrawBitmap() has occurred
+		// the vgimage cache will need to be reset.
+		// This needs to be the first item on the cleanupstack, 
+		// as some tests perform pushes and pops of bitmaps.
+		CleanupStack::PushL(TCleanupItem(ResetCache, iVgImageCache));
+		}
+	if(!iLargeTarget)
+		{
+		iTestParams.iDoCompressed = ETrue;
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0001"));
+		TestBasicL();
+		RecordTestResultL();
+		iTestParams.iDoCompressed = EFalse;
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0003"));
+		TestInvalidParametersL();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0005"));
+		TestSourceBitmapCloningL();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0006"));
+		TestDrawModeL();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0007"));
+		TestSetOriginL();
+		RecordTestResultL();
+		}
+	else
+		{
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0002"));
+		TestPositioningL();
+		RecordTestResultL();
+		SetTestStepID(_L("GRAPHICS-DIRECTGDI-DRAWBITMAP-0004"));
+		TestScalingL();
+		RecordTestResultL();
+		}
+	if (iUseDirectGdi && !iUseSwDirectGdi)
+		{
+		CleanupStack::PopAndDestroy(iVgImageCache);
+		}
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0001
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Bitmap drawing basic functionality test.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	
+@SYMTestActions 	
+	Test bitmap drawing for simple and valid parameters:
+		- Set the origin at TPoint(-35,80)
+		- Draw a stretched bitmap at TPoint(55,-60)
+	
+@SYMTestExpectedResults 
+	Source bitmap should be copied into drawing target.
+	Valid bitmap should be created. This bitmap shall be compared
+	to a reference bitmap.
+*/
+void CTDrawBitmap::TestBasicL()
+	{	
+	_LIT(KTestName, "DrawBitmap-Basic"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	CFbsBitmap* bitmap;
+	if(iTestParams.iDoCompressed)
+		{
+		bitmap = iCompressedBitmap;
+		}
+	else
+		{
+		bitmap = iCheckedBoardBitmap2;
+		}
+		
+	iGc->DrawBitmap(TRect(TPoint(20, 20), bitmap->SizeInPixels()), *bitmap, TRect(10, 10, 130, 130));
+	TESTNOERRORL(iGc->GetError());
+
+	if(!iTestParams.iDoCompressed)
+		WriteTargetOutput(KTestName());
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0002
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test regularity of bitmap positioning.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	
+@SYMTestActions 	
+	Test positioning functionality of DrawBitmap() methods. Test boundary
+ 	conditions and clipping to surface area.
+ 	Covers the whole target bitmap starting from TPoint(-30,-30) with staggered blits of a small 8x8 bitmap.
+ 	
+@SYMTestExpectedResults 	
+	Source bitmap should be drawn tiled in a staggered fashion across the whole target. Clipping should be applied.
+	Valid bitmap should be created. This bitmap shall be compared to a reference bitmap.
+*/
+void CTDrawBitmap::TestPositioningL()
+	{	
+	_LIT(KTestName, "DrawBitmap-Positioning"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	iTestParams.iDoCompressed = ETrue;
+	TestPositioningBaseL(KTestName(), EDrawBitmap);
+	iTestParams.iDoCompressed = EFalse;
+	TestPositioningBaseL(KTestName(), EDrawBitmap);
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0003
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test functions behaviour after calling with invalid parameters.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	
+@SYMTestActions 	
+	Set valid parameters (see DrawBitmap-BasicL). Replace individual parameters
+	with Invalid ones:
+		Invalid source rectangles
+			aSourceRect : negative source rectangle starting point or size
+				TRect( TPoint( -30, -30), TSize(-10, -10) ) 
+			aSourceRect : source rectangle not compatible with bitmap
+				TRect( TSize(aBitmap->SizeInPixel(). iWidth + 10, aBitmap->SizeInPixel(). IHeight + 10)) 
+			aSourceRect : swapped points in source rectangle
+				TRect( TPoint( 100, 100 ) , TPoint( 0, 0 ) )
+		Invalid destination rectangle (aDestRect):
+		 	negative size 
+		Invalid source bitmap
+			zero size bitmap
+			not initialized bitmap
+			
+@SYMTestExpectedResults 
+	Function should detect invalid parameters and return.
+ 	Nothing will be drawn on the target surface.
+*/
+void CTDrawBitmap::TestInvalidParametersL()
+	{	
+	_LIT(KTestName, "DrawBitmap-InvalidParameters"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	TestInvalidParametersBaseL(KTestName(), EDrawBitmap);
+	}
+
+/**
+@SYMTestCaseID 
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0004
+
+@SYMPREQ 
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195 
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+
+@SYMTestCaseDesc
+	Test regularity of bitmap scaling.
+
+@SYMTestPriority
+	Critical
+
+@SYMTestStatus 
+	Implemented
+
+@SYMTestActions 
+	Test scaling implementation of DrawBitmap() methods :  scaling down of a normal
+	bitmap and scaling up of a bitmap fragment.
+
+@SYMTestExpectedResults 
+	Scaled bitmap should be drawn in a target area. Valid bitmap should be created.
+ 	The bitmap should be properly scaled. This bitmap shall be compared to a reference
+ 	bitmap.
+*/
+void CTDrawBitmap::TestScalingL()
+	{
+	_LIT(KTestName, "DrawBitmap-Scaling"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+
+	TInt width = iGdiTarget->SizeInPixels().iWidth;
+	TInt height = iGdiTarget->SizeInPixels().iHeight;
+
+	CFbsBitmap* bitmap1 = iCheckedBoardBitmap1;
+	TInt bmp1Width = bitmap1->SizeInPixels().iWidth;
+	TInt bmp1Height = bitmap1->SizeInPixels().iHeight;
+	CFbsBitmap* bitmap2 = iCheckedBoardBitmap2;
+	TInt bmp2Width = bitmap2->SizeInPixels().iWidth;
+	TInt bmp2Height = bitmap2->SizeInPixels().iHeight;
+
+	ResetGc();
+
+	// small bitmap - extrem magnification
+	TReal32 scale = 1.0f;
+	TReal32 scaleFactor = 1.55f;
+	TInt posX = 1;
+	for(TInt j=0; j<6; j++)
+		{
+		TSize size(static_cast<TInt>(bmp1Width*scale), static_cast<TInt>(bmp1Height*scale));
+		TPoint pos(posX, height/4-size.iHeight/2);
+
+		iGc->DrawBitmap(TRect(pos, size), *bitmap1);
+
+		posX += size.iWidth+2;
+		scale *= scaleFactor;
+		}
+
+	// large bitmap - extreme minification
+
+	scale /= scaleFactor;
+	posX = 1;
+	for(TInt j=5; j>=0; j--)
+		{
+		TSize size(static_cast<TInt>(bmp1Width*scale), static_cast<TInt>(bmp1Height*scale));
+		TPoint pos(posX, 3*height/4-size.iHeight/2);
+
+		iGc->DrawBitmap(TRect(pos, size), *bitmap2);
+
+		posX += size.iWidth+2;
+		scale /= scaleFactor;
+		}
+
+	TESTNOERRORL(iGc->GetError());
+
+	TBuf<30> testName;
+	testName.Append(KTestName);
+	WriteTargetOutput(testName);
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0005
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Tests that a bitmap is still drawn successfully if it is deleted 
+	right after the call to DrawBitmap() but before Finish() is called.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	
+@SYMTestActions 	
+	For each method:
+	1. Call method with valid parameters (see DrawBitmap-Basic). 
+	2. Right after returning from method call, destroy the source bitmap.
+	3. Call the method again with the same bitmap parameter.
+	Repeat  p. 1-3 a few times.
+	
+@SYMTestExpectedResults 
+	Source bitmap should be copied into target area. Memory leaks should not be
+	created. Valid bitmap should be created. This bitmap should be the same as
+	a reference bitmap.
+*/
+void CTDrawBitmap::TestSourceBitmapCloningL()
+	{
+	_LIT(KTestName, "DrawBitmap-SourceBitmapCloning"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	iTestParams.iDoCompressed = ETrue;
+	TestSourceBitmapCloningBaseL(KTestName(), EDrawBitmap);
+	iTestParams.iDoCompressed = EFalse;
+	TestSourceBitmapCloningBaseL(KTestName(), EDrawBitmap);
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0006
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test correctness of drawing bitmaps in all possible draw modes.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	
+@SYMTestActions 	
+	Set valid parameters (see DrawBitmap-Basic).	
+	Use the semi-transparent source bitmap (aBitmap).
+	Set drawmode to EDrawModeWriteAlpha and call the methods.
+	Set drawmode to EDrawModePEN and call the methods.
+	Set drawmode to EDrawModeWriteAlpha and call the methods.
+	
+@SYMTestExpectedResults 
+	The image drawn in the center of the test should be drawn blended (EDrawModePEN) 
+	and the images drawn at the left and right sides should be drawn opaque (EDrawModeWriteAlpha).
+	should be copied into rendering target. Valid bitmap should be created.
+	This bitmap should be the same as a reference bitmap.
+*/
+void CTDrawBitmap::TestDrawModeL()
+	{
+	_LIT(KTestName, "DrawBitmap-DrawMode"); 
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	TSize bmpSize(iCheckedBoardWithAlphaBitmap->SizeInPixels());
+
+	TInt halfHeight = (bmpSize.iHeight  >> 1);	
+	TInt quaterWidth  = (bmpSize.iWidth  >> 2);
+	TInt y1 = halfHeight - (bmpSize.iHeight >> 2);
+	
+	TSize vertRectSize  (quaterWidth, bmpSize.iHeight);
+	TSize horizRectSize (bmpSize.iWidth, halfHeight);
+	
+	// Render column to left
+	iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+	iGc->DrawBitmap(
+		TRect (TPoint(0, 0), vertRectSize),
+		*iCheckedBoardWithAlphaBitmap);
+
+	// Render row in center
+	iGc->SetDrawMode(DirectGdi::EDrawModePEN);
+	iGc->DrawBitmap(
+		TRect(TPoint(0, y1), horizRectSize),
+		*iCheckedBoardWithAlphaBitmap);
+
+	// Render column to right
+	iGc->SetDrawMode(DirectGdi::EDrawModeWriteAlpha);
+	iGc->DrawBitmap(
+		TRect (TPoint(bmpSize.iWidth - quaterWidth, 0), vertRectSize),
+		*iCheckedBoardWithAlphaBitmap);
+	
+	TESTNOERRORL(iGc->GetError());
+
+	WriteTargetOutput(KTestName());
+	}
+
+/**
+@SYMTestCaseID  	
+	GRAPHICS-DIRECTGDI-DRAWBITMAP-0007
+	
+@SYMPREQ 			
+	PREQ39
+
+@SYMREQ
+	REQ9199 
+	REQ9204 
+	REQ9195
+	REQ9201 
+	REQ9202 
+	REQ9222 
+	REQ9223 
+	REQ9236 
+	REQ9237
+	
+@SYMTestCaseDesc	
+	Test that a bitmap is drawn at the correct position when SetOrigin() is called before
+	the bitmap is drawn.
+	
+@SYMTestPriority	
+	Critical
+	
+@SYMTestStatus 		
+	Implemented
+	
+@SYMTestActions 	
+	Call SetOrigin().
+	Call DrawBitmap().
+	
+@SYMTestExpectedResults 
+	Source bitmap should be drawn at the correct position (TPoint(20,20)). Valid bitmap 
+	should be created. This bitmap shall be compared to a reference bitmap.
+*/
+void CTDrawBitmap::TestSetOriginL()
+	{	
+	_LIT(KTestName, "DrawBitmap-SetOrigin");
+	
+	// Only do test for one pixel format to cut down on the number of images produced
+	// as this is just a positional test and we don't need to test for all pixel formats.
+	if (!((iTestParams.iTargetPixelFormat == EUidPixelFormatRGB_565) && (iTestParams.iSourcePixelFormat == EUidPixelFormatRGB_565)))
+		{
+		return;
+		}
+	
+	if(!iRunningOomTests)
+		{
+		INFO_PRINTF1(KTestName);
+		}
+	
+	ResetGc();
+
+	CFbsBitmap* bitmap = iCheckedBoardBitmap2;	
+	iGc->SetOrigin(TPoint(-35, 80));
+	iGc->DrawBitmap(TRect(TPoint(55, -60), bitmap->SizeInPixels()), *bitmap, TRect(10, 10, 130, 130));
+	TESTNOERRORL(iGc->GetError());
+	
+	WriteTargetOutput(KTestName());
+	}