windowing/windowserver/tauto/TGETPIXEL.CPP
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// 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)