windowing/windowserver/nga/SERVER/openwfc/wnredraw.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:
// CWsWindowRedraw and associated classes definitions
// 
//

#ifndef __WNREDRAW_H__
#define __WNREDRAW_H__

#include "server.h"
#include "panics.h"

class TSurfaceId;

class CPlaybackGc;
class MWsGraphicsContext;
class TBackgroundAttributes;

//
// Base class defining how a window is redrawn, i.e. Backed up, redraw from client, blanked...
//
class CWsWindowRedraw : public CBase
	{
private:
	enum TStateFlags
		{
		EHasElement=0x01,
		EMayContainElement=0x10,
		};
public:
	~CWsWindowRedraw();
	virtual void ConstructL();
	virtual TBool CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd)=0;
	virtual TRgb BackColor() const=0;
	virtual TBool NeedsRedraw() const=0;
	virtual TBool GetRedrawRect(TRect &aRect) const=0;
	virtual const TRegion &BaseDrawRegion() const;
	virtual void ClipInvalidRegion(const TRect &aRect);
	virtual const TRegion& InvalidArea() const;
	virtual void Resize(const TSize &aSize, const TSize &aOldSize);
	virtual CWsBackedUpWindow *Backup() const;
	virtual void Scroll(const TRect &aClipRect, const TPoint &aOffset,const TRect &aRect);
	virtual void UpdateAnimArea();
	virtual void PrepareForResizeL(const TSize &aSize, TSize &aOldSize);
	virtual void Moved() {}
	virtual void ClearRedrawStore(TBool aClearPendingRedraw=EFalse);
	virtual TBool DrawCommand(CWsGc* aGc,const TAny *aCmdData);
	virtual void GcAttributeChange(CWsGc* aGc,const TAny *aCmdData);
	virtual void GcDeactivate(CWsGc* aGc);
	inline CWsWindow *WsWin();	// Link back to main window class
	virtual void ClientExposing();
	virtual void DrawWindow()=0;
	TInt DrawBackgroundColor(const TRegion& aRegion, TBool aDoFillColor);
	virtual TBool Contains(const TArray<TGraphicDrawerId>& aDrawers,const TRegion& aRegion) const;
	const TRegion * RedrawRegion();
	virtual TBool ReleaseMemory(MWsMemoryRelease::TMemoryReleaseLevel aLevel);
	virtual CFbsDevice* OutputDevice() const;
	virtual void VisibleRegionChange();
	virtual TBool ReadyToDraw() const;
	void PreDrawWindow(MWsGraphicsContext * aGc, const TRegion &aWindowRegion);
	void PostDrawWindow(MWsGraphicsContext* aGc, const TRegion& aWindowChildNodeRegion);
	virtual void Invalidate(const TRect *) {}	
	virtual TInt SizeInBytes() const { return 0; }
	inline TBool HasElement() const;
	inline TBool MayContainElement() const;
	inline void SetHasElement(TBool);
	inline TBool HasElementExtentDefined() const;
	inline void  ClearMayContainElement();
	virtual TBool RedrawingInProgress() const; 
	virtual void WindowClosing();
	virtual TBool IsRedrawStoreEmpty() const { return EFalse; }
	virtual TBool IsBackgroundClearEnabled() const { return ETrue; }
	virtual CFbsBitmap* BitmapFromHandle(TInt /*aHandle*/) const { return NULL; }

	void SetDsaElementL();
	inline void QueueRedraw();
	void Fade(MWsGraphicsContext * aGc, const TRegion& aRegion);
