--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/redrawmsgwindow.h Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,198 @@
+// 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 CWsRedrawMsgWindow : public CWsWindowRedraw
+ {
+ class CRedrawSegment;
+ enum TFlags
+ {
+ EBackgroundClear=0x0001, //Clear background when starting redraw
+ ENoRepeatRedraw=0x0004, //Redraw is a response to an error, and should not repeat on another error
+ EBeginEndRedraw=0x0080, //This window is currently in the middle of a redraw, that is between client calls to BeginRedraw and EndRedraw.
+ EPendingScheduledDraw=0x0200, //We have scheduled a redraw but it hasn't happened yet
+ EStoringEntireWindow=0x0400, //If store commands for the entire window or only the viewport
+ };
+ 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
+ };
+ enum TAtomicityType
+ {
+ ENoAtomicity,
+ ESegment,
+ EWindow,
+ };
+public:
+ enum TRedrawSegmentType
+ {
+ ESegmentTypePendingRedraw, // A redraw segment still being received
+ ESegmentTypeRedraw, // A segment received between a begin and end redraw
+ ESegmentTypeNonRedraw, // A segment storing commands received outside of begin and end redraw
+ };
+public:
+ static void StaticInitL();
+ CWsRedrawMsgWindow(CWsWindow *aWin);
+ ~CWsRedrawMsgWindow();
+ void AddFbsBitmapsL(TInt aHandle, TInt aMaskHandle);
+ void AddWsBitmapsL(TInt aHandle, TInt aMaskHandle);
+ void AddWsFontL(TInt aHandle);
+ void SetScope(TScope aStore);
+
+public: //from CWsWindowRedraw
+ void ConstructL();
+ TBool CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd);
+ void ClipInvalidRegion(const TRect &aRect);
+ TBool NeedsRedraw() const;
+ TBool GetRedrawRect(TRect &aRect) 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;
+ void WindowClosing();
+
+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();
+ void HandleNonRedrawCommand(TWsGcOpcodes aOpcode);
+ const TRegion * ReadRegion(const TInt aRegionNum);
+ void BeginRedraw(const TRect* aRect);
+ void DoBeginRedrawL(const TRect* aRect);
+ TInt 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;
+ 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 AgeNonRedrawSegments();
+ void PromoteAndUpdateAllPendingSegments();
+ void PromoteLastPendingSegment();
+ void Lock();
+ void Unlock();
+ void ScheduleUpdateOfSegment(CRedrawSegment* aSegment);
+ void ReleaseRedrawSegments();
+
+private:
+ static TInt iNonRedrawAgeLimit;
+ static TAtomicityType iAtomicity;
+private:
+ class CRedrawSegment : public CBase
+ {
+ public:
+ static CRedrawSegment* NewLC(const TRect& aRect, TRedrawSegmentType aNewRegionType);
+ ~CRedrawSegment();
+ void AddFbsBitmapL(TInt aHandle, CWsRedrawMsgWindow* aWindow);
+ void AddWsBitmapL(DWsBitmap* bitmap);
+ void ReleaseFontsAndBitmaps();
+ void AddDrawerL(TGraphicDrawerId aDrawerId);
+ TBool ContainsDrawers(const TArray<TGraphicDrawerId>& aDrawers,const TRegion& aRegion) const;
+ TInt SizeInBytes() const;
+ private:
+ CRedrawSegment();
+ void ConstructL(const TRect& aRect, TRedrawSegmentType aNewRegionType);
+ public:
+ TRedrawSegmentType iRedrawSegmentType;
+ CBufSeg* iDrawCommands;
+ TInt iCurrentCommandBufferWritePos;
+ RWsRegion iRegion;
+ RPointerArray<CFbsBitmap> iFbsBitmapArray;
+ RPointerArray<DWsBitmap> iWsBitmapArray;
+ RPointerArray<CWsFbsFont> iWsFontArray;
+ RArray<TGraphicDrawerId> iDrawerArray;
+ TTime iCreationTime;
+ };
+ 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;
+ TInt iCount;
+ };
+
+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;
+ }
+
+#endif