windowing/windowserver/nga/SERVER/ANIM.H
author Matt Plumtree <matt.plumtree@nokia.com>
Fri, 23 Apr 2010 17:57:02 +0100
branchNewGraphicsArchitecture
changeset 39 a4b63488e0b0
parent 0 5d03bc08d59c
permissions -rw-r--r--
Revise some of the compositor performance improvements to improve correctness. Implement pixel blending using a variation of Jim Blinn's no-division blending algorithm. Move transparency type simplification further up the composition code. Remove some unnecessary fields. Output to YUV implementation needs revision as it is actually converting from YUV (copy of source conversion code).

// Copyright (c) 1999-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:
// Definition of classes related to Anim DLL's
// 
//

#ifndef __ANIM_H__
#define __ANIM_H__

#include <e32std.h>
#include <w32adll.h>
#include "server.h"
#include "sprite.h"

class CWsAnimDll : public CWsObject
	{
public:
	static void InitStaticsL();
	static void DeleteStatics();
public:
	CWsAnimDll(CWsClient *owner);
	~CWsAnimDll();
	TInt CreateInstanceL(TUint32 aHandle, TInt aType, TAny *aArgs, TBool aIsWindow);
	void LoadL(const TDesC &aDllName);
	void CommandL(TInt aOpcode, const TAny *aCmdData);
	void Remove(TInt aHandle);
	inline TInt AnimObjectHandle(CWsAnim *aAnimObject) const;
	inline CWsAnim* AnimObjectL(TInt aAnimHandle) const;
	
private:
	TInt doCreateInstanceL(CWsAnim *aInstance, TInt aType, TAny *aArgs, TBool aIsWindow);
private:
	static CObjectConIx *AnimObjectConIx;
private:
	CObjectCon *iInstanceCon;
	CObjectIx *iInstanceIndex;
	CAnimDll *iAnimDll;
	RLibrary iAnimLib;
	
public:
	TSglQueLink iQue;
	};
	
class CWsAnimGc;

