windowing/windowserver/debuglog/DEBUGLOG.H
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) 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:
//

#ifndef __DEBUGLOG_H__
#define __DEBUGLOG_H__

#pragma warning( disable : 4710 )	//function  abc  not expanded

#include "../SERVER/w32cmd.h"

typedef TBuf<32> TShortBuf;
typedef TBuf<64> TLongBuf;

enum {LogTBufSize=0xA0};


class TDebugLogOverflow : public TDes16Overflow
	{
public:
	inline TDebugLogOverflow();
	inline void Reset();
	inline TBool IsError();
	//Pure virtual function from TDesNnOverflow
	void Overflow(TDes &aDes);
private:
	TBool iError;
	};

class TWsDecoder
	{
public:
	enum {ENewClientClass=0x9999};
	union TWsCmdUnion
		{
		const TAny *any;
		TWsClCmdUnion client;
		TWsWinCmdUnion window;
		TWsGcCmdUnion gc;
		TWsSdCmdUnion sd;
		TWsAnimDllCmdUnion anim;
		};
	TDesC &CommandBuf(TInt aApp);
	TDesC &Command(TInt aClass, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	TDesC &CommandReply(TInt aData);
	TDesC &CommandReplyBuf(const TDesC8 &aDes);
	TDesC &CommandReplyBuf(const TDesC16 &aDes);
	TDesC &NewClient(TUint aConnectionHandle);
	TDesC &SignalEvent(TInt aApp);
	TDesC &Panic(TInt aApp, TInt aReason);
	TDesC &MiscMessage(const TDesC &aFormat,TInt aParam);
	void Disable();
	void Enable();
private:
	void UnKnown();
	void UnKnownOpcode(TBuf<LogTBufSize> &aText, TInt aOpcode);
	void UnKnownReplyBuf(TBuf<LogTBufSize> &aText, TInt aOpcode);
	void AppendPoint(TBuf<LogTBufSize> &aText, const TDesC8 *aReplyDes8);
	void AppendRect(TBuf<LogTBufSize> &aText, const TDesC8 *aReplyDes8);
	void AppendDesc(TBuf<LogTBufSize> &aText, const TDesC8 *aReplyDes8);
	void AppendDesc(TBuf<LogTBufSize> &aText, const TDesC16 *aReplyDes16);
	void decodeWindow(TBuf<LogTBufSize> &aText,TInt aOpcode,const TAny *aCmdData);
	void DecodeWindowGroup(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeClient(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeWindow(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeGc(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeGc1(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData);
	void DecodeGc2(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData);
	void DecodeGc3(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData);
	void DecodeScreenDevice(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeAnimDll(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeSpriteBase(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeBitmap(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeDirect(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void DecodeClick(TBuf<LogTBufSize> &aText, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void ReplyBufWindowGroup(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText);
	void ReplyBufWindow(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText);
	void ReplyBufClient(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText);
	void ReplyBufScreenDevice(TBuf<LogTBufSize> &aText, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText);
	TDesC &commandDetails(TInt aClass, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	TDesC &eventDetails(const TWsEvent *aWsEvent);
	TDesC &eventDetails(const TRawEvent *aEvent);
	TDesC &replyBufDetails(TInt aClass, TInt aOpcode, const TDesC8 *aReplyDes8, const TDesC *aReplyDesText);
private:
	TBuf<LogTBufSize> iEventDetailsText;
	TBuf<LogTBufSize> iCommandDetailsText;
	TBuf<LogTBufSize> iText;
	TUint iCommandCount;
	TUint iEventCount;
	TInt iRequestFuncClass;
	TInt iHandle;
	TInt iPrevOpcode;
	TDebugLogOverflow iOverflowHandler;
	};

class TDebugLogTextHandler
	{
public:
	enum TArrayType
		{
		EInt,
		ERgb
		};
	static void Append(TDes &aBuf1, const TDesC &aBuf2);
	static void TestAppend();
	static TBuf<20> FormatBool(TBool aBool);
	static TBuf<32> FormatPoint(const TPoint &aPoint);
	static TBuf<32> FormatSize(const TSize &aSize);
	static TBuf<64> FormatRect(const TRect &aRect);
	static TBuf<40> FormatRgb(const TRgb &aRgb);
	static TBuf<20> PointerEventType(TPointerEvent::TType aType);
	static TBuf<LogTBufSize> FormatArray(TArrayType aArrayType, const TUint8 *aArrayPtr, TUint aNumElems);
private:
	static TBuf<0x20> formatArrayElement(TArrayType aArrayType, const TUint8 *aArrayPtr);
	static void panic(TInt aReason);
	};

class CDebugLogDevice : public CBase
	{
public:
	virtual void ConstructL(TBool aIsFirst, TDesC &aParams)=0;
	virtual void WriteToLogL(const TDesC &aDes, const TDesC &aDes2)=0;
	virtual void WriteToLog8L(const TDesC8 &aDes, const TDesC8 &aDes2)=0;
	};

class CDebugLog: public CDebugLogBase
	{
private:
	enum {KNumProfiles=10};
public:
	IMPORT_C CDebugLog(CDebugLogDevice *aDevice);
	~CDebugLog();
	IMPORT_C void ConstructL(TBool aIsFirst, TDesC &aParams);
	//Pure virtual functions from CDebugLogBase
	void CommandBuf(TInt aApp);
	void Command(TInt aClass, TInt aOpcode, const TAny *aCmdData, TInt aHandle);
	void NewClient(TUint aConnectionHandle);
	void Reply(TInt aData);
	void ReplyBuf(const TDesC8 &aDes);
	void ReplyBuf(const TDesC16 &aDes);
	void SignalEvent(TInt aApp);
	void Panic(TInt aApp, TInt aReason);
	void MiscMessage(TInt aPriority,const TDesC &aFmt,TInt aParam=0);
	void HeapDump();
	void SetLoggingLevel(TInt aLevel);
	void IniFileSettingRead(TInt aScreen, const TDesC& aVarName, TBool aFound, const TDesC& aResult);

private:
	void AppendProfileNum(TDes &aDes, TInt aNum);
	void AppendProfileCount(TDes &aDes, TInt aNum);
	void LogProfiles();
	void WriteToLog(const TDesC &aDes,TInt aLevel=ELogEverything);
	void MiscMessage(const TDesC &aFmt,TInt aParam=0);

private:
	CDebugLogDevice *iDevice;
	TWsDecoder iWsDecoder;
	TBool iIsDisabled;
	TInt iErr;
	TTime iPrevTime;
	TInt iExtraLen;
	TInt iLevel;		//The current logging level
	TInt iLastApp;
	};

GLREF_C TInt hHandleToValue(TUint32 handle);


// Inline functions
/*TDebugLogOverflow*/
inline TDebugLogOverflow::TDebugLogOverflow() :iError(EFalse)
	{}
inline void TDebugLogOverflow::Reset()
	{iError=EFalse;}
inline TBool TDebugLogOverflow::IsError()
	{return iError;}

#endif