windowing/windowserver/ttime/TTIME.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/ttime/TTIME.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,554 @@
+// 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));
+	}