windowing/windowserver/nga/SERVER/openwfc/windowelementset.h
author William Roberts <williamr@symbian.org>
Thu, 03 Jun 2010 17:39:46 +0100
branchNewGraphicsArchitecture
changeset 87 0709f76d91e5
parent 0 5d03bc08d59c
permissions -rw-r--r--
Add MMP files to build libOpenVG_sw.lib which uses LINKAS to redirect to libOpenVG.dll (and the same for libEGL_sw.lib and libOpenVGU_sw.lib). Only the libEGL_sw.lib redirection isn't activated - this can't happen until there is a merged libEGL.dll which supports the OpenWF synchronisation and also implements the graphical support functions. The overall aim is to eliminate the *_sw.dll implementations, at least as a compile-time way of choosing a software-only implementation.The correct way to choose is to put the right set of libraries into a ROM with suitable renaming, and in the emulator to use the "switching DLL" technique to pick the right set. As the Symbian Foundation doesn't have any alternative implementations, we don't need the switching DLLs and we can build directly to the correct name.

// 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__)