windowing/windowserver/ttime/TTIME.CPP
author Faisal Memon <faisal.memon@nokia.com>
Fri, 14 May 2010 15:41:33 +0100
branchNewGraphicsArchitecture
changeset 64 5c983aa672ea
parent 0 5d03bc08d59c
permissions -rw-r--r--
Merge 1. Pull in cpp files in the performance enhanced Khronos RI OVG files which are newly added. I've ignored platform-specific cpp files for linux, macosx, and null operating systems because this local solution has its own platform glue (i.e. facility to target Bitmaps but no full windowing support). I've ignored sfEGLInterface.cpp because this is used as a bridge to go from EGL to Nokia's Platsim which offers an EGL service. That's not relevant to this implementation because this is ARM side code, not Intel side. I just left a comment to sfEGLInterface.cpp in case we need to pick up this later on. The current code compiles on winscw. Prior to this fix, the code works on winscw, and can launch the SVG tiger (tiger.exe). That takes about 20 seconds to render. I hope to always be able to show this icon on each commit, and the plan is for the render time to reduce with this series of submissions. On this commit, the tiger renders ok in 20 seconds.

// Copyright (c) 1995-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:
// Functions to act as bench marks for various window server features
// 
//

#include "TTIME.H"
#include <e32svr.h>
#include <e32def_private.h>
typedef TBuf<32> TestNameBuf;

LOCAL_D const TUint KHeapSize=0x10000;

class CTimeClient;

class CResultDialog : public CTDialog
	{		  
public:
	CResultDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc);
	void ButtonPressL(TInt aButton);
	void ConstructLD();
private:
	CTWindowGroup *iGroupWin;
	CWindowGc *iGc;
	};

class CListWindow : public CTTitledWindow
	{
public:
	CListWindow();
	void CloseWindow();
	void ConstructL(CTWinBase &parent, TBool aExitOnEscape);
	void Draw();
	virtual void SelectedL(TInt aIndex)=0;
	virtual void WinKeyL(const TKeyEvent &aKey,const TTime& aTime);
	void SetExt(const TPoint &aPos, const TSize &aSize);
	void SetSize(const TSize &);
protected:
	virtual TPtrC GetText(TInt aLine)=0;
	virtual TInt ListCount()=0;
	void SetSize();
private:
	void Resized(const TSize &aSize);
	void SetListPos(TInt aNewPos);
	TInt TextRowHeight() const;
	void RowBox(TRect &aRect, TInt aRow) const;
	void PointerL(const TPointerEvent &aPointer,const TTime& aTime);
private:
	TInt iListPos;
	TTime iPrevTime;
	TBool iExitOnEscape;
	};

class CTestList : public CListWindow
	{
public:
	CTestList();
	~CTestList();
	void ConstructL(CTWinBase &parent);
	static void AppendProfileNum(TDes &aDes, TInt aNum);
	static void AppendProfileCount(TDes &aDes, TInt aNum);
	void SelectedL(TInt aIndex);
	virtual void WinKeyL(const TKeyEvent &aKey,const TTime& aTime);
	void ForegroundAppDialog();
	void AppendToListL(const TDesC &aDesc);
private:
	virtual TPtrC GetText(TInt aLine);
	virtual TInt ListCount();
private:
	TInt iCount;
	CArrayFixSeg<TestNameBuf> iTestNames;
	RThread iTimeTest;
	};

class CTimeTestWindowGroup : public CTWindowGroup
	{
public:
	CTimeTestWindowGroup(CTClient *aClient);
	void KeyL(const TKeyEvent &aKey,const TTime &aTime);
	};

class CTimeClient : public CTClient
	{
public:
	CTimeClient();
	void ConstructL();
	void KeyL(const TKeyEvent &aKey,const TTime &aTime);
	void Exit();
	CTWin *CreateTestWindowL(TPoint pos,CTWinBase *parent);
private:
	TInt iNum;
	};

const TInt Xmove=8;
const TInt Ymove=6;

