graphicsdeviceinterface/directgdi/test/tbitbltbase.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tbitbltbase.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,372 @@
+// 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 "tbitbltbase.h"
+
+
+CTBitBltBase::CTBitBltBase()
+	{
+	
+	}
+
+CTBitBltBase::~CTBitBltBase()
+	{
+	}
+
+/** 
+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 CTBitBltBase::doTestStepL()
+	{
+	// Test for each target pixel format
+	for(TInt targetPixelFormatIndex = iTargetPixelFormatArray.Count() - 1; targetPixelFormatIndex >= 0 ; targetPixelFormatIndex--)
+		{
+		iTestParams.iTargetPixelFormat = iTargetPixelFormatArray[targetPixelFormatIndex];
+		TBuf<KPixelFormatNameLength> targetPixelFormatName(TDisplayModeMapping::ConvertPixelFormatToPixelFormatString(iTestParams.iTargetPixelFormat));
+
+		// Test for each source pixel format
+		for(TInt sourcePixelFormatIndex = iSourcePixelFormatArray.Count() - 1; sourcePixelFormatIndex >= 0; sourcePixelFormatIndex--)
+			{
+			TBool isEColor256 = EFalse;
+			iTestParams.iSourcePixelFormat = iSourcePixelFormatArray[sourcePixelFormatIndex];
+			if(EUidPixelFormatP_8 == iTestParams.iSourcePixelFormat)
+				isEColor256 = ETrue;
+			TBuf<KPixelFormatNameLength> sourcePixelFormatName(TDisplayModeMapping::ConvertPixelFormatToPixelFormatString(iTestParams.iSourcePixelFormat));
+
+			INFO_PRINTF3(_L("Target Pixel Format: %S;  Source Pixel Format: %S"), &targetPixelFormatName, &sourcePixelFormatName);
+
+			// small target
+			SetTargetL(iTestParams.iTargetPixelFormat, EOneContextOneTarget, KTarget1Size);
+			iLargeTarget = EFalse;
+			
+			// create source bitmaps for tests
+			CreateBitmapsL(iTestParams.iSourcePixelFormat);
+			RunTestsL();
+			// only run OOM tests for one target pixel format to prevent duplication of tests
+			if ((targetPixelFormatIndex == 0) && isEColor256)
+				{
+				RunOomTestsL();  //from base class
+				}
+			// delete source bitmaps
+			DeleteBitmaps();
+						
+			// large target
+			SetTargetL(iTestParams.iTargetPixelFormat, EOneContextOneTarget, KTarget2Size);
+			iLargeTarget = ETrue;
+			
+			// create source bitmaps for tests
+			CreateBitmapsL(iTestParams.iSourcePixelFormat);
+			RunTestsL();
+			if ((targetPixelFormatIndex == 0) && isEColor256)
+				{
+				RunOomTestsL();  //from base class
+				}
+			// delete source bitmaps
+			DeleteBitmaps();
+			}
+		}
+	CloseTMSGraphicsStep();
+
+	return TestStepResult();
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTBitBltBase::doTestStepPreambleL()
+	{
+	CTDirectGdiStepBase::doTestStepPreambleL();
+	return TestStepResult();
+	}
+
+/**
+Override of base class virtual
+@leave Gets system wide error code
+@return - TVerdict code
+*/
+TVerdict CTBitBltBase::doTestStepPostambleL()
+	{
+	DeleteBitmaps();
+	CTDirectGdiStepBase::doTestStepPostambleL();
+	return TestStepResult();
+	}
+
+/**
+Write target output.
+Call method from base class with test case name and source pixel format string.
+@param aTestCaseName Name of test case.
+*/
+void CTBitBltBase::WriteTargetOutput(TPtrC aTestCaseName)
+	{	
+	TBuf<KFileNameLength> postfix;
+	postfix.Append(KSourceString);
+	postfix.Append(KSeparator);
+	postfix.Append(TDisplayModeMapping::ConvertPixelFormatToShortPixelFormatString(iTestParams.iSourcePixelFormat));
+	
+	TESTNOERROR(CTDirectGdiStepBase::WriteTargetOutput(iTestParams, aTestCaseName, &postfix));
+	}
+
+/**
+Create set of bitmaps needed for tests.
+@param aPixelFormat Source pixel format of bitmap.
+*/
+void CTBitBltBase::CreateBitmapsL(TUidPixelFormat aPixelFormat)
+	{
+	iNotInitialisedBitmap = new (ELeave)CFbsBitmap();
+	iZeroSizeBitmap	 = new (ELeave)CFbsBitmap();
+	TESTNOERRORL(iZeroSizeBitmap->Create(TSize(0,0),TDisplayModeMapping::MapPixelFormatToDisplayMode(aPixelFormat)));
+	iCompressedBitmap = CreateCheckedBoardBitmapL(aPixelFormat, KBitmap2Size, TSize(8, 8));
+	iCompressedBitmap->Compress();
+	iCompressedBitmapSmall = CreateCheckedBoardBitmapL(aPixelFormat, KBitmap1Size, TSize(2,2));
+	iCompressedBitmapSmall->Compress();
+	iCheckedBoardBitmap1 = CreateCheckedBoardBitmapL(aPixelFormat, KBitmap1Size, KBitmap1Size);
+	iCheckedBoardBitmap2 = CreateCheckedBoardBitmapL(aPixelFormat, KBitmap2Size, TSize(8, 8));
+	iConcentricRectsBitmap1 = CreateConcentricRectsBitmapL(aPixelFormat, KBitmap1Size);
+	iConcentricRectsBitmap2 = CreateConcentricRectsBitmapL(aPixelFormat, KBitmap2Size);
+	iCheckedBoardWithAlphaBitmap = CreateCheckedBoardBitmapL(aPixelFormat, KBitmap2Size, TSize(16, 16), ETrue);
+	}
+
+/**
+Delete set of test bitmaps.
+*/
+void CTBitBltBase::DeleteBitmaps()
+	{	
+	delete iNotInitialisedBitmap;
+	iNotInitialisedBitmap = NULL;
+	delete iZeroSizeBitmap;
+	iZeroSizeBitmap = NULL;
+	delete iCompressedBitmap;
+	iCompressedBitmap = NULL;
+	delete iCompressedBitmapSmall;
+	iCompressedBitmapSmall = NULL;
+	delete iCheckedBoardBitmap1;
+	iCheckedBoardBitmap1 = NULL;
+	delete iCheckedBoardBitmap2;
+	iCheckedBoardBitmap2 = NULL;
+	delete iConcentricRectsBitmap1;
+	iConcentricRectsBitmap1 = NULL;
+	delete iConcentricRectsBitmap2;
+	iConcentricRectsBitmap2 = NULL;
+	delete iCheckedBoardWithAlphaBitmap;
+	iCheckedBoardWithAlphaBitmap = NULL;
+	}
+
+/**
+Common positioning test function for BitBlt() and DrawBitmap() tests.
+The test iterates positions over whole target, outside target and on the target boundaries
+and call tested function for those positions.
+@param aTestName Name of test case.
+@param aFunc Tested function. EBitBlt and EDrawBitmap are supported.
+*/
+void CTBitBltBase::TestPositioningBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{	
+	CFbsBitmap* bitmap;
+	if(iTestParams.iDoCompressed)
+		{
+		bitmap = iCompressedBitmap;
+		}
+	else
+		{
+		bitmap = iConcentricRectsBitmap1;
+		}
+	
+	TInt width = iGdiTarget->SizeInPixels().iWidth;
+	TInt height = iGdiTarget->SizeInPixels().iHeight;
+	TInt bmpWidth = bitmap->SizeInPixels().iWidth;
+	TInt bmpHeight = bitmap->SizeInPixels().iHeight;
+	TSize bmpSize(bmpWidth, bmpHeight);
+
+	// test two versions of function
+	for(TInt i = 0; i < 2; i++)
+		{
+		ResetGc();
+
+		TPositionIterator posIterator(-30, width+30, bmpWidth, -30, height+30, bmpHeight);
+		posIterator.Begin();
+
+		do
+			{
+			//It is done to shift the rectangle drawn. It gives a slope effect in the image.
+			TPoint pos(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX);
+			if(aFunc == EBitBlt)
+				{
+				if(i == 0)
+					{
+					iGc->BitBlt(pos, *bitmap);
+					}
+				else
+					{
+					// additionally source rect size is iterated
+					iGc->BitBlt(pos, *bitmap, TRect(TPoint(0, 0), TSize(posIterator.iIndexX, posIterator.iIndexY)));
+					}
+				}
+			else // (aFunc == EDrawBitmap)
+				{
+				if(i == 0)
+					{
+					iGc->DrawBitmap(TRect(pos, bmpSize), *bitmap);
+					}
+				else
+					{
+					// additionally source rect size is iterated
+					iGc->DrawBitmap(TRect(pos, bmpSize),*bitmap, TRect(TPoint(0, 0), TSize(posIterator.iIndexX, posIterator.iIndexY)));
+					}
+				}
+			}
+		while(posIterator.Next());
+
+		TESTNOERRORL(iGc->GetError());
+
+		if(!iTestParams.iDoCompressed)
+			{
+			// add 1 or 2 to test case name to identity function version
+			TBuf<30> testName;
+			testName.Append(aTestName);
+			testName.AppendNum(i+1);
+			WriteTargetOutput(testName);
+			}
+		}
+	}
+
+/**
+Common invalid parameters test function for BitBlt() and DrawBitmap() tests.
+The function tests against invalid source rectangle, zero size source bitmap
+(both cases should return KErrArgument) and not initialised source bitmap (should
+return KErrBadHandle).
+@param aTestName Name of test case.
+@param aFunc Tested function. EBitBlt and EDrawBitmap are supported.
+*/
+void CTBitBltBase::TestInvalidParametersBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{		
+	ResetGc();
+
+	CFbsBitmap* bitmap = iConcentricRectsBitmap2;
+
+	TInt bmpWidth = bitmap->SizeInPixels().iWidth;
+	TInt bmpHeight = bitmap->SizeInPixels().iHeight;
+
+	// invalid source rectangle
+	RArray<TRect> rectArray;
+	CleanupClosePushL(rectArray);
+	TInt err = KErrNone;
+	err |= rectArray.Append(TRect(-30, -30, -10, -10));
+	err |= rectArray.Append(TRect(bmpWidth+10, bmpHeight+10, bmpWidth+20, bmpHeight+20));
+	err |= rectArray.Append(TRect(bmpWidth, bmpHeight, 0, 0));
+	err |= rectArray.Append(TRect(-10, -10, -30, -30));
+	err |= rectArray.Append(TRect(0, 0, 0, 0));
+	TESTL(KErrNone == err);
+	
+	for(TInt i = 0; i < rectArray.Count(); i++)
+		{
+		if(aFunc == EBitBlt)
+			{
+			iGc->BitBlt(TPoint(i*20, 0), *bitmap, rectArray[i]);
+			}
+		else // (aFunc == EDrawBitmap)
+			{
+			iGc->DrawBitmap(TRect(TPoint(i*20, 0), TSize(50, 50)), *bitmap, rectArray[i]);
+			}
+		}
+
+	TESTNOERRORL(iGc->GetError());
+
+	CleanupStack::PopAndDestroy(&rectArray);
+
+	if(aFunc == EBitBlt)
+		{
+		// invalid source bitmap, zero size bitmap
+		iGc->BitBlt(TPoint(0, 20), *iZeroSizeBitmap);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+		
+		iGc->BitBlt(TPoint(20, 20), *iZeroSizeBitmap, TRect(TPoint(0, 0), TSize(0, 0)));
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		// invalid source bitmap, not initialised bitmap
+		iGc->BitBlt(TPoint(0, 40), *iNotInitialisedBitmap);
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+		
+		iGc->BitBlt(TPoint(20, 40), *iNotInitialisedBitmap, TRect(TPoint(0, 0), TSize(0, 0)));
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+		}
+	else // (aFunc == EDrawBitmap)
+		{
+		// invalid source bitmap, zero size bitmap
+		iGc->DrawBitmap(TRect(TPoint(0, 20), TSize(50, 50)), *iZeroSizeBitmap);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+		
+		iGc->DrawBitmap(TRect(TPoint(20, 20), TSize(50, 50)), *iZeroSizeBitmap,	TRect(TPoint(0, 0), TSize(10, 10)));
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		// invalid source bitmap, not initialised bitmap
+		iGc->DrawBitmap(TRect(TPoint(0, 40), TSize(50, 50)), *iNotInitialisedBitmap);
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+		
+		iGc->DrawBitmap(TRect(TPoint(20, 40), TSize(50, 50)), *iNotInitialisedBitmap,
+				TRect(TPoint(0, 0), TSize(10, 10)));
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+		}
+
+	// test if target is still clear
+	TBool res = TestTargetL(KRgbWhite); 
+	TEST(res);
+	// output the bitmap if there was an error to assist with debugging
+	if (res == EFalse)
+		{			
+		WriteTargetOutput(aTestName);
+		}
+	}
+
+/**
+Common source bitmap cloning test function for BitBlt() and DrawBitmap() tests.
+@param aTestName Name of test case.
+@param aFunc Tested function. EBitBlt and EDrawBitmap are supported.
+*/
+void CTBitBltBase::TestSourceBitmapCloningBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{
+	ResetGc();
+
+	TSize bmpSize(KBitmap2Size);
+
+	for(TInt i = 0; i < 5; i++)
+		{
+		CFbsBitmap* bitmap = CreateConcentricRectsBitmapL(iTestParams.iSourcePixelFormat, bmpSize);
+		if(iTestParams.iDoCompressed)
+			bitmap->Compress();
+			
+		if(aFunc == EBitBlt)
+			{
+			iGc->BitBlt(TPoint(55-35+i*10+1, -60+80+i*7+i), *bitmap);
+			}
+		else // (aFunc == EDrawBitmap)
+			{
+			iGc->DrawBitmap(TRect(TPoint(55-35+i*10+1, -60+80+i*7+i), bmpSize), *bitmap);
+			}
+
+		delete bitmap;
+		bitmap = NULL;
+
+		bmpSize -= TSize(10, 15);
+		}
+	
+	TESTNOERRORL(iGc->GetError());
+	if(!iTestParams.iDoCompressed)
+		WriteTargetOutput(aTestName);
+	}