graphicsdeviceinterface/directgdi/test/tbitbltmaskedbase.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicsdeviceinterface/directgdi/test/tbitbltmaskedbase.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,445 @@
+// 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 "tbitbltmaskedbase.h"
+
+
+CTBitBltMaskedBase::CTBitBltMaskedBase()
+	{
+	
+	}
+
+CTBitBltMaskedBase::~CTBitBltMaskedBase()
+	{
+
+	}
+
+/**
+Write target output.
+Call method from base class with test case name and combined source pixel format and mask type string.
+@param aTestCaseName Name of test case.
+@return KErrNone if successful, otherwise one of the system-wide error codes.
+*/
+TInt CTBitBltMaskedBase::WriteTargetOutput(TPtrC aTestCaseName)
+	{
+	TBuf<KFileNameLength> postfix;	
+	postfix.Append(KSourceString);
+	postfix.Append(KSeparator);
+	postfix.Append(TDisplayModeMapping::ConvertPixelFormatToShortPixelFormatString(
+				iTestParams.iSourcePixelFormat));	
+
+	postfix.Append(KSeparator);
+	if(iInvertMask)
+		{
+		postfix.Append(_L16("Invert"));
+		}
+	postfix.Append(_L16("M"));
+
+	if(iMaskPixelFormat == EUidPixelFormatL_8)
+		{
+		postfix.Append(_L16("L8"));
+		}
+	else if(iMaskPixelFormat == EUidPixelFormatL_1)
+		{
+		postfix.Append(_L16("L1"));
+		}
+	
+	return CTDirectGdiStepBase::WriteTargetOutput(iTestParams, aTestCaseName, &postfix);
+	}
+
+/**
+Create set of bitmaps needed for tests.
+@param aPixelFormat Source pixel format of bitmap.
+*/
+void CTBitBltMaskedBase::CreateBitmapsL(TUidPixelFormat aPixelFormat)
+	{
+	CTBitBltBase::CreateBitmapsL(aPixelFormat);
+	iNotInitialisedMask = new (ELeave)CFbsBitmap();
+	iZeroSizeMask = new (ELeave)CFbsBitmap();
+	TESTL(KErrNone == iZeroSizeMask->Create(TSize(0,0), TDisplayModeMapping::MapPixelFormatToDisplayMode(EUidPixelFormatL_1)));
+	iMask1L1 = CreateCheckedBoardBitmapL(EUidPixelFormatL_1, KBitmap1Size, TSize(4, 4));
+	iMask2L1 = CreateCheckedBoardBitmapL(EUidPixelFormatL_1, KBitmap2Size, TSize(8, 8));
+	iMask1L8 = CreateMaskingPixmapL(EUidPixelFormatL_8, KBitmap1Size);
+	iMask2L8 = CreateMaskingPixmapL(EUidPixelFormatL_8, KBitmap2Size);
+	iCompressedMaskL8 = CreateMaskingPixmapL(EUidPixelFormatL_8, KBitmap2Size);
+	iCompressedMaskL8->Compress();
+	iBlackWhiteBitmap = CreateBlackWhiteBitmapL(aPixelFormat, KBitmap2Size, TSize(8, 8));
+	}
+
+/**
+Delete set of test bitmaps.
+*/
+void CTBitBltMaskedBase::DeleteBitmaps()
+	{
+	delete iNotInitialisedMask;
+	iNotInitialisedMask = NULL;
+	delete iZeroSizeMask;
+	iZeroSizeMask = NULL;
+	delete iMask1L1;
+	iMask1L1 = NULL;
+	delete iMask2L1;
+	iMask2L1 = NULL;
+	delete iMask1L8;
+	iMask1L8 = NULL;
+	delete iMask2L8;
+	iMask2L8 = NULL;
+	delete iCompressedMaskL8;
+	iCompressedMaskL8 = NULL;
+	delete iBlackWhiteBitmap;
+	iBlackWhiteBitmap = NULL;
+	CTBitBltBase::DeleteBitmaps();
+	}
+
+/**
+Begin iteration through mask types.
+All needed variables are initialized to start iteration.
+*/
+void CTBitBltMaskedBase::BeginMaskIteration()
+	{
+	iMaskType = EMaskL1;
+	iMaskPixelFormat = EUidPixelFormatL_1;
+	iInvertMask = EFalse;
+	iCurrentMask1 = iMask1L1;
+	iCurrentMask2 = iMask2L1;
+	}
+
+/**
+Next iteration of mask types.
+Generates next mask type.
+@return EFalse is returned if end of iterations else ETrue.
+*/
+TBool CTBitBltMaskedBase::NextMaskIteration()
+	{
+	iMaskType++;
+	switch(iMaskType)
+		{
+		case EMaskL1:
+			{
+			iMaskPixelFormat = EUidPixelFormatL_1;
+			iInvertMask = EFalse;
+			iCurrentMask1 = iMask1L1;
+			iCurrentMask2 = iMask2L1;
+			break;
+			}
+
+		case EMaskL1Inv:
+			{
+			iMaskPixelFormat = EUidPixelFormatL_1;
+			iInvertMask = ETrue;
+			iCurrentMask1 = iMask1L1;
+			iCurrentMask2 = iMask2L1;
+			break;
+			}
+
+		case EMaskL8:
+			{
+			iMaskPixelFormat = EUidPixelFormatL_8;
+			iInvertMask = EFalse;
+			iCurrentMask1 = iMask1L8;
+			iCurrentMask2 = iMask2L8;
+			break;
+			}
+			
+		case EMaskIterationEnd:
+			{
+			return EFalse;
+			}
+		}
+
+	return ETrue;
+	}
+
+/**
+Common positioning test function for BitBltMasked() and DrawBitmapMasked() 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. EBitBltMasked and EDrawBitmapMasked are supported.
+*/
+void CTBitBltMaskedBase::TestPositioningBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{
+	if (iRunningOomTests)
+		{
+		// OOM tests take too long if this test is run.  Doesn't test anything new for OOM over other tests.
+		return;
+		}
+	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);
+
+	ResetGc();
+
+	TPositionIterator posIterator(-30, width+30, bmpWidth, -30, height+30, bmpHeight);
+	posIterator.Begin();
+
+	do
+		{
+		TPoint pos(posIterator.iPosX+posIterator.iIndexY, posIterator.iPosY+posIterator.iIndexX);
+
+		if(aFunc == EBitBltMasked)
+			{
+			if(iMaskPixelFormat == EUidPixelFormatL_1)
+				{
+				iGc->BitBltMasked(pos, *bitmap,
+					TRect(TPoint(0, 0), bmpSize), *iCurrentMask1, iInvertMask);
+				}
+			else
+				{
+				// additionaly mask position is iterated
+				iGc->BitBltMasked(pos, *bitmap,
+					TRect(TPoint(0, 0), bmpSize), *iCurrentMask1, TPoint(posIterator.iIndexX, posIterator.iIndexY));
+				}
+			}
+		else // (aFunc == EDrawBitmapMasked)
+			{
+			iGc->DrawBitmapMasked(TRect(pos, bmpSize), *bitmap,
+					TRect(TPoint(0, 0), bmpSize), *iCurrentMask1, iInvertMask);
+			}
+		}
+	while(posIterator.Next());
+
+	// WORKAROUND:
+	// It looks like AlphaBlendBitmaps() (which is mapped on DrawBitmapMasked() with alpha for BitGDI)
+	// do not support clipping and returns KErrArgument for destination rect (partialy) outside the target.
+	if(aFunc == EBitBltMasked)
+		{
+		if(iUseDirectGdi || (iMaskPixelFormat == EUidPixelFormatL_1) || (iGc->GetError() != KErrArgument))
+			{
+			TESTNOERROR(iGc->GetError());
+			}
+		}
+	else
+		{
+		TESTNOERROR(iGc->GetError());
+		}
+	if(!iTestParams.iDoCompressed)
+		TESTNOERRORL(WriteTargetOutput(aTestName));
+	}
+
+/**
+Common invalid parameters test function for BitBltMasked() and DrawBitmapMasked() tests.
+The function tests against invalid source rectangle, zero size source bitmap (both should
+return KErrArgument) and not initialised source bitmap (should return KErrBadHandle). 
+@param aTestName Name of test case.
+@param aFunc Tested function. EBitBltMasked and EDrawBitmapMasked are supported.
+*/
+void CTBitBltMaskedBase::TestInvalidParametersBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{	
+	ResetGc();
+
+	CFbsBitmap* bitmap = iConcentricRectsBitmap2;
+
+	TInt bmpWidth = bitmap->SizeInPixels().iWidth;
+	TInt bmpHeight = bitmap->SizeInPixels().iHeight;
+	TSize bmpSize(bmpWidth, bmpHeight);
+
+	// 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 == EBitBltMasked)
+			{
+			iGc->BitBltMasked(TPoint(i*20, 0), *bitmap, rectArray[i], *iMask1L1, EFalse);
+			}
+		else // (aFunc == EDrawBitmapMasked)
+			{
+			iGc->DrawBitmapMasked(TRect(TPoint(i*20, 0), bmpSize), *bitmap, rectArray[i], *iMask1L1, EFalse);
+			}
+		}
+
+	TESTNOERRORL(iGc->GetError());
+
+	CleanupStack::PopAndDestroy(&rectArray);
+
+	TRect zeroRect(TPoint(0, 0), TSize(0, 0));
+
+	if(aFunc == EBitBltMasked)
+		{
+		// invalid source bitmap, zero size bitmap
+		iGc->BitBltMasked(TPoint(0, 20), *iZeroSizeBitmap, zeroRect, *iMask1L1, EFalse);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+		
+		iGc->BitBltMasked(TPoint(20, 20), *iZeroSizeBitmap, zeroRect, *iMask1L8, TPoint(0, 0));
+		TESTL(iGc->GetError() == KErrArgument);
+		
+		iGc->BitBltMasked(TPoint(20, 20), *iZeroSizeBitmap, zeroRect, *iMask1L8, TPoint(0, 0));
+		TESTL(iGc->GetError() == KErrArgument);
+
+		// invalid source bitmap, not initialised bitmap
+		iGc->BitBltMasked(TPoint(0, 40), *iNotInitialisedBitmap, zeroRect, *iMask1L1, EFalse);
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+		
+		iGc->BitBltMasked(TPoint(20, 40), *iNotInitialisedBitmap, zeroRect, *iMask1L8, TPoint(0, 0));
+		TESTL(iGc->GetError() == iUseDirectGdi ? KErrBadHandle : KErrArgument);
+
+		TRect bmpRect(TPoint(0, 0), bmpSize);
+		
+		// BitGDI performs drawing when mask is zero sized or not initialised
+		// so we test only in DirectGDI
+		if(iUseDirectGdi)
+			{
+			// invalid mask, zero size mask
+			iGc->BitBltMasked(TPoint(0, 60), *bitmap, bmpRect, *iZeroSizeMask, EFalse);
+			TESTL(iGc->GetError() == KErrArgument);
+		
+			iGc->BitBltMasked(TPoint(20, 60), *bitmap, bmpRect, *iZeroSizeMask, TPoint(0, 0));
+			TESTL(iGc->GetError() == KErrArgument);
+		
+			// invalid mask, not initialised mask
+			iGc->BitBltMasked(TPoint(0, 80), *bitmap, bmpRect, *iNotInitialisedMask, EFalse);
+			TESTL(iGc->GetError() == KErrBadHandle);
+		
+			iGc->BitBltMasked(TPoint(20, 80), *bitmap, bmpRect, *iNotInitialisedMask, TPoint(0, 0));
+			TESTL(iGc->GetError() == KErrBadHandle);
+			}
+		}
+	else // (aFunc == EDrawBitmapMasked)
+		{
+		// invalid source bitmap, zero size bitmap
+		iGc->DrawBitmapMasked(TRect(TPoint(0, 20), TSize(0, 0)), *iZeroSizeBitmap, zeroRect, *iMask1L1, EFalse);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		// invalid source bitmap, not initialised bitmap
+		iGc->DrawBitmapMasked(TRect(TPoint(0, 40), TSize(0, 0)), *iNotInitialisedBitmap, zeroRect, *iMask1L1, EFalse);
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		// invalid mask, zero size mask
+		TRect bmpRect(TPoint(0, 0), bmpSize);
+		iGc->DrawBitmapMasked(TRect(TPoint(0, 60), bmpSize), *bitmap, bmpRect, *iZeroSizeMask, EFalse);
+		CheckErrorsL(KErrArgument, KErrNone, (TText8*)__FILE__, __LINE__);
+
+		// invalid mask, not initialised mask
+		iGc->DrawBitmapMasked(TRect(TPoint(0, 80), bmpSize), *bitmap, bmpRect, *iNotInitialisedMask, EFalse);
+		CheckErrorsL(KErrBadHandle, KErrNone, (TText8*)__FILE__, __LINE__);
+		}
+
+	// Test if target is clear. By definition, images rendered using any invalid parameter,
+	// should result in no change in the target.
+	//This test is not valid for BitGDI as it generates an output if mask size is zero.
+	if(iUseDirectGdi)
+		{
+		TBool res = TestTargetL(KRgbWhite);
+		TEST(res);
+		// output the bitmap if there was an error to assist with debugging
+		if (res == EFalse)
+			{				
+			TESTNOERRORL(WriteTargetOutput(aTestName));
+			}
+		}
+	
+	}
+
+/**
+Common source bitmap cloning test function for BitBltMasked() and DrawBitmapMasked() tests.
+@param aTestName Name of test case.
+@param aFunc Tested function. EBitBltMasked and EDrawBitmapMasked are supported.
+*/
+void CTBitBltMaskedBase::TestSourceBitmapCloningBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{	
+	ResetGc();
+
+	TInt width = iGdiTarget->SizeInPixels().iWidth;
+	TInt height = iGdiTarget->SizeInPixels().iHeight;
+
+	TSize bmpSize(KBitmap2Size);
+
+	for(TInt i = 0; i < 5; i++)
+		{
+		CFbsBitmap* bitmap = CreateConcentricRectsBitmapL(iTestParams.iSourcePixelFormat, bmpSize);
+		if(iTestParams.iDoCompressed)
+			bitmap->Compress();
+			
+		if(aFunc == EBitBltMasked)
+			{
+			iGc->BitBltMasked(TPoint(55-35+i*10+1, -60+80+i*7+1), *bitmap,
+				TRect(TPoint(0, 0), bmpSize), *iCurrentMask2, iInvertMask);
+			}
+		else // (aFunc == EDrawBitmapMasked)
+			{
+			iGc->DrawBitmapMasked(TRect(TPoint(55-35+i*10+1, -60+80+i*7+1), bmpSize), *bitmap,
+					TRect(TPoint(0, 0), bmpSize), *iCurrentMask2, iInvertMask);
+			}
+
+		delete bitmap;
+		bitmap = NULL;
+
+		bmpSize -= TSize(10, 15);
+		}
+	
+	TESTNOERRORL(iGc->GetError());
+	if(!iTestParams.iDoCompressed)
+		TESTNOERRORL(WriteTargetOutput(aTestName));
+	}
+
+/**
+Common mask cloning test function for BitBltMasked() and DrawBitmapMasked() tests.
+@param aTestName Name of test case.
+@param aFunc Tested function. EBitBltMasked and EDrawBitmapMasked are supported.
+*/
+void CTBitBltMaskedBase::TestMaskCloningBaseL(const TDesC& aTestName, TBitBltFuncType aFunc)
+	{	
+	ResetGc();
+
+	TSize maskSize(KBitmap2Size);
+
+	for(TInt i = 0; i < 5; i++)
+		{
+		CFbsBitmap* mask = CreateCheckedBoardBitmapL(EUidPixelFormatL_1, maskSize, TSize(8, 8));
+		if(iTestParams.iDoCompressed)
+			mask->Compress();
+			
+		if(aFunc == EBitBltMasked)
+			{
+			iGc->BitBltMasked(TPoint(55-35+i*10+1, -60+80+i*7+1), *iConcentricRectsBitmap2,
+					TRect(TPoint(0, 0), KBitmap2Size), *mask, iInvertMask);
+			}
+		else // (aFunc == EDrawBitmapMasked)
+			{
+			iGc->DrawBitmapMasked(TRect(TPoint(55-35+i*10+1, -60+80+i*7+1), iConcentricRectsBitmap2->SizeInPixels()),
+					*iConcentricRectsBitmap2, TRect(TPoint(0, 0), KBitmap2Size), *mask, iInvertMask);
+			}
+
+		delete mask;
+		mask = NULL;
+
+		maskSize -= TSize(10, 15);
+		}
+	
+	TESTNOERRORL(iGc->GetError());
+	
+	if(!iTestParams.iDoCompressed)
+		TESTNOERRORL(WriteTargetOutput(aTestName));
+	}