class CWsAnim : public CObject, public MAnimGeneralFunctions, public MAnimGeneralFunctionsWindowExtension,
													public MAnimFreeTimerWindowFunctions, public MAnimSpriteFunctions, public MAnimGeneralFunctionsEventExtension,
													public MWsWindowTreeNode
	{
public:
	~CWsAnim();
	void RedrawWindowAnimL(const TTime& aTimeNow, MWsGraphicsContext* aGc, const TRegion* aRegion);
	void AnimateSpriteAnimL(const TTime& aTimeNow);
	void UserDeactivateAnimGc();
	static void WindowClosing(CWsAnim *aWsAnim);
	static void CloseAnim(CWsAnim *aWsAnim);
	TRect BestRect() const;
	void FocusChanged(TBool aNewFocusState);
	void SetMessage(const RMessagePtr2* aMessage);
	TInt CommandReply(TInt aOpcode, TAny* aArgs);
	void SessionPanic() const;
	void Panic() const;
	void Panic(TClientPanic aPanic) const;
	inline CWsAnim * Next();
	inline CWsClientWindow* ClientWindow() const;
	void SendState(MWsWindowTreeObserver& aWindowTreeObserver) const;

private:
	CWsAnim(CWsAnimDll *aDll);
	void Connect(CWsClientWindow *aWindow);
	void Connect(CWsSprite *aSprite);
	void ConstructL(CAnim *aAnim, TAny *aArgs, CWsAnimDll *aAnimDll, TBool aIsWindow);
	inline CAnim *Anim() const;
	const TRect& Rect() const;
	
// Functions from MAnimGeneralFunctions
	TDateTime SystemTime() const;
	TBool FlashStateOn() const;				// Return ETrue if in the on part of the flash cycle

	const CFbsScreenDevice *ScreenDevice();						// Pointer to screen device
	CFbsBitmap *DuplicateBitmapL(TInt aHandle);
	CFbsFont *DuplicateFontL(TInt aHandle);
	void CloseFont(CFbsFont *);
	TAnimSync Sync() const;					// Return the current sync mode
	void Animate(TDateTime *aDateTime);		// Trigger a call to the DLL's Animate function
	void SetSync(TAnimSync aSyncMode);
	void SetInterval(TInt aInterval);		// Set the regular repeat interval, does not affect the current countdown
	void SetNextInterval(TInt aInterval);	// Sets the interval to the next Animate, after that it will fall back to the usual rate
	const RThread &Client();				// Return a reference to the calling clients thread
	void ReplyBuf(const TDesC8 &aDes);
	void ReplyBuf(const TDesC16 &aDes);
	void GetRawEvents(TBool aGetEvents) const;	// Raw events are passed to CAnim::OfferRawEventL
	void PostRawEvent(const TRawEvent &aRawEvent) const;
	void PostKeyEvent(const TKeyEvent &aRawEvent) const;
	const RMessagePtr2* Message();
	TAny* ExtendedInterface(TInt aInterface);
	TInt RegisterForNotifications(TUint32 aNotifications);

// Functions from MAnimGeneralFunctionsWindowExtension
	TInt Screens() const;
	TInt FocusScreens() const;
	void SetFocusScreen(TInt aScreenNo);
	TInt WindowGroups(TInt aScreen) const;
	TBool WindowGroupInfo(TWindowGroupInfo& aInfo,TInt aScreen,TInt aWindowGroup) const;
	TBool WindowGroupName(TPtrC& aWindowName,TInt aScreen,TInt aWindowGroup) const;
	TInt SetOrdinalPosition(TInt aWindowGroupId,TInt aPos,TInt aOrdinalPriority);
	void WindowConfig(TWindowConfig& aWindowConfig) const;	
// Functions from MAnimWindowFunctions
	void ActivateGc();	// Activate the GC to enable drawing in a command or animate function
	void Invalidate(const TRect &aRect);
	void Parameters(TWindowInfo &aData);
	void VisibleRegion(TRegion& aRegion);
 	TSize WindowSize() const;				// Return the window size
	TBool IsHidden();
	void SetVisible(TBool aState);
	void SetRect(const TRect &aRect);		// Sets the rect that this instance wants to draw to.
// Functions from MAnimFreeTimerWindowFunctions
	void DeactivateGc();					// Deactivate the GC after drawing from our own RunL
	void Update();
// Functions from MAnimSpriteFunctions
	TSpriteMember *GetSpriteMember(TInt aMember) const;	//Returns sprite member data
	void UpdateMember(TInt aMember,const TRect& aRect,TBool aFullUpdate);		//redraw of part of a sprite
	void Activate(TBool aActive);		// Turn sprite on or off
	void SizeChangedL();
	void SetPosition(const TPoint &aPos);			//Change the positon of the sprite
	TBool SpriteCanBeSeen() const;
// Functions from MAnimGeneralFunctionsEventExtension
	void PostKeyEvent(const TKeyEvent& aRawEvent,TInt aRepeats) const; //Repeated key events
// Functions from MWsWindowTreeNode
	MWsWindowTreeNode::TType NodeType() const;
	const MWsWindow* Window() const;
	const MWsSprite* Sprite() const;
	const MWsStandardTextCursor* StandardTextCursor() const;
	const MWsWindowGroup* WindowGroup() const;
	const MWsWindowTreeNode* ParentNode() const;

	void ScheduleSelf(const TTimeIntervalMicroSeconds& aFrom);
	void AnimateL(const TTime& aTimeNow, TInt& aFrame, TInt64& aAdjustedStart);
	void RedrawWindowAnimL(MWsGraphicsContext* aGc, const TRegion* aRegion);
	void ReSchedule(const TTime& aTimeNow, const TInt& aFrame, const TInt64& aAdjustedStart);

private:
	CWsClient *iClient;
	TTimeIntervalMicroSeconds iInterval;
	TAnimSync iAnimSync;
	/* Linked list of animated objects attached to a window */
	CWsAnim *iNextWin;
	union 
		{
		CWindowAnim* iWindowAnim; 
		CSpriteAnim* iSpriteAnim; 
		} iAnim;
	CWsAnimGc *iAnimGc;
	CWsAnimDll *iAnimDll;
	CWsClientWindow *iWindow;
	TRect iRect;
	CWsSprite *iSprite;
	const RMessagePtr2* iMessage;
	TWindowInfo::TRegionPair* iRedrawRegionPair;
	friend class CWsAnimDll;
	friend class DllAnimator;
	mutable TBool iAnimAddedInHandler;
	TTime iStartTime;
	TInt iLastFrame;
	enum TFlags
		{
		/** ETrue if this anim accepts advanced pointer events
		   (TRawEvents with pointer number, pointer pressure and proximity info) */
		EAdvancedPointersEnabled,
		EFlashOn,
		EWinAnimConstructed,
		/** This flag is set when this anim is called in the context of CScreenRedraw::OnAnimation
		    i.e. when the screen is in the process of sending a new frame to the display hardware. */
		EInRedraw,
		};
	TBitFlags iBitFlags;
	};