GLREF_D TTimeTestHeader MovingWindowTest1;
GLREF_D TTimeTestHeader MovingWindowTest2;
GLREF_D TTimeTestHeader StackedWindowCreate;
GLREF_D TTimeTestHeader WindowCreateDestroy;
GLREF_D TTimeTestHeader LoadsaText;
GLREF_D TTimeTestHeader DrawBitmapTest;
GLREF_D TTimeTestHeader XorIngTest;
GLREF_D TTimeTestHeader SmallClearTest;
GLREF_D TTimeTestHeader RectCompareTest;
GLREF_D TTimeTestHeader SimpleFlushTest;
GLREF_D TTimeTestHeader SimpleFlushTest2;
GLREF_D TTimeTestHeader UseFontTest;
GLREF_D TTimeTestHeader BitBltTest;
GLREF_D TTimeTestHeader FullScreenBitBltTest;
GLREF_D TTimeTestHeader MaskedBitBltTest;
GLREF_D TTimeTestHeader SpriteTest;
GLREF_D TTimeTestHeader BitmapDeviceTest1;
GLREF_D TTimeTestHeader BitmapDeviceTest2;
GLREF_D TTimeTestHeader FillPatternTest;
GLREF_D TTimeTestHeader BitmapLoadTest;
GLREF_D TTimeTestHeader WsBitmapLoadTest;
GLREF_D TTimeTestHeader RomFileTest;
GLREF_D TTimeTestHeader TrivialFunctionsTest;
GLREF_D TTimeTestHeader BackupWindowDrawingCreate1;
GLREF_D TTimeTestHeader BackupWindowDrawingCreate2;
GLREF_D TTimeTestHeader MenuEmulationCreate;
GLREF_D TTimeTestHeader MenuEmulationCreate2;

TTimeTestHeader *tests[]={
	&MenuEmulationCreate,
	&MenuEmulationCreate2,
	&BitmapLoadTest,
	&WsBitmapLoadTest,
	&RomFileTest,
	&TrivialFunctionsTest,
	&BackupWindowDrawingCreate1,
	&BackupWindowDrawingCreate2,
	&MovingWindowTest1,
	&MovingWindowTest2,
	&StackedWindowCreate,
//	&WindowCreateDestroy,
	&LoadsaText,
	&DrawBitmapTest,
//	&BitmapDeviceTest1,
//	&BitmapDeviceTest2,
//	&XorIngTest,		List getting too big
//	&SmallClearTest,	List getting too big
//	&RectCompareTest,
	&SpriteTest,
//	&SimpleFlushTest,
//	&SimpleFlushTest2,
//	&UseFontTest,
	&BitBltTest,
//	&FullScreenBitBltTest,
	&MaskedBitBltTest,
//	&FillPatternTest,
	};

void Panic(TInt aPanic)
	{
	User::Panic(_L("TimeTest"),aPanic);
	}

struct TThreadParams
	{
	TInt iIndex;
	TInt iGroupId;
	};

TInt TimeThread(TAny *aParams)
	{
	CTrapCleanup* CleanUpStack=CTrapCleanup::New();
	//__PROFILE_START(0)
	TInt ret=tests[((TThreadParams *)aParams)->iIndex]->function(((TThreadParams *)aParams)->iGroupId);
	//__PROFILE_END(0)
	delete CleanUpStack;
	return ret;
	}

//
// List Window //
//

CListWindow::CListWindow() : CTTitledWindow(), iPrevTime(0)
	{
	}

void CListWindow::CloseWindow()
	{
	CTClient *client=((CTimeClient *)Client());
	delete this;
	client->ResetFocus();
	}

void CListWindow::SetExt(const TPoint &aPos, const TSize &)
	{
	SetPos(aPos);
	}

void CListWindow::SetSize(const TSize &)
	{
	}

void CListWindow::SetSize()
	{
	iSize.iHeight=ListCount()*(iFont->HeightInPixels()+1)+iTitleHeight+2;
	iSize.iWidth=iFont->TextWidthInPixels(*Client()->Title())+30;
	for(TInt index=0;index<ListCount();index++)
		{
		TInt wid=iFont->TextWidthInPixels(GetText(index));
		if (wid>iSize.iWidth)
			iSize.iWidth=wid;
		}
	iSize.iWidth+=4;
	iWin.SetSize(iSize);
	Resized(iSize);
	}

void CListWindow::ConstructL(CTWinBase &parent, TBool aExitOnEscape)
	{
	iExitOnEscape=aExitOnEscape;
	CTTitledWindow::ConstructL(parent);
	}

void CListWindow::SetListPos(TInt aNewPos)
	{
	if (aNewPos>=0 && aNewPos<ListCount())
		{
		iListPos=aNewPos;
		Invalidate();
		}
	}

