// Copyright (c) 1996-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:
// GETPIXEL.CPP
// Automatically test GetPixel
//
//
/**
@file
@test
@internalComponent - Internal Symbian test code
*/
#include "TGETPIXEL.H"
CTGetPixel::CTGetPixel(CTestStep* aStep):
CTWsGraphicsBase(aStep)
{
}
CTGetPixel::~CTGetPixel()
{
iWindow.Close();
User::Free(iRgbBuf);
}
LOCAL_C TInt DoPanicTest(TInt aFunc, TAny *aScreenNumber)
{
RWsSession ws;
if (ws.Connect()==KErrNone)
switch(aFunc)
{
case 1: // Get pixels into a TPtr 1 pixel too small
{
CWsScreenDevice *screen = new(ELeave) CWsScreenDevice(ws);
User::LeaveIfError(screen->Construct((TInt)aScreenNumber));
CFbsBitmap *bitmap=new(ELeave) CFbsBitmap();
TInt bitWid=80;
TRgb *buf=NULL;
if (bitmap->Create(TSize(1,bitWid), EGray16)==KErrNone && (buf=(TRgb *)User::Alloc((bitWid-1)*sizeof(TRgb)))!=NULL)
{
TPtr8 desc((TUint8 *)buf,(bitWid-1)*sizeof(TRgb));
screen->GetScanLine(desc,TPoint(0,0),bitWid, ERgb);
}
}
break;
}
return(EWsExitReasonBad);
}
void CTGetPixel::ClearOutRedraws()
// This has been added because partial redraw store can be triggered to request a
// low priority redraw from the window even though in normal circumstances the window
// would not expect to receive any sort of redraw event.
{
iWindow.BeginRedraw();
iWindow.EndRedraw();
}
void CTGetPixel::TestPanicsL()
{
if (!iTest->IsFullRomL())
{
TEST(iTest->TestWsPanicL(DoPanicTest,EWservPanicInvalidParameter,1,(TAny*)iTest->iScreenNumber));
}
}
void CTGetPixel::DrawAndCheckLine(const TPoint &aPos,TInt aLen,TRgb aColor)
{
TheGc->Activate(iWindow);
TheGc->SetPenColor(aColor);
iWindow.BeginRedraw(TRect(aPos,TSize(aLen, 1)));
TheGc->DrawLine(aPos,aPos+TSize(aLen,0));
iWindow.EndRedraw();
TheGc->Deactivate();
iRgbBuf=(TRgb *)User::ReAlloc(iRgbBuf,aLen*sizeof(TRgb));
TPtr8 ptr((TUint8 *)iRgbBuf,aLen*sizeof(TRgb));
TheClient->iScreen->GetScanLine(ptr, aPos+iWindow.InquireOffset(*TheClient->iGroup->WinTreeNode()), aLen, EColor16MA);
TRgb result(TRgb::Gray16(aColor.Gray16()));
if (TheClient->iScreen->DisplayMode()==EColor64K)
result=TRgb::Color64K(result.Color64K());
for(TInt index=0;index<aLen;index++)
{
TEST(iRgbBuf[index]==result);
}
}
void CTGetPixel::ConstructL()
{
iWindow = TheClient->iWs;
TheGc->Activate(*BaseWin->Win());
TheGc->Clear();
TheGc->SetBrushColor(TRgb::Gray16(0));
TheGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
TheGc->SetPenStyle(CGraphicsContext::ENullPen);
TheGc->DrawRect(TRect(iWinSize));
TheGc->Deactivate();
iWindow.Construct(*TheClient->iGroup->GroupWin(),ENullWsHandle);
iWinSize=TSize(TheClient->iScreen->SizeInPixels());
iWinSize.iWidth/=3;
iWinSize.iHeight/=3;
iWindow.SetRequiredDisplayMode(EGray16);
TheClient->iWs.Flush();
iTest->DelayIfFullRomL(); // Need to wait for view server to mess around when display mode changed
TheClient->WaitForRedrawsToFinish();// otherwise it will stomp on top of our window invalidating it.
iWindow.SetExtent(TPoint(iWinSize.iWidth,iWinSize.iHeight),iWinSize);
iWindow.EnableRedrawStore(EFalse); // Otherwise drawing might trigger a redraw when purging redraw store
iWindow.Activate();
iWindow.BeginRedraw();
iWindow.EndRedraw();
}
void CTGetPixel::TestCheckRect()
{
TSize size(TheClient->iScreen->SizeInPixels());
TEST(TheClient->iScreen->RectCompare(TRect(size),TRect(TPoint(iTest->StdTestWindowSize().iWidth>>1,0),iTest->StdTestWindowSize()))==EFalse);
}
void CTGetPixel::DrawColorsL()
{
TPoint point(0,0);
TInt color=-1;
iWindow.BeginRedraw();
FOREVER
{
TheGc->SetPenColor(TRgb::Color256(++color));
TheGc->Plot(point);
if (color==255)
break;
if (++point.iX==iWinSize.iWidth)
{
point.iX=0;
if (++point.iY==iWinSize.iHeight)
break;
}
}
iWindow.EndRedraw();
}
void CTGetPixel::TestColors(CPalette* aPalette)
{
TInt numColors=iWinSize.iWidth;
TPtr8 ptr(REINTERPRET_CAST(TUint8*,iRgbBuf),numColors*sizeof(TRgb));
TPtr8 paletteData(NULL,0);
TInt color=0;
TPoint point(iWinSize.AsPoint());
do {
if (color+numColors>256)
numColors=256-color;
TheClient->iScreen->GetScanLine(ptr,point,numColors,EColor16MA);
aPalette->GetDataPtr(color,numColors,paletteData);
TEST(ptr==paletteData);
color+=numColors;
} while (color<256 && ++point.iY<2*iWinSize.iHeight);
}
void CTGetPixel::CheckPaletteL(CPalette*& aPalette)
{
User::LeaveIfError(TheClient->iScreen->SetCustomPalette(aPalette));
TestColors(aPalette);
delete aPalette;
User::LeaveIfError(TheClient->iScreen->GetPalette(aPalette));
TestColors(aPalette);
}
inline TInt Inc(TInt& aValue)
{
if (aValue>255-83)
aValue-=256-83;
else
aValue+=83;
return aValue;
}
inline TInt Inc2(TInt& aValue)
{
if (aValue>255-41)
aValue-=256-41;
else
aValue+=41;
return aValue;
}
void CTGetPixel::PaletteTestL()
{
//INFO_PRINTF1(_L("AUTO PaletteTest "));
TInt numEntries;
TBool modifiable;
TheClient->iScreen->PaletteAttributes(modifiable,numEntries);
INFO_PRINTF2(_L("Number of entries in the palette %d"), numEntries);
if(numEntries > 65536)
{
INFO_PRINTF1(_L("These test cases has been skipped, as the screen is set up in true colour display mode, where palette is not applicable"));
return;
}
CPalette* palette=NULL;
if (!modifiable)
{
if (numEntries==4)
palette=CPalette::NewDefaultL(EGray4);
else if (numEntries==16)
palette=CPalette::NewDefaultL(EGray16);
else
palette=CPalette::NewL(numEntries);
//INFO_PRINTF1(_L(" Creating Empty Palette, setting it as palette"));
TInt err=TheClient->iScreen->SetCustomPalette(palette);
TEST(err==KErrNoMemory || err==KErrNotSupported || (err==KErrNone && numEntries<=16)); //Series5MX palettes are changeable even though they say they aren't
//INFO_PRINTF1(_L(" Palette setting test passed OK"));
delete palette;
}
TInt err=iWindow.SetRequiredDisplayMode(EColor256);
TheGc->Activate(iWindow);
DrawColorsL();
//INFO_PRINTF1(_L(" Drawn Colors"));
TheClient->iScreen->PaletteAttributes(modifiable,numEntries);
iRgbBuf=STATIC_CAST(TRgb*,User::ReAllocL(iRgbBuf,Max(256,iWinSize.iWidth)*sizeof(TRgb)));
if (err<KErrNone || modifiable==EFalse)
{
//INFO_PRINTF1(_L(" Palette Fixed"));
TInt err=TheClient->iScreen->GetPalette(palette);
if (err==KErrNotSupported)
return;
User::LeaveIfError(err);
TestColors(palette);
delete palette;
//INFO_PRINTF1(_L(" Tested Palette OK"));
return;
}
//INFO_PRINTF1(_L(" Palette Changeable"));
TEST(numEntries==256);
CPalette* defPalette=CPalette::NewDefaultL(EColor256);
CleanupStack::PushL(defPalette);
TestColors(defPalette);
User::LeaveIfError(TheClient->iScreen->GetPalette(palette));
TestColors(palette);
TInt color;
TInt index=0;
for (color=0;color<256;++color)
palette->SetEntry(color,TRgb::Gray256(color));
CheckPaletteL(palette);
for (color=0;color<256;++color)
palette->SetEntry(color,TRgb(Inc(index),Inc(index),Inc(index)));
CheckPaletteL(palette);
for (color=0;color<256;++color)
palette->SetEntry(color,TRgb(Inc2(index),Inc2(index),Inc2(index)));
CheckPaletteL(palette);
delete palette;
User::LeaveIfError(TheClient->iScreen->SetCustomPalette(defPalette));
TestColors(defPalette);
CleanupStack::PopAndDestroy(defPalette);
ClearOutRedraws();
}
void CTGetPixel::RunTestCaseL(TInt /*aCurTestCase*/)
{
((CTGetPixelStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
switch(++iTest->iState)
{
/**
@SYMTestCaseID GRAPHICS-WSERV-0212
@SYMDEF DEF081259
@SYMTestCaseDesc Draw lines and check them by scanning the lines
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Draw lines and then scan them to check that they have
been drawn correctly
@SYMTestExpectedResults Scanning the lines reveals they have been drawn correctly
*/
case 1:
((CTGetPixelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0212"));
TheClient->iWs.SetAutoFlush(ETrue);
iTest->LogSubTest(_L("Basic"));
DrawAndCheckLine(TPoint(0,2),iWinSize.iWidth-2,TRgb::Gray4(0));
DrawAndCheckLine(TPoint(0,iWinSize.iHeight-2),iWinSize.iWidth,TRgb::Gray4(1));
DrawAndCheckLine(TPoint(iWinSize.iWidth-1,iWinSize.iHeight-1),1,TRgb::Gray4(2));
ClearOutRedraws();
TheClient->iWs.SetAutoFlush(EFalse);
break;
/**
@SYMTestCaseID GRAPHICS-WSERV-0213
@SYMDEF DEF081259
@SYMTestCaseDesc Draw line on every line of a window and
check them by scanning the lines
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Draw lines on every line of a window and
check them by scanning the lines
@SYMTestExpectedResults Scanning the lines reveals they have been drawn correctly
*/
case 2:
{
((CTGetPixelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0213"));
iTest->LogSubTest(_L("Full window"));
for(TInt ypos=0;ypos<iWinSize.iHeight;ypos++)
DrawAndCheckLine(TPoint(0,ypos),iWinSize.iWidth,TRgb::Gray4(0));
ClearOutRedraws();
}
break;
/**
@SYMTestCaseID GRAPHICS-WSERV-0214
@SYMDEF DEF081259
@SYMTestCaseDesc Test the check rect method
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Use the check rect method to check the image in a window
@SYMTestExpectedResults The check rect method functions correctly
*/
case 3:
((CTGetPixelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0214"));
iTest->LogSubTest(_L("Check Rect"));
TestCheckRect();
break;
/**
@SYMTestCaseID GRAPHICS-WSERV-0215
@SYMDEF DEF081259
@SYMTestCaseDesc Test that the GetScanLine method panics correctly
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Cause the GetScanLine method to panic and chekc the response
@SYMTestExpectedResults The panic for the GetScanLine method is correct
*/
case 4:
((CTGetPixelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0215"));
iTest->LogSubTest(_L("Panic"));
TestPanicsL();
break;
/**
@SYMTestCaseID GRAPHICS-WSERV-0216
@SYMDEF DEF081259
@SYMTestCaseDesc Test that CPalette class functions correctly
@SYMTestPriority High
@SYMTestStatus Implemented
@SYMTestActions Create a CPalette object and exercise all its methods
@SYMTestExpectedResults The palette functions as exepcted
*/
case 5:
((CTGetPixelStep*)iStep)->SetTestStepID(_L("GRAPHICS-WSERV-0216"));
iTest->LogSubTest(_L("Palette Test"));
PaletteTestL();
break;
case 6:
((CTGetPixelStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
((CTGetPixelStep*)iStep)->CloseTMSGraphicsStep();
TestComplete();
break;
}
((CTGetPixelStep*)iStep)->RecordTestResultL();
}
__WS_CONSTRUCT_STEP__(GetPixel)