s4 should be locksurface2 according to JM's spreadsheet, and the spec indicates 2 is a clarification of 1, so we can't offer both
// 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 <bitdev.h>
#include <hal.h>
#include "TBMP.H"
#include "TClip.h"
#include <graphics/fbsdefs.h>
//Note: Some display modes will be scaled - see
//CreateTestEnvironment(), SetScalingFactor() call
//aTestAppNo is a new argument and it is not used yet.
//It can have 0 or 1 value depending on which test app
//uses TestClip functionality - TClip or TClip2.
CTClip::CTClip(CTestStep* aStep,
TInt aTestAppNo,
CFbsScreenDevice* aDev,
CFbsBitGc* aCon,
CFbsBitmap* aBmp,
CFbsFont* aFont,
CFbsFont* aLargeFont):
CTGraphicsBase(aStep),
iTestAppNo(aTestAppNo),
iDev(aDev),
iCon(aCon),
iClientRect(TRect(0,0,0,0)),
iGopNum(EFirstGop),
iClipList(NULL),
iBitmap(aBmp),
iBitmap64K(NULL),
iBitmap16MU(NULL),
iBitmap16MA(NULL),
iBitmapMask(NULL),
iBitmapAlpha(NULL),
iFont(aFont),
iLargeFont(aLargeFont),
iBmpSize(TSize(0,0))
{}
void CTClip::ConstructL()
{
iClipList=(TRect*)User::Alloc(sizeof(TRect)*ERegions);
if(!iClipList)
User::Panic(_L("Construct failure"),KErrGeneral);
iBmpSize=iBitmap->SizeInPixels();
iBitmap64K=new(ELeave) CFbsBitmap();
iBitmap16MU=new(ELeave) CFbsBitmap();
iBitmap16MA=new(ELeave) CFbsBitmap();
iBitmapMask=new(ELeave) CFbsBitmap();
iBitmapAlpha=new(ELeave) CFbsBitmap();
}
TBool CTClip::SetUpTest(TInt &aTestModeIndex)
{
CFbsBitGc::TGraphicsOrientation orientation;
do
{
orientation=(CFbsBitGc::TGraphicsOrientation)(aTestModeIndex/2);
if (orientation>CFbsBitGc::EGraphicsOrientationRotated270)
return(EFalse);
aTestModeIndex++;
TPoint scalingOrigin(0,0);
TInt scale=1;
if ((aTestModeIndex&0x1)==CFbsBitGc::EGraphicsOrientationNormal)
{
scalingOrigin=TPoint(20, 10);
scale=2;
}
iDev->SetScalingFactor(scalingOrigin, scale, scale, 1, 1);
} while(!iCon->SetOrientation(orientation));
iDev->GetDrawRect(iClientRect);
TInt dims[2*ERegions]={0,0, 1,1, 1,2, 2,1, 2,2, 1,10, 10,1, 2,10, 10,2, 10,10};
for(TUint count=0;count<ERegions;count++)
{
iClipList[count].iTl.iX=iClientRect.iBr.iX*2/3;
iClipList[count].iTl.iY=iClientRect.iBr.iY/3;
iClipList[count].iBr.iX=iClipList[count].iTl.iX+dims[count*2];
iClipList[count].iBr.iY=iClipList[count].iTl.iY+dims[count*2+1];
}
iDev->SetAutoUpdate(ETrue);
iCon->SetPenStyle(CGraphicsContext::ESolidPen);
iCon->SetPenColor(KRgbBlack);
iCon->SetBrushStyle(CGraphicsContext::ESolidBrush);
iCon->SetBrushColor(TRgb(170,170,170));
Clear();
iCon->UseBrushPattern(iBitmap);
TSize halfScreen(iClientRect.Width()/2-2, iClientRect.Height()-2);
User::LeaveIfError(iBitmap64K->Load(_L("z:\\system\\data\\16ram.mbm"),0,EFalse));
User::LeaveIfError(iBitmap64K->Resize(halfScreen));
User::LeaveIfError(iBitmap16MU->Load(_L("z:\\system\\data\\32ram.mbm"),0,EFalse));
User::LeaveIfError(iBitmap16MU->Resize(halfScreen));
User::LeaveIfError(iBitmap16MA->Load(_L("z:\\system\\data\\32ram.mbm"),0,EFalse));
User::LeaveIfError(iBitmap16MA->Resize(halfScreen));
User::LeaveIfError(iBitmapMask->Create(halfScreen, EGray2));
User::LeaveIfError(iBitmapAlpha->Create(halfScreen, EGray256));
return(ETrue);
}
inline CTClipStep* CTClip::Step()
{
return static_cast<CTClipStep*>(iStep);
}
void CTClip::Clear()
{
iCon->SetPenStyle(CGraphicsContext::ENullPen);
iCon->SetBrushColor(KRgbWhite);
iCon->DrawRect(iClientRect);
iCon->SetPenStyle(CGraphicsContext::ESolidPen);
iCon->SetBrushColor(TRgb(170,170,170));
}
CTClip::~CTClip()
{
for(TInt i=0;i<ERegions;i++)
{
iClipList[i].~TRect();
}
User::Free(iClipList);
delete iBitmap64K;
delete iBitmap16MU;
delete iBitmapMask;
delete iBitmapAlpha;
delete iBitmap16MA;
}
void CTClip::RunTestCaseL(const TInt aCurTestCase)
{
((CTClipStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
switch(aCurTestCase)
{
case 1:
((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0042"));
TestComplexRgn();
INFO_PRINTF1(_L("Complex Rgn Test complete"));
break;
case 2:
((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0038"));
TestRectRgn();
INFO_PRINTF1(_L("Rect Rgn Test complete"));
break;
case 3:
#if !defined(__X86GCC__) //Tests take too long to run and don't test anything useful anyway
((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0039"));
TestSimpleRgn();
INFO_PRINTF1(_L("Simple Rgn Test complete"));
break;
case 4:
((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0041"));
TestHoriRgn();
INFO_PRINTF1(_L("Horizontal Rgn Test complete"));
break;
case 5:
((CTClipStep*)iStep)->SetTestStepID(_L("GRAPHICS-BITGDI-0040"));
TestVertRgn();
INFO_PRINTF1(_L("Vertical Rgn Test complete"));
break;
case 6:
#endif //__X86GCC__
((CTClipStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
((CTClipStep*)iStep)->CloseTMSGraphicsStep();
INFO_PRINTF1(_L("Test complete\n"));
TestComplete();
break;
}
((CTClipStep*)iStep)->RecordTestResultL();
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0038
@SYMDEF
@SYMTestCaseDesc Tests clipping to a rect region
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Iterates through a number of regions and graphic operations testing clipping with each
@SYMTestExpectedResults Test should perform graphics operations succesfully.
*/
void CTClip::TestRectRgn()
{
TInt testMode=0;
while(SetUpTest(testMode))
{
for(TUint j=0;j<ERegions;j++)
{
TRect reg=iClipList[j];
for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
{
RRegion rectreg(reg);
DrawToScreen(rectreg,iClientRect);
rectreg.Close();
ScanArea(iClientRect.iBr.iX/2,iClientRect.iTl.iY,iClientRect.iBr.iX/2,reg.iTl.iY-iClientRect.iTl.iY); // above
ScanArea(iClientRect.iBr.iX/2,reg.iTl.iY,reg.iTl.iX-iClientRect.iBr.iX/2,reg.Height()); // left
ScanArea(reg.iBr.iX,reg.iTl.iY,iClientRect.iBr.iX-reg.iBr.iX,reg.Height()); // right
ScanArea(iClientRect.iBr.iX/2,reg.iBr.iY,iClientRect.iBr.iX/2,iClientRect.iBr.iY-reg.iBr.iY); // below
CheckInside(reg,iClientRect);
}
}
}
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0039
@SYMDEF
@SYMTestCaseDesc Tests clipping to a simple region
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Iterates through a number of simple regions and graphic operations testing clipping with each
@SYMTestExpectedResults Test should perform graphics operations succesfully.
*/
void CTClip::TestSimpleRgn()
{
TInt testMode=0;
while(SetUpTest(testMode))
{
for(TUint j=0;j<ERegions;j++)
{
TRect reg=iClipList[j];
for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
{
DrawToScreen(reg,iClientRect);
ScanArea(iClientRect.iBr.iX/2,iClientRect.iTl.iY,iClientRect.iBr.iX/2,reg.iTl.iY); // above
ScanArea(iClientRect.iBr.iX/2,reg.iTl.iY,reg.iTl.iX-iClientRect.iBr.iX/2,reg.Height()); // left
ScanArea(reg.iBr.iX,reg.iTl.iY,iClientRect.iBr.iX-reg.iBr.iX,reg.Height()); // right
ScanArea(iClientRect.iBr.iX/2,reg.iBr.iY,iClientRect.iBr.iX/2,iClientRect.iBr.iY-reg.iBr.iY); // below
CheckInside(reg,iClientRect);
}
}
}
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0040
@SYMDEF
@SYMTestCaseDesc Tests clipping to a vertical region
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Iterates through a number of regions of different widths and graphic operations testing clipping with each
@SYMTestExpectedResults Test should perform graphics operations succesfully.
*/
void CTClip::TestVertRgn()
{
TInt widths[3]={1,2,5};
TInt testMode=0;
while(SetUpTest(testMode))
{
for(TInt count=0;count<3;count++) // check vertical strips
{
TInt i=widths[count];
for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
{
for(TInt j=0;j<iClientRect.iBr.iX/2-i;j+=35)
{
TRect reg=TRect(iClientRect.iBr.iX/2+j,iClientRect.iTl.iY,iClientRect.iBr.iX/2+j+i,iClientRect.iBr.iY);
RRegion rectreg(reg);
DrawToScreen(rectreg,iClientRect);
rectreg.Close();
ScanArea(iClientRect.iBr.iX/2,reg.iTl.iY,reg.iTl.iX-iClientRect.iBr.iX/2,reg.Height()); // left
ScanArea(reg.iBr.iX,reg.iTl.iY,iClientRect.iBr.iX-reg.iBr.iX,reg.Height()); // right
CheckInside(reg,iClientRect);
}
}
}
}
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0041
@SYMDEF
@SYMTestCaseDesc Tests clipping to a horizontal region
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Iterates through a number of regions of different widths and graphic operations testing clipping with each
@SYMTestExpectedResults Test should perform graphics operations succesfully.
*/
void CTClip::TestHoriRgn()
{
TInt widths[3]={1,2,5};
TInt testMode=0;
while(SetUpTest(testMode))
{
for(TInt count=0;count<3;count++) // check horizontal strips
{
TInt i=widths[count];
for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
{
for(TInt j=0;j<iClientRect.iBr.iY;j+=35)
{
TRect reg=TRect(iClientRect.iBr.iX/2,j,iClientRect.iBr.iX,j+i);
RRegion rectreg(reg);
DrawToScreen(rectreg,iClientRect);
rectreg.Close();
ScanArea(iClientRect.iBr.iX/2,iClientRect.iTl.iY,iClientRect.iBr.iX/2,reg.iTl.iY); // above
ScanArea(iClientRect.iBr.iX/2,reg.iBr.iY,iClientRect.iBr.iX/2,iClientRect.iBr.iY-reg.iBr.iY); // below
CheckInside(reg,iClientRect);
}
}
}
}
}
/**
@SYMTestCaseID GRAPHICS-BITGDI-0042
@SYMDEF
@SYMTestCaseDesc Tests clipping to a complex region
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Creates a complex region then iterates through graphic operations testing clipping with each
@SYMTestExpectedResults Test should perform graphics operations succesfully.
*/
void CTClip::TestComplexRgn()
{
TInt testMode=0;
while(SetUpTest(testMode))
{
TRect rect[8];
rect[0].SetRect(iClientRect.iBr.iX*12/20,0,iClientRect.iBr.iX*15/20,iClientRect.iBr.iY/4);
rect[1].SetRect(iClientRect.iBr.iX*11/20,iClientRect.iBr.iY/8,iClientRect.iBr.iX*13/20,iClientRect.iBr.iY/2);
rect[2].SetRect(iClientRect.iBr.iX*14/20,iClientRect.iBr.iY/8,iClientRect.iBr.iX*17/20,iClientRect.iBr.iY/2);
rect[3].SetRect(iClientRect.iBr.iX*12/20,iClientRect.iBr.iY*3/8,iClientRect.iBr.iX*18/20,iClientRect.iBr.iY*5/8);
rect[4].SetRect(iClientRect.iBr.iX*13/20,iClientRect.iBr.iY*9/16,iClientRect.iBr.iX*19/20,iClientRect.iBr.iY*7/8);
rect[5].SetRect(iClientRect.iBr.iX*17/20,iClientRect.iBr.iY*3/4,iClientRect.iBr.iX,iClientRect.iBr.iY);
rect[6].SetRect(iClientRect.iBr.iX*11/20,iClientRect.iBr.iY*5/8,iClientRect.iBr.iX*11/20+1,iClientRect.iBr.iY*5/8+1);
rect[7].SetRect(iClientRect.iBr.iX*18/20,iClientRect.iBr.iY/8,iClientRect.iBr.iX*18/20,iClientRect.iBr.iY/8);
TRect space[12];
space[0].SetRect(iClientRect.iBr.iX/2,0,rect[1].iTl.iX,rect[1].iBr.iY);
space[1].SetRect(space[0].iBr.iX,0,rect[0].iTl.iX,rect[1].iTl.iY);
space[2].SetRect(rect[0].iBr.iX,0,rect[2].iBr.iX,rect[2].iTl.iY);
space[3].SetRect(rect[2].iBr.iX,0,iClientRect.iBr.iX,rect[3].iTl.iY);
space[4].SetRect(rect[1].iBr.iX,rect[0].iBr.iY,rect[2].iTl.iX,rect[3].iTl.iY);
space[5].SetRect(iClientRect.iBr.iX/2,rect[1].iBr.iY,rect[3].iTl.iX,rect[6].iTl.iY);
space[6].SetRect(iClientRect.iBr.iX/2,rect[6].iTl.iY,rect[6].iTl.iX,rect[6].iBr.iY);
space[7].SetRect(iClientRect.iBr.iX/2,rect[6].iBr.iY,rect[6].iBr.iX,iClientRect.iBr.iY);
space[8].SetRect(rect[6].iBr.iX,rect[6].iTl.iY,rect[4].iTl.iX,iClientRect.iBr.iY);
space[9].SetRect(rect[4].iTl.iX,rect[4].iBr.iY,rect[5].iTl.iX,iClientRect.iBr.iY);
space[10].SetRect(rect[4].iBr.iX,rect[4].iTl.iY,iClientRect.iBr.iX,rect[5].iTl.iY);
space[11].SetRect(rect[3].iBr.iX,rect[3].iTl.iY,iClientRect.iBr.iX,rect[4].iTl.iY);
RRegion creg(rect[0],8);
creg.AddRect(rect[1]);
creg.AddRect(rect[2]);
creg.AddRect(rect[3]);
creg.AddRect(rect[4]);
creg.AddRect(rect[5]);
creg.AddRect(rect[6]);
creg.AddRect(rect[7]);
for(iGopNum=EFirstGop+1;iGopNum<EGraphicsOps;iGopNum++)
{
DrawToScreen(creg,iClientRect);
TInt count=0;
for(;count<8;count++)
CheckInside(rect[count],iClientRect);
for(count=0;count<12;count++)
ScanArea(space[count].iTl.iX,space[count].iTl.iY,space[count].iBr.iX-space[count].iTl.iX,space[count].iBr.iY-space[count].iTl.iY);
}
creg.Close();
}
}
void CTClip::ScanArea(TInt x,TInt y,TInt length,TInt height)
{
if (length<1 || height<1)
{
return;
}
HBufC8* buf = HBufC8::NewL(length * 4);
TPtr8 des = buf->Des();
for (TInt row=0; row<height; row++)
{
TPoint point(x, y+row);
des.Zero();
iDev->GetScanLine(des,point,length,EColor16MA);
for(TInt i=0; i<des.Length(); i++)
{
if(des[i] != 0xFF)
{
INFO_PRINTF1(_L("Clipping failure outside!\n"));
INFO_PRINTF2(_L("Graphics operation: %d\n"),iGopNum);
INFO_PRINTF5(_L("x=%d, y=%d, length=%d, height=%d\n"),x,y,length,height);
INFO_PRINTF3(_L("Index=%d, Found=%x, Expected=0xFF\n"),i,des[i]);
TEST(0);
delete buf;
return;
}
}
}
delete buf;
}
void CTClip::CheckInside(const TRect& aClip,const TRect& aRect)
{
const TInt length=aClip.Width();
const TInt unOffsetX=-(aRect.iBr.iX/2);
#if defined(__X86GCC__) || defined(__MARM__)
const TInt KMaxLinesToPrint=2;
#else
const TInt KMaxLinesToPrint=10;
#endif
HBufC8* unBuf = HBufC8::NewL(length * 4);
HBufC8* clBuf = HBufC8::NewL(length * 4);
TPtr8 unDes = unBuf->Des();
TPtr8 clDes = clBuf->Des();
TInt linesDiffs=0;
for (TUint yy=aClip.iTl.iY; yy<aClip.iBr.iY; yy++)
{
TPoint unPoint(aClip.iTl.iX+unOffsetX, yy);
TPoint clPoint(aClip.iTl.iX, yy);
unDes.Zero();
clDes.Zero();
iDev->GetScanLine(unDes,unPoint,length,EColor16MA);
iDev->GetScanLine(clDes,clPoint,length,EColor16MA);
TInt different = unDes.Compare(clDes);
if (different)
{
if (linesDiffs++<KMaxLinesToPrint)
{
_LIT(KDots,"..");
_LIT(KStart,"|.");
_LIT(KEnd,".|");
const TInt KMaxNumBytesToLog=14;
TBuf<8*KMaxNumBytesToLog> buf1,buf2;
TInt end=Min(length,KMaxNumBytesToLog);
end*=4;
TInt ii;
TInt matches=ETrue;
for (ii=0; ii<end; ++ii)
{
_LIT(KHex,"%02x");
buf1.AppendFormat(KHex,unDes[ii]);
if (unDes[ii]!=clDes[ii])
{
buf2.AppendFormat(KHex,clDes[ii]);
matches=EFalse;
}
else
{ //Show each pixel as |......| on the 2nd line if it matches
TPtrC ptr(KDots);
switch (ii%4)
{
case 0:
ptr.Set(KStart);
break;
case 3:
ptr.Set(KEnd);
break;
}
buf2.Append(ptr);
}
}
TBuf<256> buf;
if (!matches)
{
_LIT(KLog,"ClipRect (%d,%d,%d,%d) Row=%d (First %d of %d pixels shown, only differing values shown on comparison line)");
buf.Format(KLog,aClip.iTl.iX,aClip.iTl.iY,aClip.iBr.iX,aClip.iBr.iY,yy,end,aClip.Width());
INFO_PRINTF1(buf);
INFO_PRINTF1(buf1);
INFO_PRINTF1(buf2);
}
else
{
_LIT(KLog,"ClipRect (%d,%d,%d,%d) Row=%d (First %d of %d pixels all match)");
buf.Format(KLog,aClip.iTl.iX,aClip.iTl.iY,aClip.iBr.iX,aClip.iBr.iY,yy,end,aClip.Width());
INFO_PRINTF1(buf);
}
}
}
}
if (linesDiffs>0)
{
_LIT(KLog,"Clipping failure inside! Graphics operation: %d Lines With Diffs: %d/%d");
INFO_PRINTF4(KLog,iGopNum,linesDiffs,aClip.iBr.iY-aClip.iTl.iY);
}
if (!Step()->IgnoreDiffs())
TEST(linesDiffs==0);
delete unBuf;
delete clBuf;
}
void CTClip::DrawToScreen(TRegion& clip_reg,TRect r)
{
Clear();
TRect halfWid(r);
halfWid.iBr.iX=halfWid.iBr.iX/2;
iCon->SetClippingRect(halfWid);
DoDraw(r,EFalse);
iCon->CancelClippingRect();
iCon->SetClippingRegion(&clip_reg);
iCon->SetOrigin(TPoint(r.iBr.iX/2,0));
DoDraw(r,ETrue);
iCon->CancelClippingRegion();
iCon->SetOrigin(TPoint(0,0));
}
void CTClip::DrawToScreen(const TRect& cliprect,TRect r)
{
Clear();
TRect halfWid(r);
halfWid.iBr.iX=halfWid.iBr.iX/2;
iCon->SetClippingRect(halfWid);
DoDraw(r,EFalse);
iCon->SetClippingRect(cliprect);
iCon->SetOrigin(TPoint(r.iBr.iX/2,0));
DoDraw(r,ETrue);
iCon->CancelClippingRect();
iCon->SetOrigin(TPoint(0,0));
}
void CTClip::DoDraw(TRect r,TBool clipped)
{
TRect sh;
TPoint p,z;
switch(iGopNum)
{
case EPlot:
iCon->Plot(TPoint(r.iBr.iX/6-10,r.iBr.iY/3-10));
iCon->Plot(TPoint(r.iBr.iX/6,r.iBr.iY/3));
break;
case EDrawLine:
p.SetXY(r.iBr.iX/2-1,r.iBr.iY+1);
iCon->DrawLine(z,p);
break;
case EDottedLine:
p.SetXY(r.iBr.iX/2-1,r.iBr.iY+1);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->DrawLine(z,p);
break;
case EDashedLine:
p.SetXY(r.iBr.iX/2-1,r.iBr.iY+1);
iCon->SetPenStyle(CGraphicsContext::EDashedPen);
iCon->DrawLine(z,p);
break;
case EWideLine:
p.SetXY(r.iBr.iX/2-11,r.iBr.iY-9);
iCon->SetPenSize(TSize(5,5));
iCon->DrawLine(z,p);
break;
case EDrawArc:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
p.SetXY(r.iBr.iX/2-1,0);
iCon->DrawArc(sh,z,p);
break;
case EDottedArc:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
p.SetXY(r.iBr.iX/2-1,0);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->DrawArc(sh,z,p);
break;
case EDrawRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->DrawRect(sh);
break;
case EVerticalHatchRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EVerticalHatchBrush);
iCon->DrawRect(sh);
break;
case EForwardDiagonalHatchRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EForwardDiagonalHatchBrush);
iCon->DrawRect(sh);
break;
case EHorizontalHatchRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EHorizontalHatchBrush);
iCon->DrawRect(sh);
break;
case ERearwardDiagonalHatchRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::ERearwardDiagonalHatchBrush);
iCon->DrawRect(sh);
break;
case ESquareCrossHatchRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
iCon->DrawRect(sh);
break;
case EDiamondCrossHatchRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
iCon->DrawRect(sh);
break;
case EVerticalHatchEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EVerticalHatchBrush);
iCon->DrawEllipse(sh);
break;
case EForwardDiagonalHatchEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EForwardDiagonalHatchBrush);
iCon->DrawEllipse(sh);
break;
case EHorizontalHatchEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EHorizontalHatchBrush);
iCon->DrawEllipse(sh);
break;
case ERearwardDiagonalHatchEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::ERearwardDiagonalHatchBrush);
iCon->DrawEllipse(sh);
break;
case ESquareCrossHatchEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
iCon->DrawEllipse(sh);
break;
case EDiamondCrossHatchEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
iCon->DrawEllipse(sh);
break;
case EDottedRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->DrawRect(sh);
break;
case ECopyRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
if(clipped)
{
iCon->SetOrigin(z);
iCon->CopyRect(TPoint(r.iBr.iX/2,0),sh);
}
else
iCon->DrawRect(sh);
break;
case EDrawEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->DrawEllipse(sh);
break;
case EDottedEllipse:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->DrawEllipse(sh);
break;
case EDrawRoundRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
p.SetXY(r.iBr.iX>>2,r.iBr.iY>>4);
iCon->DrawRoundRect(sh,p.AsSize());
break;
case EDottedRoundRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
p.SetXY(r.iBr.iX>>2,r.iBr.iY>>4);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->DrawRoundRect(sh,p.AsSize());
break;
case EDrawPie:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
p.SetXY(r.iBr.iX/2-1,0);
iCon->DrawPie(sh,z,p);
break;
case EDottedPie:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
p.SetXY(r.iBr.iX/2-1,0);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->DrawPie(sh,z,p);
break;
case EDrawPolygon:
{
CArrayFixFlat<TPoint>* t=new CArrayFixFlat<TPoint>(3);
TPoint temp(r.iBr.iX/6,r.iBr.iY/4);
TRAPD(errCode, t->AppendL(temp));
if(errCode != KErrNone)
{
return;
}
temp.SetXY(r.iBr.iX/12,r.iBr.iY/2);
TRAP(errCode, t->AppendL(temp));
if(errCode != KErrNone)
{
return;
}
temp.SetXY(r.iBr.iX/4,r.iBr.iY/2);
TRAP(errCode, t->AppendL(temp));
if(errCode != KErrNone)
{
return;
}
iCon->DrawPolygon(t);
delete t;
}
break;
case EDrawText:
{
iCon->UseFont(iFont);
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
iCon->DrawText(testtext,p);
}
break;
case EBoxText:
{
iCon->UseFont(iFont);
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
TInt ascent=iFont->AscentInPixels();
TInt height=iFont->HeightInPixels();
TInt width=iFont->TextWidthInPixels(testtext);
TRect box(p.iX,p.iY,p.iX+width,p.iY+height);
iCon->DrawText(testtext,box,ascent);
}
break;
case EDrawTextVertical:
iCon->UseFont(iFont);
p.SetXY(r.iBr.iX/6-13,r.iBr.iY/3+5);
p.iX+=5;
p.iY-=10;
iCon->DrawTextVertical(testtext,p,EFalse);
break;
case ELargeText:
iCon->UseFont(iLargeFont);
p.SetXY(r.iBr.iX/6-13,r.iBr.iY/3+5);
iCon->DrawText(largetesttext,p);
break;
case ELargeBoxText:
{
iCon->UseFont(iLargeFont);
p.SetXY(r.iTl.iX, r.iTl.iY);
TInt ascent=iLargeFont->AscentInPixels();
TInt height=iLargeFont->HeightInPixels();
TInt width=iLargeFont->TextWidthInPixels(largetesttext);
TRect box(p.iX, p.iY, p.iX+width, p.iY+height);
iCon->DrawText(largetesttext,box,ascent);
}
break;
case ELargeTextVertical:
iCon->UseFont(iLargeFont);
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
iCon->DrawTextVertical(largetesttext,p,EFalse);
break;
case EPaintRect:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->SetBrushStyle(CGraphicsContext::EPatternedBrush);
iCon->DrawRect(sh);
break;
case EBitBltContext:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
if(clipped)
{
iCon->SetPenStyle(CGraphicsContext::ESolidPen);
iCon->SetBrushStyle(CGraphicsContext::ESolidBrush);
iCon->BitBlt(z,*iCon,sh);
}
else
{
iCon->SetPenStyle(CGraphicsContext::EDottedPen);
iCon->SetBrushStyle(CGraphicsContext::EPatternedBrush);
iCon->DrawRect(sh);
}
break;
case EBitmapLarge:
sh.SetRect(0,0,r.iBr.iX/2-1,r.iBr.iY);
iCon->DrawBitmap(sh,iBitmap);
break;
case EBitmapSmall:
p.SetXY(r.iBr.iX/6-40,r.iBr.iY/3-20);
sh.SetRect(p,TSize(iBitmap->SizeInPixels().iWidth/2,iBitmap->SizeInPixels().iHeight/2));
iCon->DrawBitmap(sh,iBitmap);
break;
case EBitBltBitmap:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
iCon->BitBlt(p,iBitmap64K);
break;
case EDrawBitmap:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(p,iBitmap64K->SizeInPixels());
iCon->DrawBitmap(sh,iBitmap);
break;
case EBitBltMasked:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
iCon->BitBltMasked(p,iBitmap,sh,iBitmap,ETrue);
break;
case EBitBltMaskedBinary:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap,sh,iBitmapMask,EFalse);
break;
case EBitBltMaskedBinary64K:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap64K,sh,iBitmapMask,EFalse);
break;
case EBitBltMaskedBinary16MU:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap16MU->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap16MU,sh,iBitmapMask,EFalse);
break;
case EBitBltMaskedBinary16MA:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap16MA->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap16MA,sh,iBitmapMask,EFalse);
break;
case EBitBltMaskedAlpha:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap,sh,iBitmapAlpha,EFalse);
break;
case EBitBltMaskedAlpha64K:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap64K->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap64K,sh,iBitmapAlpha,EFalse);
break;
case EBitBltMaskedAlpha16MU:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap16MU->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap16MU,sh,iBitmapAlpha,EFalse);
break;
case EBitBltMaskedAlpha16MA:
p.SetXY(r.iTl.iX+1, r.iTl.iY+1);
sh.SetRect(TPoint(0,0),iBitmap16MA->SizeInPixels());
iCon->SetBrushStyle(CGraphicsContext::ENullBrush);
iCon->BitBltMasked(p,iBitmap16MA,sh,iBitmapAlpha,EFalse);
break;
}
iCon->SetPenStyle(CGraphicsContext::ESolidPen);
iCon->SetPenSize(TSize(1,1));
iCon->SetBrushStyle(CGraphicsContext::ESolidBrush);
}
//--------------
CTClipStep::CTClipStep() :iIgnoreDiffs(EFalse)
{
SetTestStepName(KTClipStep);
}
CTClipStep::~CTClipStep()
{
DestroyTestEnvironment();
}
inline TBool CTClipStep::IgnoreDiffs()
{
return iIgnoreDiffs;
}
CTGraphicsBase* CTClipStep::CreateTestL()
{
_LIT(KLog,"Create CTClip");
INFO_PRINTF1(KLog);
return new (ELeave) CTClip(this, iTestAppNo, iDev, iGc, iBmp, iFont, iLargeFont);
}
void CTClipStep::TestSetupL()
{
FbsStartup();
RFbsSession::Connect();
CreateTestEnvironment();
}
void CTClipStep::TestClose()
{
DestroyTestEnvironment();
RFbsSession::Disconnect();
}
TInt CTClipStep::CreateScreenDevice(TDisplayMode aMode)
{
TRAPD(err,iDev=CFbsScreenDevice::NewL(KNullDesC,aMode));
const TPtrC modeName=CTGraphicsBase::ColorModeName(aMode);
if (err==KErrNone)
{
_LIT(KLog,"Sucessfully created Screen Device, mode %S");
INFO_PRINTF2(KLog,&modeName);
}
else
{
if (err==KErrNotSupported)
{
_LIT(KLog,"Screen Device with mode %S not available on this device");
INFO_PRINTF2(KLog,&modeName);
}
else
{
_LIT(KLog,"Failed to created Screen Device with mode %S err=%d");
INFO_PRINTF3(KLog,&modeName,err);
}
}
return err;
}
void CTClipStep::CreateTestEnvironment()
{
iDev=NULL;
//This test will fail if any display mode other than EColor64K, EColor256, EGray256
//is selected
TInt ret=CreateScreenDevice(EColor64K);
if (ret!=KErrNone)
ret=CreateScreenDevice(EColor256);
if (ret!=KErrNone)
ret=CreateScreenDevice(EGray256);
if (ret!=KErrNone)
ret=CreateScreenDevice(EColor16MU);
if (ret!=KErrNone)
ret=CreateScreenDevice(EColor16M);
if (ret!=KErrNone)
ret=CreateScreenDevice(EColor4K);
if (ret!=KErrNone)
{
ret=CreateScreenDevice(EColor16MA);
if (ret==KErrNone)
{
iIgnoreDiffs=ETrue;
_LIT(KLog,"Ignore Diffs set to %d (ETrue?)");
INFO_PRINTF2(KLog,iIgnoreDiffs);
}
}
if (ret!=KErrNone)
{
ret=CreateScreenDevice(EColor16MAP);
if (ret==KErrNone)
{
iIgnoreDiffs=ETrue;
_LIT(KLog,"Ignore Diffs set to %d (ETrue?)");
INFO_PRINTF2(KLog,iIgnoreDiffs);
}
}
if(ret!=KErrNone)
User::Panic(_L("Device not created"),ret);
iDev->ChangeScreenDevice(NULL);
iGc=NULL;
ret=iDev->CreateContext(iGc);
if(iGc==NULL)
User::Panic(_L("Context not created"),KErrGeneral);
iGc->Activate(iDev);
iFont=NULL;
TFontSpec fs(_L("Swiss"),12);
ret=iDev->GetNearestFontToDesignHeightInPixels(iFont,fs);
if(ret!=KErrNone)
User::Panic(_L("Font not created"),KErrGeneral);
iLargeFont=NULL;
fs.iHeight=100;
ret=iDev->GetNearestFontToDesignHeightInPixels(iLargeFont,fs);
if(ret!=KErrNone)
User::Panic(_L("Font not created"),KErrGeneral);
iBmp=new CFbsBitmap;
if(iBmp==NULL)
User::Panic(_L("Bitmap not created"),KErrGeneral);
if(iTestAppNo == 0)
{
// Uncompressed
TInt ret=iBmp->Load(_L("z:\\system\\data\\tbmp.mbm"),EMbmTbmpTbmp,EFalse);
if(ret!=KErrNone)
User::Panic(_L("Bitmap not loaded"),ret);
}
else
{
TInt ret=iBmp->LoadAndCompress(_L("z:\\system\\data\\tbmp.mbm"),EMbmTbmpTbmp,EFalse);
if(ret!=KErrNone)
User::Panic(_L("Bitmap not loaded"),ret);
}
}
void CTClipStep::DestroyTestEnvironment()
{
delete iGc;
iGc = NULL;
delete iBmp;
iBmp = NULL;
if(iFont)
{
iDev->ReleaseFont(iFont);
iFont = NULL;
}
if(iLargeFont)
{
iDev->ReleaseFont(iLargeFont);
iLargeFont = NULL;
}
delete iDev;
iDev = NULL;
}
//--------------
CTClip2Step::CTClip2Step() :
CTClipStep()
{
iTestAppNo = 1;
SetTestStepName(KTClip2Step);
}