--- /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);
+ }