windowing/windowserver/nga/SERVER/openwfc/redrawmsgwindow.h
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/openwfc/redrawmsgwindow.h	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,231 @@
+// Copyright (c) 2006-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:
+// CWsRedrawMsgWindow and associated classes definitions
+// 
+//
+
+#ifndef __REDRAWMSGWINDOW_H__
+#define __REDRAWMSGWINDOW_H__
+
+#include "wnredraw.h"
+#include "redrawmsgwindow.h"
+
+class CWsFbsFont;
+class CWsDrawableSource;
+
+// This class is intended to be used in cases, where it's needed to track how many times a CFbsBitmap
+// is referenced, e.g. in redraws, where already drawn bitmaps need to be re-drawn in different position.
+class CFbsBitmapRef : public CFbsBitmap
+    {
+public:
+    CFbsBitmapRef();
+    ~CFbsBitmapRef();
+    inline TInt RefCount() const;
+    inline void IncRefCount();
+    inline void DecRefCount();
+private:
+    TInt iRefCount;
+    };
+
+class CWsRedrawMsgWindow : public CWsWindowRedraw
+	{
+	class CRedrawSegment;
+	enum TFlags
+		{
+		EBackgroundClear=0x0001,		//Clear background when starting redraw
+		EBeginEndRedraw=0x0002,			//This window is currently in the middle of a redraw, that is between client calls to BeginRedraw and EndRedraw.
+		EPendingScheduledDraw=0x0004,   //We have scheduled a redraw but it hasn't happened yet
+		EStoringEntireWindow=0x0008,    //If store commands for the entire window or only the viewport
+		ECurrentRedrawFailedStorage=0x0010,		//The current redraw failed to store a command (is reset for each redraw). Is used to make sure we only request a redraw from the client once per failing redraw
+		EPreviousRedrawFailedStorage=0x0020,	//The previous redraw failed to store a command. Is used to avoid infinite loops -- if two consecutive redraws fail (i.e. current and previous) then there is no use requesting yet another redraw from the client
+		};
+	enum TScope
+		{
+		EStoreEntireWindow,             //We try to obtain draw commands for the entire window
+		EStoreViewport                  //We only try to obtain commands for the on screen viewport
+		};
+public:
+	enum TRedrawSegmentType
+		{
+		ESegmentTypePendingRedraw,      // A redraw segment still being received
+		ESegmentTypeRedraw              // A segment received between a begin and end redraw
+		};
+public:
+	static void StaticInitL();
+	CWsRedrawMsgWindow(CWsWindow *aWin);
+	~CWsRedrawMsgWindow();
+	void AddFbsBitmapsL(TInt aHandle, TInt aMaskHandle);
+	void AddFbsBitmapRefL(TInt aHandle);
+	void AddWsBitmapsL(TInt aHandle, TInt aMaskHandle);
+	void AddWsFontL(TInt aHandle);
+	void AddWsDrawableSourceL(TInt aHandle);
+	void SetScope(TScope aStore);
+	void CleanupBitmapRefArray(const RArray<TInt>& aHandleArray);
+	
+public:	//from CWsWindowRedraw		
+	void ConstructL();
+	TBool CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd);
+	void ClipInvalidRegion(const TRect &aRect);
+	TBool NeedsRedraw() const;
+	TBool GetRedrawRect(TRect &aRect) const;
+	const TRegion& BaseDrawRegion() const;
+	const TRegion& InvalidArea() const;
+	void ClearRedrawStore(TBool aClearPendingRedraw=EFalse);
+	TBool DrawCommand(CWsGc* aGc,const TAny *aCmdData);
+	void GcAttributeChange(CWsGc* aGc,const TAny *aCmdData);
+	void GcDeactivate(CWsGc* aGc);
+	void ClientExposing();
+	void DrawWindow();
+	void PrepareForResizeL(const TSize &aSize, TSize &aOldSize);
+	void Moved();
+	TBool Contains(const TArray<TGraphicDrawerId>& aDrawers,const TRegion& aRegion) const;
+	TBool ReleaseMemory(MWsMemoryRelease::TMemoryReleaseLevel aLevel);
+	void VisibleRegionChange();
+	TBool ReadyToDraw() const;
+	TInt SizeInBytes() const;
+	TBool RedrawingInProgress() const;
+	void WindowClosing();
+	TBool IsRedrawStoreEmpty() const;
+	TBool IsBackgroundClearEnabled() const;
+	CFbsBitmap* BitmapFromHandle(TInt aHandle) const;
+
+private: //from CWsWindowRedraw	
+	void Invalidate(const TRect * aRect = 0);
+	TRgb BackColor() const;
+	void Scroll(const TRect &aClipRect, const TPoint &aOffset,const TRect &aRect);
+	
+private:
+	void RemoveFromRedrawQueueIfEmpty();
+	const TRegion * ReadRegion(const TInt aRegionNum);
+	void BeginRedraw(const TRect* aRect);
+	void DoBeginRedrawL(const TRect* aRect);
+	void SubtractRectFromSegmentArray(const TRect& aRect);
+	void EndRedraw();
+	void ValidateRect(const TRect *aRect);
+	void StoreDrawCommandL(CWsGc* aGc,const TAny *aCmdData);
+	void AppendCommandL(const TAny* aCmdData, const TUint16 aOpcodeFlags = 0);
+	void StoreAllGcAttributesL(CWsGc* aGc);
+	void DrawCommandsL();
+	void DiscardStoredCommands();
+	TBool DiscardSegmentsOutsideViewport();
+	inline TBool NoBuffer() const;
+	void DiscardStoredCommandsIfError(TInt aError);
+	inline TBool IsFbsBitmapOperation(TInt aOpCode) const;
+	inline TBool IsWsBitmapOperation(TInt aOpCode) const;
+	inline TBool IsRemoteReadRequired(TInt aOpCode) const;
+	inline TBool IsWsFontOperation(TInt aOpCode) const;
+	inline TBool IsDrawWsGraphicOperation(TInt aOpCode) const;
+	inline TBool IsWsDrawableSourceOperation(TInt aOpCode) const;
+	void ReplaceAndAppendCommandL(TInt aOpcode,const TAny* aCmdData);
+	// CRedrawSegment related methods
+	inline TInt CurrentCommandBufferWritePos() const;
+	inline CBufSeg* CurrentDrawCommandBuffer() const;
+	void ExpandCommandBufferL(TInt aLength);
+	void CommandBufferWrite(const TDesC8& aDes, TInt aLength);
+	void CommandBufferWrite(const TAny* aPtr,TInt aLength);
+	void CreateNewSegmentL(const TRect& aRect, TRedrawSegmentType aRegionType);
+	inline TBool InRedraw() const;
+	void PromotePendingSegment();
+	void Lock();
+	void Unlock();
+	void ReleaseRedrawSegments();
+private:
+	static TBool iAtomic;
+	RPointerArray<CFbsBitmapRef> iFbsBitmapRefArray;
+private:
+	class CRedrawSegment : public CBase
+		{
+	public:
+		static CRedrawSegment* NewLC(const TRect& aRect, TRedrawSegmentType aNewRegionType, CWsRedrawMsgWindow& aRedraw);
+		~CRedrawSegment();
+		void AddWsBitmapL(DWsBitmap* bitmap);
+		void AddWsDrawableSourceL(CWsDrawableSource* aDrawableSource);
+		void AddDrawerL(TGraphicDrawerId aDrawerId);
+		TBool ContainsDrawers(const TArray<TGraphicDrawerId>& aDrawers,const TRegion& aRegion) const;
+		TInt SizeInBytes() const;
+		TBool AppendNonDuplicateBitmapHandleL(TInt aHandle);
+	private:
+		CRedrawSegment(CWsRedrawMsgWindow& aRedraw);
+		void ConstructL(const TRect& aRect, TRedrawSegmentType aNewRegionType);
+		void ReleaseFontsBitmapsDrawableSources();
+	public:
+		TRedrawSegmentType iRedrawSegmentType;
+		CBufSeg* iDrawCommands;
+		TInt iCurrentCommandBufferWritePos;
+		RWsRegion iRegion;
+		RPointerArray<DWsBitmap> iWsBitmapArray;
+		RPointerArray<CWsFbsFont> iWsFontArray;
+		RArray<TGraphicDrawerId> iDrawerArray;
+		RPointerArray<CWsDrawableSource> iWsDrawableSourceArray;
+		TTime iCreationTime;
+	private:
+	    CWsRedrawMsgWindow& iRedraw;
+	    RArray<TInt> iBitmapHandleArray;
+		};
+	RWsRegion iInvalid; // Region we haven't been sent a begin redraw for.
+	TRect iRedrawRect;
+	TRgb iBackColor;
+	TInt iFlags;
+	// Regions currently in use for drawing this window:
+	RPointerArray<CRedrawSegment> iRedrawSegments;
+	// The segment we are currently storing to.  This is allowed to be null!
+	CRedrawSegment * iCurrentSegment;
+	// The last GC we drew with so we can detect changes
+	CWsGc* iLastDrawGc;
+	// During a scheduled draw, this is the area being drawn to (see comments on ReadRegion)
+	RWsRegion iLocalRedrawRegion;
+	TInt iMemoryLock;
+	TBool iOSBStatus;
+	};
+
+inline TBool CWsRedrawMsgWindow::IsRemoteReadRequired(TInt aOpCode) const
+	{
+	return (aOpCode==EWsGcOpDrawTextPtr || aOpCode==EWsGcOpDrawTextVerticalPtr || 
+		aOpCode==EWsGcOpDrawBoxTextPtr || aOpCode==EWsGcOpDrawBoxTextVerticalPtr);
+	}
+
+inline TInt CWsRedrawMsgWindow::CurrentCommandBufferWritePos() const
+	{
+	WS_ASSERT_DEBUG(iCurrentSegment, EWsPanicDrawCommandsInvalidState);
+	return iCurrentSegment->iCurrentCommandBufferWritePos;
+	}
+
+inline CBufSeg* CWsRedrawMsgWindow::CurrentDrawCommandBuffer() const
+	{
+	WS_ASSERT_DEBUG(iCurrentSegment, EWsPanicDrawCommandsInvalidState);
+	return iCurrentSegment->iDrawCommands;
+	}
+
+inline TBool CWsRedrawMsgWindow::InRedraw() const
+	{
+	return iFlags&EBeginEndRedraw;
+	}
+	
+inline TInt CFbsBitmapRef::RefCount() const
+    {
+    return iRefCount;
+    }
+
+inline void CFbsBitmapRef::IncRefCount()
+    {
+    ++iRefCount;
+    }
+
+inline void CFbsBitmapRef::DecRefCount()
+    {
+    WS_ASSERT_DEBUG(iRefCount>0,EWsPanicCounterValue);
+    --iRefCount;
+    }
+	
+#endif