windowing/windowserver/nga/SERVER/openwfc/screen.h
author William Roberts <williamr@symbian.org>
Thu, 03 Jun 2010 17:39:46 +0100
branchNewGraphicsArchitecture
changeset 87 0709f76d91e5
parent 0 5d03bc08d59c
child 97 0e9202c0340c
child 110 7f25ef56562d
child 121 d72fc2aace31
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) 2004-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:
// Defines the screen class (was in scrdev.h)
// 
//

#ifndef __SCREEN_H__
#define __SCREEN_H__

#include <e32std.h>
#include <e32base.h>
#include <graphics/surface.h>
#include <hal_data.h>
#include <graphics/wsscene.h>
#include <graphics/wsdisplaypolicy.h>

#include "W32STD.H"
#include "w32cmd.h"
#include "wstypes.h"
#include <Graphics/WSGRAPHICDRAWERINTERFACE.H>
#include "panics.h"

#include "wsdisplaychangeao.h"


class CWsDirectScreenAccess;

class CWsWindowGroup;
class CWsWindow;
class CWsRootWindow;
class CWsClientWindow;
class CDebugBar;
class CScreenRedraw;
class CWsSpriteManager;
class CWindowElementSet;
class CActiveComposer;
class CRegisteredSurfaceMap;
class MWsScene;
class MWsElement;
class MWsScreenDevice;
class MWsDisplayMapping;
class MWsDisplayControl;
class MWsTextCursor;
class CGraphicsDeviceMap;
class TDisplayConfiguration;
#if defined(__WINS__) && defined(_DEBUG)
class CDebugOsbWin;
#endif

enum TAnimType
	{
	EWindowAnim			= 0x01,
	ESpriteAnim			= 0x02,
	ETextCursor			= 0x04,
	EWindowSprite   	= 0x08,
	EFloatingSprite 	= 0x10,
	EFloatingSpriteAnim = 0x20,
	ECrpAnim			= 0x40,
	};

_LIT(KWSERVIniFileVarChangeTracking, "CHANGETRACKING");

