--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nga/SERVER/openwfc/windowelementset.h Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,250 @@
+// 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:
+//
+
+#if !defined(__WINDOWELEMENTSET_H__)
+#define __WINDOWELEMENTSET_H__
+
+/**
+@file
+@internalComponent
+*/
+
+#include <graphics/wselement.h>
+
+class CBase;
+class CWsClientWindow;
+class TSurfaceConfiguration;
+class MWsScene;
+
+class TAttributes
+{
+public:
+ TAttributes(){iFlags = 0;}
+ enum
+ {
+ EConcealed = 0x00000001,
+ EDrawnOver = 0x00000002,
+ EDrawnOverLast = 0x01000000,
+ };
+ //flag accessors
+ inline TBool Concealed() const {return iFlags&EConcealed;}
+ inline void SetConcealed(TBool aSetting = ETrue) {aSetting?iFlags|=EConcealed:iFlags&=~EConcealed;}
+ inline TBool DrawnOver() const {return iFlags&EDrawnOver;}
+ inline void SetDrawnOver(TBool aSetting = ETrue) {aSetting?iFlags|=EDrawnOver:iFlags&=~EDrawnOver;}
+ inline TBool DrawnOverLast() const {return iFlags&EDrawnOverLast;}
+ inline void SetDrawnOverLast(TBool aSetting = ETrue)
+ { iFlags= aSetting? iFlags|EDrawnOverLast:iFlags&~EDrawnOverLast; }
+ inline TInt Flags()const
+ { return iFlags; }
+ TBool Destroy(MWsScene& aScene, TBool aUnregister);
+public:
+ TInt DebugFlags()const { return iFlags; }
+protected:
+ TUint iFlags;
+public:
+ MWsElement* iElement;
+};
+
+class TBackgroundAttributes : public TAttributes
+{
+public:
+ enum
+ {
+ EExplicitExtent = 0x00010000,
+ //EAbsoluteExtent = 0x00020000, //This would be used to represent wallpaper or DSA per window
+ EExplicitViewPort = 0x00040000,
+ };
+ //flag accessors
+ inline TBool ExplicitExtent() const {return iFlags&EExplicitExtent;}
+ inline void SetExplicitExtent(TBool aSetting = ETrue)
+ { iFlags= aSetting? iFlags|EExplicitExtent:iFlags&~EExplicitExtent;}
+//Absolute extent functionality is currently not required or used
+// inline TBool AbsoluteExtent() const {return iFlags&EAbsoluteExtent;}
+// inline void SetAbsoluteExtent(TBool aSetting = ETrue)
+// { iFlags= aSetting? iFlags|EAbsoluteExtent:iFlags&~EAbsoluteExtent;}
+ inline TBool ExplicitViewPort() const {return iFlags&EExplicitViewPort;}
+ inline void SetExplicitViewPort(TBool aSetting = ETrue)
+ { iFlags = aSetting ? iFlags|EExplicitViewPort : iFlags&~EExplicitExtent;}
+};
+
+class TPlacedAttributes : public TAttributes
+{
+public:
+ enum
+ {
+ EUnassigned = 0x00010000,
+ ELockedConfig = 0x00020000,
+ EChangedClip = 0x00040000,
+ EOverlapping = 0x00080000,
+ };
+ //flag accessors
+ inline TBool Unassigned() const {return iFlags&EUnassigned ;}
+ inline void SetUnassigned(TBool aSetting = ETrue)
+ { iFlags= aSetting? iFlags|EUnassigned :iFlags&~EUnassigned; }
+ inline TBool LockedConfig() const {return iFlags&ELockedConfig ;}
+ inline void SetLockedConfig(TBool aSetting = ETrue)
+ {aSetting?iFlags|=ELockedConfig:iFlags&=~ELockedConfig;}
+ inline TBool ChangedClip() const {return iFlags&EChangedClip;}
+ inline void SetChangedClip(TBool aSetting = ETrue)
+ {aSetting?iFlags|=EChangedClip:iFlags&=~EChangedClip;}
+ inline TBool Overlapping() const {return iFlags&EOverlapping;}
+ inline void SetOverlapping(TBool aSetting = ETrue)
+ { iFlags= aSetting? iFlags|EOverlapping:iFlags&~EOverlapping; }
+ inline void ClearRedrawFlags()
+ { iFlags &= (~(EUnassigned|ELockedConfig|EChangedClip|EOverlapping)); }
+};
+
+class CWindowElement : public CBase
+{
+friend class CWindowElementSet;
+public:
+ enum
+ {
+ EFastPath = 0x00000001,
+ EPauseComposition = 0x00000002, //assign flags this if pause is needed immediately
+ EResort = 0x00000004,
+ EFailed = 0x00010000, //cleanup failure needs to be reported separately
+ };
+
+ CWindowElement(const CWsClientWindow& aWindow);
+
+ TInt UnassignPlacedElements(const TRegion& aRegion,TInt aGcDrawingCount);
+ void FlagAssignedElementsDrawnOver(TInt aGcDrawingCount);
+ static TBool IsElementAMatch(MWsElement&,const TSurfaceConfiguration&,TInt);
+ static TInt SetElement(MWsElement&,const TSurfaceConfiguration&,TBool);
+ TBool InsertCache(TInt aIndexToInsert);
+ static void NotifyReleasingSurface(TSurfaceId aSurfaceId);
+ TInt AssignPlacedElement(TPlacedAttributes*& aPlacedAttributes,
+ const TSurfaceConfiguration& aSurfaceConfiguration,
+ const TRegion& aUserDefinedRegion, MWsScene& aScene,TInt aGcDrawingCount);
+
+ TInt CleanUpPlacedElements(MWsScene& aScene,TInt aGcDrawingCount);
+ void MoveToAboveGivenElement(MWsScene& aScene, MWsElement* aAboveElement);
+ void UpdateElementExtent(const TPoint* aOffset);
+ TBool SetVisibleRegion(const TRegion& aRegion, MWsScene& aScene);
+ TInt ReleaseAllElements();
+ TBool SearchDuplicateSurfaceId(const TSurfaceId& aSurfaceId);
+ void SetElementOpacity(TInt aOpacity, MWsScene& aScene);
+ void ResubmitAllElementExtents();
+ MWsElement* Element() const;
+
+protected:
+ TInt AssignRecycleElement(const TInt aIndex,
+ const TSurfaceConfiguration& aSurfaceConfiguration,
+ const TRegion& aUserDefinedRegion,
+ MWsScene& aScene);
+ TInt AssignCreateElement(const TSurfaceConfiguration& aSurfaceConfiguration,
+ const TRegion& aUserDefinedRegion,
+ MWsScene& aScene);
+ TInt AssignExtendElement(const TInt aIndex,
+ const TSurfaceConfiguration& aSurfaceConfiguration,
+ const TRegion& aUserDefinedRegion,
+ MWsScene& aScene);
+
+public:
+ const CWsClientWindow& iWindow;
+private:
+ TBackgroundAttributes iBackgroundElement;
+ RArray<TPlacedAttributes> iPlacedElements;
+private: //The following are all exclusively used during window rendering
+ RArray<RRegion> iCache;
+ //memory of surfaces that need to be removed
+ RArray<TSurfaceId> iRemovedSurfaces;
+ TBool iRemovedSurfacesValid;
+
+ RRegion iNonRedrawVisibleRegion;
+ TInt iHighestReusedIndex;
+ TInt iStartGcDrawingCount;
+ TUint iFlags;
+};
+
+/**
+Owns the set of elements and their associated identification information. Only
+references are provided for clients.
+*/
+class CWindowElementSet : public CBase
+{
+public:
+ static CWindowElementSet* NewL(MWsScene& aScene);
+ ~CWindowElementSet();
+ TBackgroundAttributes& AcquireBackgroundElementL(CWsClientWindow& aWindow);
+ TInt ReleaseBackgroundElement(const CWsClientWindow&, TBool aWindowClosing = EFalse);
+ TInt ReleaseAllElements(const CWsClientWindow&, TBool aWindowClosing = EFalse);
+ TInt UnassignPlacedElements(const TRegion& aRedrawRegion, const CWsClientWindow& aWindow,TInt aGcDrawingCount);
+ TInt AssignPlacedElement(TPlacedAttributes*&, const TSurfaceConfiguration&, const TRegion& aUserDefinedRegion,
+ const CWsClientWindow&,TInt aGcDrawingCount);
+ TInt CleanUpPlacedElements(const CWsClientWindow& aWindow,TInt aGcDrawingCount);
+ TInt Count() const;
+ TBackgroundAttributes* FindBackgroundElement(const CWsClientWindow&);
+ TBool FindElements(const CWsClientWindow&,const TBackgroundAttributes*&,const RArray<TPlacedAttributes>*&);
+ TInt RegisterSurface(const TSurfaceId& aSurface);
+ void UnregisterSurface(const TSurfaceId& aSurface);
+ TBool SortByZOrder();
+ TInt SetVisibleRegion(CWsClientWindow& aWindow); //cant be a const win as VisibleRegion() isnt const??
+ void UpdateElementExtent(const CWsClientWindow&, const TPoint* aOffset);
+ static TInt GetConfiguration(TSurfaceConfiguration&,MWsElement&);
+ TBool SearchDuplicateSurfaceId(const TSurfaceId& aSurfaceId);
+ void SetElementOpacity(CWsClientWindow& aWindow, TInt aOpacity);
+ void ResubmitAllElementExtents();
+ MWsElement* GetElementFromWindow(const CWsClientWindow& aWindow) const;
+
+public:
+ const CWsClientWindow* DebugWindowAt(TUint aWin)const;
+ const TBackgroundAttributes* DebugBackgroundAt(TUint aWin)const;
+ const TPlacedAttributes* DebugPlacedAt(TUint aWin,TUint aPlace)const;
+//Note: The following methods are currently unused
+// const TPlacedAttributes* DebugPlacedAt(const CWsClientWindow& aWindow,TInt aPlace)const;
+// const RRegion* DebugCacheAt(TInt aWin,TInt aPlace)const;
+ TInt DebugPlacedCountAt(TUint aWin)const;
+
+protected:
+ CWindowElement* FindElement(const CWsClientWindow& aWindow) const;
+
+private:
+ CWindowElementSet(MWsScene& aScene);
+ TInt FindEntry(const CWsClientWindow& aWindow, TInt& aIndex, TBool aLinearSearch = EFalse) const;
+ static TBool WindowMatch(const CWindowElement& aFirst, const CWindowElement& aSecond);
+ static TInt WindowOrder(const CWindowElement& aFirst, const CWindowElement& aSecond);
+ void DestroyWindowElementEntry(const TInt aWinElementIndex);
+
+private:
+ RPointerArray<CWindowElement> iElements;
+ MWsScene& iScene;
+};
+
+/** Gc to element rotation function
+*/
+inline MWsElement::TElementRotation GcToElementRotation(CFbsBitGc::TGraphicsOrientation aGcRotation)
+ {
+ MWsElement::TElementRotation elementRotation = MWsElement::EElementAntiClockwise0;
+
+ switch (aGcRotation)
+ {
+ case CFbsBitGc::EGraphicsOrientationRotated90:
+ elementRotation = MWsElement::EElementAntiClockwise90;
+ break;
+ case CFbsBitGc::EGraphicsOrientationRotated180:
+ elementRotation = MWsElement::EElementAntiClockwise180;
+ break;
+ case CFbsBitGc::EGraphicsOrientationRotated270:
+ elementRotation = MWsElement::EElementAntiClockwise270;
+ break;
+ default:
+ break;
+ }
+ return elementRotation;
+ }
+
+#endif // !defined(__WINDOWELEMENTSET_H__)