void CListWindow::WinKeyL(const TKeyEvent &aKey, const TTime&)
	{
	switch(aKey.iCode)
		{
		case EKeyUpArrow:
			SetListPos(iListPos-1);
			break;
		case EKeyDownArrow:
			SetListPos(iListPos+1);
			break;
		case EKeyEnter:
			SelectedL(iListPos);
			break;
		case EKeyEscape:		// Fall through from EKeyEnter
			if (iExitOnEscape)
				CloseWindow();
			break;
		}
	}

void CListWindow::PointerL(const TPointerEvent &aPointer,const TTime& aTime)
	{
	if (aPointer.iType==TPointerEvent::EButton1Down)
		{
		TRect rect;
		for(TInt index=0;index<ListCount();index++)
			{
			RowBox(rect,index);
			if (rect.Contains(aPointer.iPosition))
				{
				if (index==iListPos && aPointer.iModifiers&EModifierDoubleClick)
					SelectedL(iListPos);
				else
					{
					iPrevTime=aTime;
					SetListPos(index);
					}
				return;
				}
			}
		}
	CTTitledWindow::PointerL(aPointer,aTime);
	}

TInt CListWindow::TextRowHeight() const
	{
	return(iFont->HeightInPixels()+1);
	}

void CListWindow::RowBox(TRect &aRect, TInt aRow) const
	{
	aRect.iTl.iX=2;
	aRect.iTl.iY=iTitleHeight+TextRowHeight()*aRow;
	aRect.iBr.iX=iSize.iWidth-2;
	aRect.iBr.iY=aRect.iTl.iY+TextRowHeight();
	}

void CListWindow::Draw()
	{
	CTTitledWindow::Draw();
	iGc->SetPenColor(TRgb::Gray16(0));
	TPoint pos(2,iTitleHeight+iFont->AscentInPixels()+2);
	TInt gap=TextRowHeight();
	for(TInt index=0;index<ListCount();index++,pos.iY+=gap)
		{
		iGc->DrawText(GetText(index), pos);
		if (index==iListPos)
			{
			iGc->SetBrushStyle(CGraphicsContext::ESolidBrush);
			iGc->SetBrushColor(TRgb::Gray256(255));
			iGc->SetPenStyle(CGraphicsContext::ENullPen);
			iGc->SetDrawMode(CGraphicsContext::EDrawModeXOR);
			TRect rect;
			RowBox(rect,index);
			iGc->DrawRect(rect);
			iGc->SetBrushStyle(CGraphicsContext::ENullBrush);
			iGc->SetPenStyle(CGraphicsContext::ESolidPen);
			iGc->SetDrawMode(CGraphicsContext::EDrawModePEN);
			}
		}
	}

void CListWindow::Resized(const TSize &aSize)
	{
	SetDragRect(TRect(0,0,aSize.iWidth,iTitleHeight));
	}

//
// Test list window
//

CTestList::CTestList() : CListWindow(), iTestNames(4)
	{
	}

CTestList::~CTestList()
	{
	}

void CTestList::ConstructL(CTWinBase &parent)
	{
	CListWindow::ConstructL(parent, EFalse);
	for(TUint index=0;index<(sizeof(tests)/sizeof(tests[0]));index++)
		AppendToListL(TPtrC(tests[index]->title));
	SetSize();
	/*for(TUint index1=0;index1<(sizeof(tests)/sizeof(tests[0]));index1++)
		Selected(index1);*/
	}

void CTestList::AppendProfileNum(TDes &aDes, TInt aNum)
	{
	aDes.AppendFormat(_L("%d.%02d, "),aNum/1000000,(aNum%1000000)/10000);
	}

void CTestList::AppendProfileCount(TDes &aDes, TInt aNum)
	{
	aDes.AppendFormat(_L("%d, "),aNum);
	}

#define USE_PROCESS 1