class CAnimFbsFont;

class CWsAnimGc : public CAnimGc
	{
public:
	CWsAnimGc(CWsAnim& aWsAnim);
	~CWsAnimGc();
//
	void Activate(const TRegion* aRegion, MWsGraphicsContext* aGc);
	void Deactivate();
	TBool IsActive() const;
	void UserActivate();
	void UserDeactivate();
// From CGraphicsContext
	virtual CGraphicsDevice* Device() const;
	virtual void SetDrawMode(TDrawMode aDrawingMode);
	virtual void SetClippingRect(const TRect& aRect);
	virtual void CancelClippingRect();
	virtual void CancelClippingRegion();
	virtual void UseFont(const CFont *aFont);
	virtual void DiscardFont();
	virtual void SetUnderlineStyle(TFontUnderline aUnderlineStyle);
	virtual void SetStrikethroughStyle(TFontStrikethrough aStrikethroughStyle);
	virtual void SetWordJustification(TInt aExcessWidth,TInt aNumGaps);
	virtual void SetCharJustification(TInt aExcessWidth,TInt aNumChars);
	virtual void SetPenColor(const TRgb &aColor);
	virtual void SetPenStyle(TPenStyle aPenStyle);
	virtual void SetPenSize(const TSize& aSize);
	virtual void SetBrushColor(const TRgb &aColor);
	virtual void SetBrushStyle(TBrushStyle aBrushStyle);
	virtual void SetBrushOrigin(const TPoint &aOrigin);
	virtual void UseBrushPattern(const CFbsBitmap *aBitmap);
	virtual void DiscardBrushPattern();
	virtual void DrawArc(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd);
	virtual void DrawLine(const TPoint &aPoint1,const TPoint &aPoint2);
	virtual void DrawLineTo(const TPoint &aPoint);
	virtual void DrawLineBy(const TPoint &aPoint);
	virtual void DrawPolyLine(const CArrayFix<TPoint> *aPointList);
	virtual void DrawPolyLine(const TPoint* aPointList,TInt aNumPoints);
	virtual void DrawPie(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd);
	virtual void DrawEllipse(const TRect &aRect);
	virtual void DrawRect(const TRect &aRect);
	virtual void DrawRoundRect(const TRect &aRect,const TSize &aCornerSize);
	virtual void Clear(const TRect &aRect);
	virtual void Clear();
	virtual TInt DrawPolygon(const CArrayFix<TPoint> *aPointList,TFillRule aFillRule);
	virtual TInt DrawPolygon(const TPoint* aPointList,TInt aNumPoints,TFillRule aFillRule=EAlternate);
	virtual void DrawBitmap(const TPoint &aTopLeft, const CFbsBitmap *aSource);
	virtual void DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aSource);
	virtual void DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aSource, const TRect &aSourceRect);
	virtual void DrawBitmapMasked(const TRect &aDestRect, const CFbsBitmap *aBitmap, const TRect &aSrcRect, const CFbsBitmap* aMaskBitmap, TBool aInvertMask);
	virtual void DrawText(const TDesC &aString,const TPoint &aPosition);
	virtual void DrawText(const TDesC &aString,const TRect &aBox,TInt aBaselineOffset,TTextAlign aHoriz=ELeft,TInt aLeftMrg=0);
	virtual void MoveTo(const TPoint &aPoint);
	virtual void MoveBy(const TPoint &aPoint);
	virtual void Plot(const TPoint &aPoint);
	virtual void SetOrigin(const TPoint &aPoint);
	virtual void BitBlt(const TPoint &,const CFbsBitmap *aBitmap);
	virtual void BitBlt(const TPoint &,const CFbsBitmap *aBitmap,const TRect &);
	virtual void BitBltMasked(const TPoint& aPoint,const CFbsBitmap* aBitmap,const TRect& aSourceRect,const CFbsBitmap* aMaskBitmap,TBool aInvertMask);
	virtual void CopyRect(const TPoint& aOffset,const TRect& aRect);
	virtual void Reset();