class CScreen : public CBase, public MWsScreen, public MWsScreenConfigList, public MWsScreenConfig, public MWsWindowTree
	{
public:
	enum {EGetScanLineBufLen=0x100};	// Buffer of for returning result of GetScanLine
	enum TDisplayScreen
		{
		EBlankScreenOnRotation = 0x1,
 		EAutoClear = 0x2,
 		EHasDynamicSizeModes = 0x04,
		EChangeTracking = 0x8,
		};
	
	/**
	The fallback map is an array of 32 bit integers sufficiently large to store a single bit for any
	possible orientation and size of the screen, with the pixel rows padded to the end of the int.
	*/
	class CFallbackMap : public CBase
		{
	public:
		static CFallbackMap * NewL(CScreen* aScreen);
		~CFallbackMap();
		
		void Prepare();
		TBool FillRegion(const TRegion& aRegion);
		TBool FillRect(const TRect& aRect);
		TInt Count() const;
		const TRect * Rect() const;
		const RRegion * Region() const;
		TInt Resize(const TSize& aSize);

	private:	
		CFallbackMap(CScreen* aScreen);
		void ConstructL();
		
	public:
		CScreen* iScreen;
		RRegionBuf<1> iRegion;
		TInt iCount;
		TInt iMapSize; // size in padded TInts
		TInt * iMap;
		};
public:
	CScreen();
	~CScreen();
	void ConstructL( const TRect& aDigitiserArea, TInt aScreenNumber);
	void AbortAllDirectDrawing(RDirectScreenAccess::TTerminationReasons aReason);
	void AddDirect(CWsDirectScreenAccess& aDirect);
	void RemoveDirect(CWsDirectScreenAccess& aDirect);
	void AbortDSAs(RDirectScreenAccess::TTerminationReasons aReason,TSglQue<CWsDirectScreenAccess>& aDirects);
	void ReleaseDsaScreenDevice();
	void AcquireDsaScreenDeviceL();
	void CreateDsaScreenDeviceIfSupportedL(TDisplayMode aScreenMode);
	TBool DoCreateDsaScreenDevice(TDisplayMode aScreenMode);
#if defined(_DEBUG)
	TBool IsDirectOnQueue(const CWsDirectScreenAccess* aDirect);
#endif

	inline CWsWindowGroup* FocusWindowGroup();
	void KillForegroundSession();
	void ResetFocus(CWsWindowGroup *aClosingWindow);
	inline TBool BlankScreenOnRotation();
	inline TBool AutoClear();
	void RemoveFromDefaultOwningList(CWsWindowGroup *aDestroyedGroup);
	void SetDefaultOwningWindow(CWsWindowGroup *aGroup);
	inline CWsWindowGroup *DefaultOwningWindowGroup();
	const MWsScreenDevice& ScreenDevice() const;
	const CGraphicsDeviceMap& DeviceMap() const;	
	inline const TSurfaceId& DsaSurface() const;
	inline CWsRootWindow* RootWindow() const;
	inline TInt ScreenNumber() const;
	void UpdateDsa();
	inline TDisplayMode DefaultDisplayMode(const TInt aMode) const;
	TDisplayMode FirstDefaultDisplayMode() const;
	void MaxNumColors(TInt& aColors,TInt& aGrays);
	TInt ColorModesFlag();
	inline void GetFadingParams(TUint8& aBlackMap,TUint8& aWhiteMap) const;
	inline void SetFadingParams(TUint8 aBlackMap,TUint8 aWhiteMap);
	void GetScanLine(const TWsSdCmdGetScanLine *aGetScanLine);

	TBool SetScreenModeEnforcement(TInt aMode);
	inline TInt ScreenSizeMode() const;
	void SetPointerCursorArea(TInt aMode,const TRect& aRect);
	inline TRect GetPointerCursorArea(TInt aMode) const;
	CFbsBitGc::TGraphicsOrientation Orientation() const;
	void CycleDisplaySize();
	TBool UpdateOrientation(MWsScene::TSceneRotation* aOldRotation = NULL);
	void doSetScreenMode(TInt aMode,TBool aInsideStartup=EFalse);
	inline TSize CurrentScreenSize() const;
	TRect DrawableArea() const;
	void CycleOrientation();
	TClientPanic SetModeRotation(TInt aMode,CFbsBitGc::TGraphicsOrientation aRotation);
	void LoadScreenSizesL(TSize aScreenSize);
	void LoadScreenSizeProperties(TDisplayMode aDefaultDisplayMode);
	void SetDigitiserAreas(const TSize& aUiSize);
	inline TInt NumScreenSizeModes() const;
	inline const TSizeMode& ScreenSizeModeData() const;
	inline const TSizeMode& ScreenSizeModeData(TInt aMode) const;
	inline TScreenModeEnforcement SizeEnforcementMode() const;
	void GetScreenSizeAndRotation(TPixelsTwipsAndRotation &aSar, TInt aScreenMode);
	void GetScreenSizeAndRotation(TPixelsAndRotation &aSar, TInt aScreenMode);
	void SetCurrentScreenModeAttributes(const TSizeMode &aModeData);
	TPoint PhysicalToLogical(TPoint aPhysicalPt);
	void IncContrast();
	void DecContrast();
	void IncBrightness();
	void DecBrightness();
	inline TBool IsValidScreenSizeMode(TInt aMode) const;
	TInt GetScreenSizeModeListL();
	// called by CWsGc when it is implementing MWsGc
	const TTime& Now() const;
	void ScheduleAnimation(TAnimType aType, const TRect& aRect,const TTimeIntervalMicroSeconds& aFromNow,const TTimeIntervalMicroSeconds& aFreq,const TTimeIntervalMicroSeconds& aStop, CWsWindow* aWindow);
	TBool IsScheduled(TAnimType aType, const TRect& aRect, CWsWindow* aWindow) const;
	// redraw scheduling code
	void AddRedrawRegion(const TRegion& aRegion, TBool aSchedule = ETrue, TRedrawDepth aDepth = ERedrawAll);
	void ScheduleRender(const TTimeIntervalMicroSeconds& aFromNow);
	void DoRedrawNow();
	void RedrawNowIfPending();
	void ScheduleRegionUpdate(const TRegion* aDefinitelyDirty);
// implementing MWsScreen
	void OnAnimation(TRequestStatus* aFinished);
	void Redraw();
	TBool RedrawInvalid(const TArray<TGraphicDrawerId>& aInvalid);
	inline TBool BackLightFlag();
// implementing interface extension
	TAny* ResolveObjectInterface(TUint aTypeId);
	
// implementing MWsScreenConfig... this might be better as RS interface, but half methods are in here!
	TSize ScreenModeSizeInPixels() const;
	TInt Stride() const;
	TInt SizeMode() const;
	TSize ScalingFactor() const;
	TPoint Origin() const;
	TPoint ScaledOrigin() const;
	
// implementing MWsScreenConfigList
	TInt	GetScreenSizeModeList(RArray<TInt>&aList) const;
	TDisplayMode DisplayModeL(TInt aIndex) const;
	TSize ScreenModeSizeInPixelsL(TInt aIndex) const;
	/** Get screen size in twips for current screen size mode as defined in wsini */
	TSize ScreenModeSizeInTwipsL(TInt aIndex) const;
	CFbsBitGc::TGraphicsOrientation OrientationL(TInt aIndex) const;
	TInt AvailableOrientationsL(TInt aIndex) const;
	TSize ScalingFactorL(TInt aIndex) const;
	TPoint OriginL(TInt aIndex) const;
	TPoint ScaledOriginL(TInt aIndex) const;
	TInt ModeFlagsL(TInt aIndex) const;

//implementing MWsWindowTree
	void SendTree() const;
	
// other public methods

	TDisplayMode DisplayMode() const;
	TSize SizeInPixels() const;
	TSize SizeInTwips() const;
	TSize DSASizeInPixels() const;
	inline CWindowElementSet& WindowElements() const;
 	inline MWsElement& UiElement() const;
	void ElementAdded();
	void ElementRemoved();
	//check if the current display mode has alpha
	inline TBool HasAlpha() const;
	//list of session and surface id
	CRegisteredSurfaceMap* SurfaceMap();

	void DiscardAllSchedules();
	inline CDebugBar * DebugBar();
	inline CFallbackMap * FallbackMap();
	inline CWsSpriteManager* SpriteManager() const;
	TBool IsQuickFadeScheduled( CWsWindow* aWin ) const;
	void RemoveFromQuickFadeList( CWsWindow* aWin );
	void AcceptFadeRequest( CWsWindow* aWin, TBool	aFadeOn );
	TBool HasVisibleDirectOnQueue();
	TBool IsDSAClientWindow( const CWsClientWindow* aWin ) const;
	MWsTextCursor* RenderStageTextCursor() const;
	void ClearDsaSurface(const TRect& area, const TRgb& color);
	void PositionUiElements(const TRect& aExtent,	const TRect& aViewport);
	TInt SetConfiguration(const TDisplayConfiguration& aConfig);
	void UpdateDynamicScreenModes();
	void RecalculateModeTwips(const TDisplayConfiguration* aConfig = NULL);
	inline void IncreaseDisplaySpinner();
	inline void IncreaseConfigSpinner();
	inline TInt DisplaySpinner();
	inline TInt ConfigSpinner();
	TInt AddNotificationClient(CWsClient *aClient);
	void RemoveNotificationClient(CWsClient *aClient);
	TInt FindNotificationClient (CWsClient *aClient);
	TInt GetNotificationClients(RPointerArray<CWsClient>& aClientsArray);
	inline MWsDisplayPolicy* DisplayPolicy();
	inline MWsDisplayMapping* DisplayMapping();

	//CR1577
	inline TBool ChangeTracking() const;
	inline MWsWindowTreeObserver* WindowTreeObserver() const;
	inline MWsDrawAnnotationObserver* DrawAnnotationObserver() const;
	inline MWsWindowVisibilityNotifier* WindowVisibilityNotifier() const;
	void ScheduleWindow(CWsWindow* aWindow);
	void RemoveFromScheduledList(CWsWindow* aWindow);
	void RemoveFromTimedDrawList(CWsWindow* aWindow);
	void SetupVisibleRegionTracking(CWsWindow& aWindow, TBool aRegister) const;
	
	TBool IsAnimating() const;
	
private:
	class TInternalSizeMode: public TSizeMode
		{
	public:
		inline TInternalSizeMode(){}
		inline TInternalSizeMode(TSize& aSize)
			:	TSizeMode(aSize), iFlags(0)
			{	}
		TInt iFlags;
		};
	enum TSyncConsts
		{
		KDSAAbortingImmediateRespAwaitFrameMicrosec = 80000		// 0.08 sec
		};
	void SetInitialScreenSizeModeAndRotation();
	CWsWindowGroup* FindNewFocus(CWsRootWindow* aRootWindow);
	void UpdateCompositionMode();
	void InitializeSceneL();
	void InitializeUiElementsL();
	TInt InitializeDsaSurface();
	void LoadScreenRotationProperties(TInternalSizeMode& aMode, const TInt aModeIndex);
	void LoadScreenTwipsProperties(TInternalSizeMode& aMode, const TInt aModeIndex);
	void CreateFallbackMapL();
	MWsElement* CreateUiElementL(const TRect& aExtent);
	const TInternalSizeMode* ModePtrL(TInt aIndex) const;
	void ApplyRemainingWsiniSettingsL();
private:
	enum
		{
		eTimerCreated=0x1,
		};
	enum TDsaDrawState
		{
		EDsaDrawStateIdle,
		EDsaDrawStateDrawing
		};
private:
	TSglQue<CWsDirectScreenAccess> iDirects;
	RTimer iTimer;
	TRequestStatus iTimerStatus;
	TUint iFlags;

	CScreenRedraw* iRedraw;

	CWsRootWindow* iRootWindow;
	CWsWindowGroup *iCurrentFocus;
	CWsWindowGroup *iDefaultOwningWindow;

	MWsScreenDevice* iScreenDevice;
	CFbsScreenDevice* iDsaDevice;
	CFbsBitGc* iDsaGc;
	CGraphicsDeviceMap* iDeviceMap;
// Size and rotation members
	RPointerArray<TInternalSizeMode> *iModes;
	TInt iScreenSizeMode;
	TScreenModeEnforcement iSizeEnforcementMode;
	TInt iScreenNumber;
	TInt iMaxContrast;
	TInt iMaxBrightness;
	TInt iNumScreenSizeModes;
	TInt iNumSupportedScreenSizeModes;
	TInt iNumberDrawingDsa;
	TBool iBackLightFlag;
	
	TDsaDrawState iDsaDrawState;
	
	MWsDisplayMapping* iDisplayMapping;
	MWsDisplayControl* iDisplayControl;
	MWsDisplayPolicy* iDisplayPolicy;
	MWsScene* iScene;
	CWindowElementSet* iWindowElementSet;
	MWsElement* iUiElement;
	TSurfaceId iDsaSurface;
	CRegisteredSurfaceMap* iSurfaceMap;

	CDebugBar* iDebugBar;
	CFallbackMap* iFallbackMap;
	TUint8 iBlackMap;
	TUint8 iWhiteMap;
	CWsSpriteManager* iSpriteManager;
	//The next three interfaces should be provided by renderstages if the screen is to be used in CHANGETRACKING mode
	MWsWindowTreeObserver* iWindowTreeObserver;
	MWsDrawAnnotationObserver* iDrawAnnotationObserver;
	MWsWindowVisibilityNotifier* iWindowVisibilityNotifier;

#if defined(__WINS__) && defined(_DEBUG)
	CDebugOsbWin* iDebugWin;
#endif
	CWsDisplayChangeNotifier* iDisplayChangeNotifier;
	CWsConfigChangeNotifier* iConfigChangeNotifier;
	TInt iDisplayChangeSpinner;
	TInt iConfigChangeSpinner;
	RPointerArray<CWsClient> iWsClientList; 
	TRect iDigitiserArea;
	};