protected:
	CWsWindowRedraw(CWsWindow *aWin);
	void SetReply(TInt aReply);
	void OwnerPanic(TClientPanic aPanic);
	inline CScreen* Screen() const;
	inline CWsClientWindow *CliWin() const;
	void DrawWindowAnimsL(MWsGraphicsContext * aGc, const TRegion& aRegion);
	TBackgroundAttributes& AcquireBackgroundElementL();
	void SetBackgroundSurfaceL(const TSurfaceId& aSurface);
	void SetBackgroundSurfaceL(const TSurfaceConfiguration& aConfiguration, TBool aTriggerRedraw, TBool aAllowScreenSurface);
	void SetElementExtentL(TRect& aNewExtent, TBackgroundAttributes& aAttributes);
	void ElementRedraw(const TRect& aOldExtent, const TRect& aNewExtent, TBool aAlwaysScheduleUpdate);
	void RemoveBackgroundSurface(TBool aTriggerRedraw);
	void RemoveBackgroundElement(TBool aTriggerRedraw);
	void GetBackgroundSurfaceL(TSurfaceConfiguration& aConfiguration);
	void ReleaseBackgroundElement();
	void SetMayContainElementFlags();
private:
	void DoFade(const TRegion& aRegion);
	void DrawWindowAnims(MWsGraphicsContext * aGc, const TRegion& aRegion);
	void DrawCursorAndSprites(MWsGraphicsContext * aGc, const TRegion& aRegion);
	TBool HasDsaElement() const;

protected:
	CWsWindow *iWsWin;	// Link back to main window class
	TUint iStateFlags; 	// Flags affecting how drawing is done
	const TRegion * iRedrawRegion; // During a scheduled draw, this is the window area scheduled to be drawn.
	};							   // In ChangeTracking mode, iRedrawRegion doesn't include the area to be drawn by window-sprites, cursors or window-anims.
								   // All of them use the sprite region, declared in CWsWindow::iDirtySpriteRegion.

class CWsBlankWindow : public CWsWindowRedraw
	{
public:
	CWsBlankWindow(CWsWindow *aWin);
	~CWsBlankWindow();
	void ConstructL();
	
	//from CWsWindowRedraw
	TBool CommandL(TInt aOpcode, TWsWinCmdUnion &aCmd);
	TBool NeedsRedraw() const;
	TBool GetRedrawRect(TRect &aRect) const;
	void DrawWindow();
	
	void SetColor(TRgb aColor);
	inline void SetBackgroundClear();
	inline TBool IsBackgroundColor();
private:
	TRgb BackColor() const;
private:
	TRgb iColor;
	TBool iNoColor;
	};
	
#include "window.h"

inline CWsWindow *CWsWindowRedraw::WsWin()
	{
	return iWsWin;
	}

inline CScreen* CWsWindowRedraw::Screen() const
	{
	return iWsWin->Screen();
	}

inline CWsClientWindow *CWsWindowRedraw::CliWin() const
	{
	return (CWsClientWindow *)iWsWin;
	}

inline TBool CWsWindowRedraw::HasElement() const
	{
	return (iStateFlags&EHasElement)>0;
	}
inline void CWsWindowRedraw::SetHasElement(TBool aSet)
	{
	TInt oldStateFlags = iStateFlags; 
	if (aSet)
		{
		iStateFlags|=EHasElement;
		}
	else
		{
		iStateFlags&=~EHasElement;
		}
	if (oldStateFlags!=iStateFlags)
		{
		iWsWin->SetupVisibleRegionTracking(aSet);
		}
	}

inline TBool CWsWindowRedraw::MayContainElement() const
	{
	return (iStateFlags&EMayContainElement)>0;
	}

inline void CWsWindowRedraw::ClearMayContainElement()
	{
	iStateFlags&=~EMayContainElement;
	}


inline void CWsBlankWindow::SetBackgroundClear()
	{
	iNoColor=ETrue;
	}

inline TBool CWsBlankWindow::IsBackgroundColor()
	{
	return !iNoColor;
	}

inline void CWsWindowRedraw::QueueRedraw()
	{
	if (iWsWin->IsActive())
		{
		iWsWin->WsOwner()->RedrawQueue()->AddInvalid(this);
		}
	}

inline const TRegion * CWsWindowRedraw::RedrawRegion()
	{
	return iRedrawRegion;
	}

#endif