void CTestList::SelectedL(TInt aIndex)
	{
#if USE_PROCESS
	TThreadParams params;
	params.iIndex=aIndex;
	TName name;
	name.Format(_L("TimeTest-%x"),iCount++);
	params.iGroupId=Client()->iGroup->GroupWin()->Identifier();
	User::LeaveIfError(iTimeTest.Create(name,TimeThread,KDefaultStackSize*2,KHeapSize,KHeapSize,&params,EOwnerThread));
	TRequestStatus status;
	iTimeTest.Logon(status);
	__PROFILE_RESET(8);
	iTimeTest.Resume();
	User::WaitForRequest(status);
#else
	TThreadParams params;
	params.iIndex=aIndex;
	TimeThread(&params);
#endif
	TBuf<64> buf;
	TBuf<64> buf2;
	TBuf<64> buf3;
	CResultDialog *dialog=new(ELeave) CResultDialog(Client()->iGroup, iGc);
	dialog->ConstructLD();
#if USE_PROCESS
	if (status.Int()==KErrNone)
		{
#endif
#if !defined(__PROFILING__)
		buf=_L("Profiling information not available");
#else
		TProfile profile[6];
		__PROFILE_DISPLAY(6);
		for (TInt index=1;index<6;index++)
			AppendProfileNum(buf2,profile[index].iTime);
		for (TInt index2=1;index2<6;index2++)
			AppendProfileCount(buf3,profile[index2].iCount);
		buf.Format(_L("Time=%d.%2d"),profile[0].iTime/1000000,(profile[0].iTime%1000000)/10000);
#endif
		dialog->SetTitle(buf);
#if USE_PROCESS
		}
	else
		{
		dialog->SetTitle(_L("Error in test"));
		buf.Format(_L("Error=%d"),status.Int());
		buf2=iTimeTest.ExitCategory();
		}
#endif
	dialog->SetLine1(buf2);
	dialog->SetLine2(buf3);
	dialog->SetNumButtons(1);
	dialog->SetButtonText(0,_L("Okay"));
	if (dialog->Display()!=0)
		Panic(0);
	}

TPtrC CTestList::GetText(TInt aLine)
	{
	return(TPtrC(iTestNames[aLine]));
	}

TInt CTestList::ListCount()
	{
	return(iTestNames.Count());
	}

void CTestList::WinKeyL(const TKeyEvent &aKey,const TTime& aTime)
	{
	if (aKey.iModifiers&EModifierFunc)
		{
		switch(aKey.iCode)
			{
			case EKeyLeftArrow:
				AdjustSize(-Xmove,0,aKey.iModifiers);
				break;
			case EKeyRightArrow:
				AdjustSize(Xmove,0,aKey.iModifiers);
				break;
			case EKeyUpArrow:
				AdjustSize(0,-Ymove,aKey.iModifiers);
				break;
			case EKeyDownArrow:
				AdjustSize(0,Ymove,aKey.iModifiers);
				break;
			default:
				goto not_used;
			}
		}
	else
		goto not_used;
	return;
not_used:
	CListWindow::WinKeyL(aKey,aTime);
	}

void CTestList::AppendToListL(const TDesC &aDesc)
	{
	TestNameBuf buf(aDesc);	
	iTestNames.AppendL(buf);
	}

//

CResultDialog::CResultDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc) : CTDialog(),
	iGroupWin(aGroupWin),
	iGc(aGc)
	{
	}

void CResultDialog::ButtonPressL(TInt aButton)
	{
	if (aButton==0)
		CTDialog::ButtonPressL(aButton);
	}

void CResultDialog::ConstructLD()
	{
	CTDialog::ConstructLD(*iGroupWin, *iGc);
	}

//
// CTimeTestWindowGroup class //
//

CTimeTestWindowGroup::CTimeTestWindowGroup(CTClient *aClient) : CTWindowGroup(aClient)
	{
	}

void CTimeTestWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &aTime)
	{
	if (aKey.iModifiers&EModifierFunc)
		{
		switch(aKey.iCode)
			{
			case 'x':
				((CTimeClient *)Client())->Exit();
				break;
			}
		}
	else
		iCurWin->WinKeyL(aKey,aTime);
	}

//

CTimeClient::CTimeClient()
	{
	}

CTWin *CTimeClient::CreateTestWindowL(TPoint pos,CTWinBase *parent)
	{
	CTWin *win=new(ELeave) CTestList();
	TRAPD(err,win->ConstructL(*parent));
	if (err!=KErrNone)
		goto ctw_err;
	TRAP(err,win->SetPos(pos));
	if (err!=KErrNone)
		{
ctw_err:
		delete win;
		User::Leave(err);
		}
	win->Activate();
	win->AssignGC(*iGc);
	return(win);
	}

void CTimeClient::ConstructL()
	{
	CTClient::ConstructL();

	iGroup=new(ELeave) CTimeTestWindowGroup(this);
	iGroup->ConstructL();

	CreateTestWindowL(TPoint(30,4),iGroup);
	iGroup->SetCurrentWindow(iGroup->Child());
	}

void CTimeClient::Exit()
	{
	CActiveScheduler::Stop();
	}

GLDEF_C CTClient *CreateClientL()
	{
	return(new(ELeave) CTimeClient());
	}

GLDEF_C TInt E32Main()
	{
	return(TestLibStartUp(CreateClientL));
	}