//
// inlines			//
//

//
// CScreen
//

inline CWsWindowGroup* CScreen::FocusWindowGroup()
	{return(iCurrentFocus);}
inline TBool CScreen::BlankScreenOnRotation()
	{return(iFlags&EBlankScreenOnRotation);}
inline TBool CScreen::AutoClear()
	{return(iFlags&EAutoClear);}
inline CWsWindowGroup* CScreen::DefaultOwningWindowGroup()
	{return(iDefaultOwningWindow);}
inline const TSurfaceId& CScreen::DsaSurface() const
	{return iDsaSurface;}

inline CWsRootWindow* CScreen::RootWindow() const
	{return iRootWindow;}
inline TInt CScreen::ScreenNumber() const
	{return iScreenNumber;}
//
inline TInt CScreen::ScreenSizeMode() const
	{return(iScreenSizeMode);}
inline TRect CScreen::GetPointerCursorArea(TInt aMode) const
	{return (*iModes)[aMode]->iPointerCursorArea;}
inline TSize CScreen::CurrentScreenSize() const
	{return (*iModes)[iScreenSizeMode]->iScreenSize;}
inline TInt CScreen::NumScreenSizeModes() const
	{return iNumScreenSizeModes;}
inline const TSizeMode& CScreen::ScreenSizeModeData() const
	{return *(*iModes)[iScreenSizeMode];}