// Extra command defined in CBitmapContext
	virtual void SetFaded(TBool aFaded);
	virtual void SetFadingParameters(TUint8 aBlackMap,TUint8 aWhiteMap);

	virtual TInt SetClippingRegion(const TRegion &aRegion);	
	virtual TInt AlphaBlendBitmaps(const TPoint& aDestPt, const CFbsBitmap* aSrcBmp, const TRect& aSrcRect, const CFbsBitmap* aAlphaBmp,	const TPoint& aAlphaPt);	
	virtual void MapColors(const TRect &aRect,const TRgb *aColors,TInt aNumPairs,TBool aMapForwards);
	virtual void DrawTextVertical(const TDesC& aText,const TPoint& aPos,TBool aUp);
	virtual void DrawTextVertical(const TDesC& aText,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert=ELeft,TInt aMargin=0);
	
private:
	void CloseCurrentFont();
	virtual void DrawBitmapMasked(const TRect& /*aDestRect*/,const CWsBitmap* /*aBitmap*/,const TRect& /*aSrcRect*/,const CWsBitmap* /*aMaskBitmap*/, TBool /*aInvertMask*/);
	TInt AlphaBlendBitmaps(const TPoint& aDestPt, const CWsBitmap* aSrcBmp,	const TRect& aSrcRect, const CWsBitmap* aAlphaBmp,	const TPoint& aAlphaPt);
private:
	CWsAnim& iOwningWsAnim;
	MWsGraphicsContext* iGc;
	TBool iUserActive;
	const TRegion *iBaseRegion;	// Base clipping region provided on activation
	TBool iUseDrawingRegion;	// Indicates that the user has set a drawing region
	RWsRegion iDrawingRegion;	// Drawing region provided by the user (in screen coordinates)
	TRect iClippingRect;		// Clipping rectangle (in screen coordinates)
	CAnimFbsFont *iFont;
	};

//
// inlines			//
//

inline CAnim *CWsAnim::Anim() const
	{
	if(iWindow)
		return iAnim.iWindowAnim;
	else
		return iAnim.iSpriteAnim;
	}
inline TInt CWsAnimDll::AnimObjectHandle(CWsAnim *aAnimObject) const
	{return(iInstanceIndex->At(aAnimObject));}
inline CWsAnim* CWsAnimDll::AnimObjectL(TInt aAnimHandle) const
	{return STATIC_CAST(CWsAnim*,iInstanceIndex->AtL(aAnimHandle));}
inline CWsAnim* CWsAnim::Next()
	{return iNextWin;}
inline CWsClientWindow* CWsAnim::ClientWindow() const
	{return iWindow;}
#endif