Revise some of the compositor performance improvements to improve correctness.
Implement pixel blending using a variation of Jim Blinn's no-division blending algorithm.
Move transparency type simplification further up the composition code.
Remove some unnecessary fields.
Output to YUV implementation needs revision as it is actually converting from YUV (copy of source conversion code).
// Copyright (c) 1997-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 <hal.h>
#include <e32test.h>
#include <bitdraw.h>
#include <graphics/gdi/gdiconsts.h>
#include "TAUTO.H"
#include <graphics/fbsdefs.h>
TInt PanicTestThread(TAny* aOption);
enum TPanicOption
{
EFirst,
EPolygonFiller,
EBitmapDevice,
EDrawBmp1,
EDrawBmp2,
EDrawBmp3,
EGcDevice1,
EGcDevice2,
EGcRegion1,
EGcRegion2,
EUseBrush1,
EUseBrush2,
EUseBrush3,
EUseFont,
EDrawText1,
EDrawText2,
EDrawText3,
ELast
};
CTAuto::CTAuto(CTestStep* aStep):
CTGraphicsBase(aStep),
iScreenDevice(NULL),
iHalfScreen()
{
iTestRect[0].SetRect(21,10,22,50);
iTestRect[1].SetRect(10,21,50,22);
iTestRect[2].SetRect(11,20,90,30);
iTestRect[3].SetRect(10,71,90,80);
iTestRect[4].SetRect(20,10,31,90);
iTestRect[5].SetRect(70,10,80,91);
iTestRect[6].SetRect(10,10,90,90);
iTestRect[7].SetRect(32,32,96,96);
INFO_PRINTF1(_L(" "));
}
CTAuto::~CTAuto()
{
}
void CTAuto::RunTestCaseL(const TInt aCurTestCase)
{
((CTAutoStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
switch(aCurTestCase)
{
case 1:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EGray2);
break;
case 2:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EGray4);
break;
case 3:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EGray16);
break;
case 4:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EGray256);
break;
case 5:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor16);
break;
case 6:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor256);
break;
case 7:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor4K);
break;
case 8:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor64K);
break;
case 9:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor16M);
break;
case 10:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor16MU);
break;
case 11:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EGray2,15);
break;
case 12:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EGray4,5);
break;
case 13:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EGray16,5);
break;
case 14:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EGray256,5);
break;
case 15:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor16,5);
break;
case 16:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor256,3);
break;
case 17:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor4K,5);
break;
case 18:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor64K,4);
break;
case 19:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor16M,4);
break;
case 20:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor16MU,4);
break;
case 21:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EGray2);
break;
case 22:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EGray4);
break;
case 23:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EGray16);
break;
case 24:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EGray256);
break;
case 25:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor16);
break;
case 26:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor256);
break;
case 27:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor4K);
break;
case 28:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor64K);
break;
case 29:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor16M);
break;
case 30:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor16MU);
break;
case 31:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor16MA);
break;
case 32:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor16MA);
break;
case 33:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor16MA,4);
break;
case 34:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0027"));
TestBmpL(EColor16MAP);
break;
case 35:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0025"));
TestMem(EColor16MAP);
break;
case 36:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0026"));
TestMapL(EColor16MAP,4);
break;
case 37:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0029"));
TestFadingL();
INFO_PRINTF2(_L("TestCase %d - Passed Fading Test\r\n"),aCurTestCase);
break;
case 38:
((CTAutoStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0028"));
TestPanics();
break;
case 39: //exit
((CTAutoStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
((CTAutoStep*)iStep)->CloseTMSGraphicsStep();
TestComplete();
break;
}
((CTAutoStep*)iStep)->RecordTestResultL();
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0025
@SYMDEF
@SYMTestCaseDesc Tests the memory allocation cleanup after allocations fails
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions sets memory allocation to fail then checks it is cleaned up correctly
@SYMTestExpectedResults Memory should be successfully cleaned up
*/
void CTAuto::TestMem(TDisplayMode aDispMode)
{
LowLevelDevice(aDispMode,EFalse);
BitmapDevice(aDispMode);
LowLevelDevice(aDispMode,ETrue);
ScreenDevice(aDispMode);
INFO_PRINTF2(_L("Mode %d passed memory test\r\n"),aDispMode);
}
void CTAuto::ScreenDevice(TDisplayMode aDispMode)
{
CFbsScreenDevice* device = NULL;
for (TInt count = 1; ; count++)
{
__UHEAP_SETFAIL(RHeap::EDeterministic,count);
__UHEAP_MARK;
TRAPD(err,device = CFbsScreenDevice::NewL(_L("scdv"),aDispMode));
if (err == KErrNotSupported)
{
__UHEAP_MARKEND;
break;
}
else if(err == KErrNoMemory)
{
__UHEAP_MARKEND;
}
else if (err == KErrNone)
{
delete device;
__UHEAP_MARKEND;
break;
}
else
{
__UHEAP_MARKEND;
User::Panic(_L("CFbsScreenDevice test failed "),err);
}
}
__UHEAP_RESET;
}
void CTAuto::BitmapDevice(TDisplayMode aDispMode)
{
CFbsBitmap bmp;
TInt ret = bmp.Create(TSize(1,1),aDispMode);
if (ret != KErrNone)
User::Panic(_L("Failed to create bitmap"),ret);
CFbsBitmapDevice* device = NULL;
for (TInt count = 1; ; count++)
{
__UHEAP_SETFAIL(RHeap::EDeterministic,count);
__UHEAP_MARK;
TRAPD(err,device = CFbsBitmapDevice::NewL(&bmp));
if(err == KErrNotSupported)
{
__UHEAP_MARKEND;
break;
}
else if(err == KErrNoMemory)
{
__UHEAP_MARKEND;
}
else if (err == KErrNone)
{
delete device;
__UHEAP_MARKEND;
break;
}
else
{
__UHEAP_MARKEND;
User::Panic(_L("CFbsBitmapDevice test failed "),err);
}
}
__UHEAP_RESET;
}
void CTAuto::LowLevelDevice(TDisplayMode aDispMode,TBool aScreen)
{
TInt address = NULL;
TSize size(0,0);
TInt ret = HAL::Get(KDefaultScreenNo, HALData::EDisplayMemoryAddress,address);
if (ret == KErrNone)
ret = HAL::Get(KDefaultScreenNo, HALData::EDisplayXPixels,size.iWidth);
if (ret == KErrNone)
ret = HAL::Get(KDefaultScreenNo, HALData::EDisplayYPixels,size.iHeight);
if (ret != KErrNone)
User::Panic(_L("CFbsDrawDevice test failed "),ret);
TPckgBuf<TScreenInfoV01> s;
s().iScreenAddressValid = ETrue;
s().iScreenAddress = REINTERPRET_CAST(TAny*,address);
s().iScreenSize = size;
CFbsDrawDevice* fdd = NULL;
for(TInt count = 1; ; count++)
{
__UHEAP_SETFAIL(RHeap::EDeterministic,count);
__UHEAP_MARK;
if (aScreen)
{
TRAP(ret,fdd = CFbsDrawDevice::NewScreenDeviceL(s(),aDispMode));
}
else
{
TRAP(ret, fdd = CFbsDrawDevice::NewBitmapDeviceL(s(), aDispMode, CFbsBitmap::ScanLineLength(size.iWidth, aDispMode)));
}
if (ret == KErrNotSupported)
{
__UHEAP_MARKEND;
break;
}
else if (ret == KErrNoMemory)
{
__UHEAP_MARKEND;
}
else if (ret == KErrNone)
{
delete fdd;
__UHEAP_MARKEND;
break;
}
else
{
__UHEAP_MARKEND;
User::Panic(_L("CFbsDrawDevice test failed "),ret);
}
}
__UHEAP_RESET;
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0026
@SYMDEF
@SYMTestCaseDesc Colour mapping testing
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions attempts to map four shades of grey to greys in a colourmap
@SYMTestExpectedResults All pixels should map to the colourmap correctly
*/
//
//
//
void CTAuto::TestMapL(TDisplayMode aDispMode,TInt aShadowFactor)
{
TRAPD(err,iScreenDevice = CFbsScreenDevice::NewL(_L("scdv"),aDispMode));
if (err == KErrNotSupported)
return;
User::LeaveIfError(err);
User::LeaveIfError(iScreenDevice->CreateContext(iScreenGc));
iScreenDevice->ChangeScreenDevice(NULL);
TestMapColors();
TestShadowArea(aShadowFactor);
TestFadeArea();
delete iScreenGc;
delete iScreenDevice;
INFO_PRINTF2(_L("Mode %d passed colour map test\r\n"),aDispMode);
}
void CTAuto::TestMapColors()
{
TRgb colormap[4];
TRgb screencolor;
TInt x,y;
for (TInt count = 0; count < KNumRects; count++)
{
for (TInt color = 0; color < 4 && iScreenDevice->DisplayMode() != EGray2; color++)
{
Clear(TRgb::Gray4(color));
TRect r(iTestRect[count]);
colormap[0] = TRgb::Gray4(color);
colormap[1] = TRgb::Gray4(3-color);
colormap[2] = colormap[1];
colormap[3] = colormap[0];
if (iScreenDevice->DisplayMode() == EColor64K)
{
colormap[0] = TRgb::Color64K(colormap[0].Color64K());
colormap[1] = TRgb::Color64K(colormap[1].Color64K());
colormap[2] = colormap[1];
colormap[3] = colormap[0];
}
iScreenGc->MapColors(r,colormap,2);
for(y=0;y<r.iTl.iY;y++)
for(x=0;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=0;x<r.iTl.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iBr.iX;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iBr.iY;y<100;y++)
for(x=0;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iTl.iX;x<r.iBr.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == 3-color);
}
iScreenGc->MapColors(r,colormap,2);
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iTl.iX;x<r.iBr.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
}
}
}
void CTAuto::TestShadowArea(TInt aShadowFactor)
{
TRgb screencolor;
TInt x,y;
for (TInt count = 0; count < KNumRects; count++)
{
for (TInt color = 0; color < 4; color++)
{
if (color > 0 && iScreenDevice->DisplayMode() == EGray2)
color = 3;
Clear(TRgb::Gray4(color));
TRect r(iTestRect[count]);
TRegionFix<1> reg(r);
iScreenGc->ShadowArea(®);
for(y=0;y<r.iTl.iY;y++)
for(x=0;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=0;x<r.iTl.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iBr.iX;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iBr.iY;y<100;y++)
for(x=0;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray4() == color);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iTl.iX;x<r.iBr.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor.Gray16() == Max(0,color * 5 - aShadowFactor));
}
}
}
}
void CTAuto::TestFadeArea()
{
DoTestFadeArea(0,255);
DoTestFadeArea(0,127);
DoTestFadeArea(128,255);
DoTestFadeArea(64,192);
}
void CTAuto::DoTestFadeArea(TUint8 aBlackMap,TUint8 aWhiteMap)
{
iScreenGc->SetFadingParameters(aBlackMap,aWhiteMap);
DoTestFadeArea(KRgbWhite,FadeColor(KRgbWhite,aBlackMap,aWhiteMap));
DoTestFadeArea(KRgbBlack,FadeColor(KRgbBlack,aBlackMap,aWhiteMap));
if (iScreenDevice->DisplayMode() == EGray2)
return; // EGray2 mode dithers so only check black & white
DoTestFadeArea(KRgbGray,FadeColor(KRgbGray,aBlackMap,aWhiteMap));
DoTestFadeArea(KRgbDarkGray,FadeColor(KRgbDarkGray,aBlackMap,aWhiteMap));
if (iScreenDevice->DisplayMode() == EGray4)
return; // EGray4 mode dithers so only check four gray scales
DoTestFadeArea(KRgbRed,FadeColor(KRgbRed,aBlackMap,aWhiteMap));
DoTestFadeArea(KRgbGreen,FadeColor(KRgbGreen,aBlackMap,aWhiteMap));
DoTestFadeArea(KRgbBlue,FadeColor(KRgbBlue,aBlackMap,aWhiteMap));
}
void CTAuto::DoTestFadeArea(TRgb aColor,TRgb aFadedColor)
{
TRgb screencolor;
TInt x,y;
for (TInt count = 0; count < KNumRects; count++)
{
Clear(aColor);
aColor = MapColorToDisplayMode(aColor);
TRect r(iTestRect[count]);
TRegionFix<1> reg(r);
iScreenGc->FadeArea(®);
for(y=0;y<r.iTl.iY;y++)
for(x=0;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor == aColor);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=0;x<r.iTl.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor == aColor);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iBr.iX;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor == aColor);
}
for(y=r.iBr.iY;y<100;y++)
for(x=0;x<100;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor == aColor);
}
for(y=r.iTl.iY;y<r.iBr.iY;y++)
for(x=r.iTl.iX;x<r.iBr.iX;x++)
{
iScreenDevice->GetPixel(screencolor,TPoint(x,y));
TEST(screencolor == aFadedColor);
}
}
}
TRgb CTAuto::FadeColor(TRgb aColor,TInt aBlackMap,TInt aWhiteMap)
{
aColor = MapColorToDisplayMode(aColor);
TInt red = ((aColor.Red() * (aWhiteMap - aBlackMap + 1)) >> 8) + aBlackMap;
TInt green = ((aColor.Green() * (aWhiteMap - aBlackMap + 1)) >> 8) + aBlackMap;
TInt blue = ((aColor.Blue() * (aWhiteMap - aBlackMap + 1)) >> 8) + aBlackMap;
aColor = TRgb(red,green,blue);
aColor = MapColorToDisplayMode(aColor);
return aColor;
}
TRgb CTAuto::MapColorToDisplayMode(TRgb aColor)
{
switch (iScreenDevice->DisplayMode())
{
case EGray2:
aColor = TRgb::Gray2(aColor.Gray2());
break;
case EGray4:
aColor = TRgb::Gray4(aColor.Gray4());
break;
case EGray16:
aColor = TRgb::Gray16(aColor.Gray16());
break;
case EGray256:
aColor = TRgb::Gray256(aColor.Gray256());
break;
case EColor16:
aColor = TRgb::Color16(aColor.Color16());
break;
case EColor256:
aColor = TRgb::Color256(aColor.Color256());
break;
case EColor4K:
aColor = TRgb::Color4K(aColor.Color4K());
break;
case EColor64K:
aColor = TRgb::Color64K(aColor.Color64K());
break;
case EColor16M:
aColor = TRgb::Color16M(aColor.Color16M());
break;
case EColor16MU:
aColor = TRgb::Color16MU(aColor.Color16MU());
break;
case EColor16MA:
aColor = TRgb::Color16MA(aColor.Color16MA());
break;
case EColor16MAP:
aColor = TRgb::Color16MAP(aColor.Color16MAP());
break;
default:
User::Invariant();
break;
}
return aColor;
}
void CTAuto::Clear(TRgb aColor)
{
iScreenGc->SetBrushColor(aColor);
iScreenGc->Clear();
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0027
@SYMDEF
@SYMTestCaseDesc tests drawing a bitmap to the screen in various colour modes
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions draws to a bitmaps gc and the screens gc then compares the result on a per pixel basis
@SYMTestExpectedResults bitmap and screen should be identical
*/
//
// Bitmap drawing testing
//
void CTAuto::TestBmpL(TDisplayMode aDispMode)
{
TRAPD(err,iScreenDevice = CFbsScreenDevice::NewL(_L("scdv"),aDispMode));
if (err == KErrNotSupported)
return;
User::LeaveIfError(err);
iScreenDevice->ChangeScreenDevice(NULL);
User::LeaveIfError(iScreenDevice->CreateContext((CGraphicsContext*&)iScreenGc));
iHalfScreen = iScreenDevice->SizeInPixels();
iHalfScreen.iWidth /= 2;
CFbsBitmap bitmap;
User::LeaveIfError(bitmap.Create(iHalfScreen,aDispMode));
CFbsBitmapDevice* bitmapDevice = CFbsBitmapDevice::NewL(&bitmap);
CleanupStack::PushL(bitmapDevice);
CFbsBitGc* bitmapGc = NULL;
User::LeaveIfError(bitmapDevice->CreateContext(bitmapGc));
CleanupStack::PushL(bitmapGc);
TestGc(iScreenGc,iHalfScreen);
TestGc(bitmapGc,iHalfScreen);
iScreenGc->BitBlt(TPoint(iHalfScreen.iWidth,0),&bitmap);
TRgb* left = new(ELeave) TRgb[iHalfScreen.iWidth];
TRgb* right = new(ELeave) TRgb[iHalfScreen.iWidth];
TPtr8 leftBuf(REINTERPRET_CAST(TUint8*,left),iHalfScreen.iWidth * sizeof(TRgb),iHalfScreen.iWidth * sizeof(TRgb));
TPtr8 rightBuf(REINTERPRET_CAST(TUint8*,right),iHalfScreen.iWidth * sizeof(TRgb),iHalfScreen.iWidth * sizeof(TRgb));
for (TInt row = 0; row < iHalfScreen.iHeight; row++)
{
iScreenDevice->GetScanLine(leftBuf,TPoint(0,row),iHalfScreen.iWidth,ERgb);
bitmap.GetScanLine(rightBuf,TPoint(iHalfScreen.iWidth,row),iHalfScreen.iWidth,ERgb);
TRgb* leftPtr = left;
TRgb* rightPtr = right;
for (TInt col = 0; col < iHalfScreen.iWidth; col++)
{
if (leftPtr[0] != rightPtr[0])
User::Panic(_L("Screen/bitmap mismatch!"),KErrGeneral);
leftPtr++;
rightPtr++;
}
}
delete[] left;
delete[] right;
CleanupStack::PopAndDestroy(2); // bitmapGc,bitmapDevice
delete iScreenGc;
delete iScreenDevice;
iScreenDevice = NULL;
iScreenGc = NULL;
bitmap.Reset();
INFO_PRINTF2(_L("Mode %d passed bitmap drawing test\r\n"),aDispMode);
}
void CTAuto::TestGc(CFbsBitGc* aGc,const TSize& aSize)
{
aGc->SetPenStyle(CGraphicsContext::ENullPen);
aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
aGc->SetBrushColor(KRgbBlack);
aGc->DrawRect(TRect(TPoint(),iScreenDevice->SizeInPixels()));
aGc->SetPenStyle(CGraphicsContext::ESolidPen);
aGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
Colors(aGc,aSize);
Shapes(aGc,aSize);
}
void CTAuto::Colors(CFbsBitGc* aGc,const TSize& aSize)
{
TInt i=0;
TInt w=aSize.iWidth;
TInt h=aSize.iHeight;
TInt xinc = w / 16;
TInt lx = 0;
TInt rx = xinc - 1;
for(i=0;i<256;i++)
{
aGc->SetPenColor(TRgb::Gray256(i));
aGc->SetBrushColor(TRgb::Gray256(i));
aGc->DrawRect(TRect(lx,i*h/256,rx,(i+1)*h/256));
}
lx += xinc;
rx += xinc;
for(i=0;i<16;i++)
{
aGc->SetPenColor(TRgb::Gray16(i));
aGc->SetBrushColor(TRgb::Gray16(i));
aGc->DrawRect(TRect(lx,i*h/16,rx,(i+1)*h/16));
}
lx += xinc;
rx += xinc;
for(i=0;i<4;i++)
{
aGc->SetPenColor(TRgb::Gray4(i));
aGc->SetBrushColor(TRgb::Gray4(i));
aGc->DrawRect(TRect(lx,i*h/4,rx,(i+1)*h/4));
}
lx += xinc;
rx += xinc;
for(i=0;i<256;i++)
{
aGc->SetPenColor(TRgb(i,0,0));
aGc->SetBrushColor(TRgb(i,0,0));
aGc->DrawRect(TRect(lx,i*h/256,rx,(i+1)*h/256));
}
lx += xinc;
rx += xinc;
for(i=0;i<256;i++)
{
aGc->SetPenColor(TRgb(0,i,0));
aGc->SetBrushColor(TRgb(0,i,0));
aGc->DrawRect(TRect(lx,i*h/256,rx,(i+1)*h/256));
}
lx += xinc;
rx += xinc;
for(i=0;i<256;i++)
{
aGc->SetPenColor(TRgb(0,0,i));
aGc->SetBrushColor(TRgb(0,0,i));
aGc->DrawRect(TRect(lx,i*h/256,rx,(i+1)*h/256));
}
lx += xinc;
rx += xinc;
for(i=0;i<256;i++)
{
aGc->SetPenColor(TRgb::Color256(i));
aGc->SetBrushColor(TRgb::Color256(i));
aGc->DrawRect(TRect(lx,i*h/256,rx,(i+1)*h/256));
}
lx += xinc;
rx += xinc;
for(i=0;i<16;i++)
{
aGc->SetPenColor(TRgb::Color16(i));
aGc->SetBrushColor(TRgb::Color16(i));
aGc->DrawRect(TRect(lx,i*h/16,rx,(i+1)*h/16));
}
}
void CTAuto::Shapes(CFbsBitGc* aGc,const TSize& aSize)
{
aGc->SetBrushStyle(CGraphicsContext::ENullBrush);
aGc->SetPenColor(KRgbWhite);
TInt w=aSize.iWidth;
TInt h=aSize.iHeight;
CArrayFixFlat<TPoint>* poly=new(ELeave) CArrayFixFlat<TPoint>(4);
TInt a=w>>1;
TInt b=a+(a>>1);
TPoint temppt(w*5/8,h/48);
poly->AppendL(temppt);
temppt.SetXY(b-1,h*11/48);
poly->AppendL(temppt);
temppt.SetXY(a+1,h*11/48);
poly->AppendL(temppt);
temppt.SetXY(w*5/8,h/48);
poly->AppendL(temppt);
aGc->DrawPolyLine(poly);
delete poly;
aGc->DrawRect(TRect(a+1,h*7/24,b,h*12/24));
aGc->DrawRoundRect(TRect(a+1,h*13/24,b,h*18/24),TSize(w/16,h/12));
aGc->DrawEllipse(TRect(a+1,h*19/24,b,h*24/24));
aGc->DrawArc(TRect(b+1,h*1/24,w-1,h*6/24),TPoint(w*15/16,h*6/24),TPoint(w*13/16,h*6/24));
aGc->DrawPie(TRect(b+1,h*7/24,w-1,h*12/24),TPoint(w*13/16,h*7/24),TPoint(w*15/16,h*7/24));
aGc->DrawEllipse(TRect(b+1,h*13/24,w-1,h*18/24));
aGc->DrawEllipse(TRect(b+1,h*20/24,w-1,h*23/24));
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0028
@SYMDEF
@SYMTestCaseDesc Tests various graphic panics
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Starts a thread that causes various graphic panics depending on the chosen option
@SYMTestExpectedResults The thread should panic each time for each chosen option
*/
void CTAuto::TestPanics()
{
for (TInt opt = EFirst + 1; opt < ELast; opt++)
{
StartThread(opt);
INFO_PRINTF2(_L("Panic test %d passed\r\n"),opt);
}
}
void CTAuto::StartThread(TInt aOption)
{
RThread thrd;
TRequestStatus stat;
TBuf<256> threadNameBuf;
_LIT(KThreadNameFormat, "ptt%d");
threadNameBuf.Format(KThreadNameFormat, aOption);
TInt threadCreationVal = thrd.Create(threadNameBuf,PanicTestThread,KDefaultStackSize,0x2000,0x20000,(TAny*)aOption);
TEST(threadCreationVal==KErrNone);
thrd.SetPriority(EPriorityMuchMore);
thrd.Logon(stat);
User::SetJustInTime(EFalse);
thrd.Resume();
User::WaitForRequest(stat);
thrd.Close();
User::SetJustInTime(ETrue);
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0029
@SYMDEF
@SYMTestCaseDesc tests fading functionality
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Tests fading functionality by drawing two rectangles with different alpha values and compares the results
@SYMTestExpectedResults the two bitmaps should be identical after the operations
*/
void CTAuto::TestFadingL()
{
TBool res = EFalse;
TRect rectbitmap1(0,0,100,50);
TRect rectbitmap2(25,0,75,100);
CFbsBitmap* bitmap=new(ELeave) CFbsBitmap;
CleanupStack::PushL(bitmap);
User::LeaveIfError(bitmap->Create(TSize(100,100), EColor64K));
CFbsBitmapDevice* device=CFbsBitmapDevice::NewL(bitmap);
CleanupStack::PushL(device);
CFbsBitGc* gc;
User::LeaveIfError(device->CreateContext(gc));
CleanupStack::PushL(gc);
CFbsBitmap* bitmap2=new(ELeave) CFbsBitmap;
CleanupStack::PushL(bitmap2);
User::LeaveIfError(bitmap2->Create(TSize(100,100), EColor64K));
CFbsBitmapDevice* device2=CFbsBitmapDevice::NewL(bitmap2);
CleanupStack::PushL(device2);
CFbsBitGc* gc2;
User::LeaveIfError(device2->CreateContext(gc2));
CleanupStack::PushL(gc2);
gc->SetBrushStyle(CGraphicsContext::ESolidBrush);
gc->SetPenColor(TRgb(0,0,0,0));
//Draws rectangle with Alpha Value 0 when Fading is turned OFF
gc->SetBrushColor(TRgb(0,0,255,255));
gc->DrawRect(rectbitmap2);
//Draws rectangle with Alpha Value 255 when Fading is turned OFF
gc->SetBrushColor(TRgb(255,0,0,0));
gc->DrawRect(rectbitmap1);
gc2->SetBrushStyle(CGraphicsContext::ESolidBrush);
gc2->SetPenColor(TRgb(0,0,0,0));
//Draws rectangle with Alpha Value 255 when Fading is turned OFF
gc2->SetBrushColor(TRgb(0,0,255,255));
gc2->DrawRect(rectbitmap2);
//Draws rectangle with Alpha Value 0 when Fading is turned ON
//Fade Option Turned ON
gc2->SetFaded(ETrue);
gc2->SetBrushColor(TRgb(255,0,0,0));
gc2->DrawRect(rectbitmap1);
TRect rect(0,0,100,100);
res = device->RectCompare(rect,*device2,rect);
CleanupStack::PopAndDestroy(6, bitmap);
TEST(res);
}
TInt PanicTestThread(TAny* aOption)
{
CTrapCleanup::New();
RFbsSession::Connect();
CFbsScreenDevice* screendevice=NULL;
CFbsBitGc* bitgc=NULL;
CPolygonFiller* polyfill=NULL;
RRegion region;
const TInt option = TInt(aOption);
TInt ret;
switch (option)
{
case EPolygonFiller:
polyfill=(CPolygonFiller*)User::Alloc(sizeof(CPolygonFiller));
new(polyfill) CPolygonFiller;
break;
case EDrawBmp1:
case EDrawBmp2:
case EDrawBmp3:
case EDrawText1:
case EDrawText2:
case EDrawText3:
TRAP(ret,screendevice=CFbsScreenDevice::NewL(_L("scdv"),EColor256));
if (ret == KErrNotSupported)
TRAP(ret,screendevice=CFbsScreenDevice::NewL(_L("scdv"),EGray4));
if (ret == KErrNotSupported)
TRAP(ret,screendevice=CFbsScreenDevice::NewL(_L("scdv"),EColor4K));
if (ret != KErrNone)
User::Panic(_L("screendevice failed"),ret);
screendevice->CreateContext((CGraphicsContext*&)bitgc);
break;
case EGcDevice1:
case EGcDevice2:
case EGcRegion1:
case EGcRegion2:
case EUseBrush1:
case EUseBrush2:
case EUseBrush3:
case EUseFont:
TRAP(ret,bitgc=CFbsBitGc::NewL());
break;
};
switch (option)
{
case EPolygonFiller:
polyfill->Construct(NULL,CGraphicsContext::EAlternate);
break;
case EBitmapDevice:
(void)CFbsBitmapDevice::NewL(NULL);
break;
case EDrawBmp1:
bitgc->DrawBitmap(TPoint(0,0),NULL);
break;
case EDrawBmp2:
bitgc->DrawBitmap(TRect(0,0,0,0),NULL);
break;
case EDrawBmp3:
bitgc->DrawBitmap(TRect(0,0,0,0),NULL,TRect(0,0,0,0));
break;
case EGcDevice1:
bitgc->Resized();
break;
case EGcDevice2:
bitgc->MapColors(TRect(0,0,0,0),NULL,0,EFalse);
break;
case EGcRegion1:
region.ForceError();
bitgc->SetClippingRegion(®ion);
break;
case EGcRegion2:
region.AddRect(TRect(-1,-1,1,1));
bitgc->SetClippingRegion(®ion);
break;
case EUseBrush1:
bitgc->UseBrushPattern(NULL);
break;
case EUseBrush2:
bitgc->UseBrushPattern((CFbsBitmap*)bitgc);
break;
case EUseBrush3:
bitgc->UseBrushPattern(0);
break;
case EUseFont:
bitgc->UseFont(NULL);
break;
case EDrawText1:
bitgc->DrawText(_L("abc"),TPoint(0,0));
break;
case EDrawText2:
bitgc->DrawText(_L("abc"),TRect(0,0,1,1),0,0);
break;
case EDrawText3:
bitgc->DrawTextVertical(_L("abc"),EFalse);
break;
default:
User::Panic(_L("Default panic"),KErrGeneral);
};
return KErrNone;
}
//-------
__CONSTRUCT_STEP__(Auto)
void CTAutoStep::TestSetupL()
{
FbsStartup();
User::LeaveIfError(RFbsSession::Connect());
}
void CTAutoStep::TestClose()
{
RFbsSession::Disconnect();
}