inline const TSizeMode& CScreen::ScreenSizeModeData(TInt aMode) const
	{return *(*iModes)[aMode];}
inline TDisplayMode CScreen::DefaultDisplayMode(const TInt aMode) const
	{return (*iModes)[aMode]->iDefaultDisplayMode;}
inline TScreenModeEnforcement CScreen::SizeEnforcementMode() const
	{return iSizeEnforcementMode;}
inline TBool CScreen::IsValidScreenSizeMode(TInt aMode) const
	{return (aMode>=0 && aMode<iModes->Count() && (*iModes)[aMode]!=NULL);}
inline TBool CScreen::BackLightFlag()
	{return iBackLightFlag;}

inline TBool CScreen::HasAlpha() const
	{return (0x3 & (0x1 << (EColor16MAP - DisplayMode())));} //currently it is just EColor16MA Or EColor16MAP

inline CWindowElementSet& CScreen::WindowElements() const
	{
	return *iWindowElementSet;
	}

inline MWsElement& CScreen::UiElement() const
    {
    return *iUiElement;
    }

inline CDebugBar * CScreen::DebugBar()
	{return iDebugBar;}
inline CScreen::CFallbackMap * CScreen::FallbackMap()
	{return iFallbackMap;}
	
inline void CScreen::GetFadingParams(TUint8& aBlackMap,TUint8& aWhiteMap) const
    {aBlackMap=iBlackMap;aWhiteMap=iWhiteMap;}
inline void CScreen::SetFadingParams(TUint8 aBlackMap,TUint8 aWhiteMap)
	{iBlackMap=aBlackMap;iWhiteMap=aWhiteMap;}
inline CWsSpriteManager* CScreen::SpriteManager() const
	{return iSpriteManager;}
inline MWsWindowTreeObserver* CScreen::WindowTreeObserver() const
	{return iWindowTreeObserver;}
inline MWsDrawAnnotationObserver* CScreen::DrawAnnotationObserver() const
	{return iDrawAnnotationObserver;}
inline MWsWindowVisibilityNotifier* CScreen::WindowVisibilityNotifier() const
	{return iWindowVisibilityNotifier;}
inline TBool CScreen::ChangeTracking() const
	{return iFlags&EChangeTracking;}
inline void CScreen::IncreaseDisplaySpinner()
	{iDisplayChangeSpinner++;}
inline void CScreen::IncreaseConfigSpinner()
	{iConfigChangeSpinner++;}
inline TInt CScreen::DisplaySpinner()
	{return iDisplayChangeSpinner;}
inline TInt CScreen::ConfigSpinner()
	{return iConfigChangeSpinner;}
inline MWsDisplayPolicy* CScreen::DisplayPolicy()
	{return iDisplayPolicy;}
inline MWsDisplayMapping* CScreen::DisplayMapping()
	{return iDisplayMapping;}
#endif