williamr@2: // Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2: // All rights reserved.
williamr@2: // This component and the accompanying materials are made available
williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2: // which accompanies this distribution, and is available
williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2: //
williamr@2: // Initial Contributors:
williamr@2: // Nokia Corporation - initial contribution.
williamr@2: //
williamr@2: // Contributors:
williamr@2: //
williamr@2: // Description:
williamr@2: //
williamr@2: 
williamr@2: #if !defined(__GULSPRITE_H__)
williamr@2: #define __GULSPRITE_H__
williamr@2: 
williamr@2: #include <w32std.h>
williamr@2: #include <gulicon.h>
williamr@2: 
williamr@2: class CWindowToBitmapMappingGc;
williamr@2: 
williamr@2: class CSpriteSet : public CBase
williamr@2: /**
williamr@2: The CSpriteSet class allows a window server sprite to be drawn to a window.  The class
williamr@2: supports storage of any number of bitmap/mask pairs, though allowing only one of these
williamr@2: bitmap/mask members to be displayed at any one time.  The client of this class should
williamr@2: provide the source bitmap/mask pairs which can be resized to fit a specified rectangle.
williamr@2: Also provided for at runtime is the ability to draw onto the sprite as though it were a
williamr@2: regular CWindowGc and using the same coordinate offsets as the window it exists in.
williamr@2: 
williamr@2: @publishedPartner 
williamr@2: @released 
williamr@2: */
williamr@2: 	{
williamr@2: public:
williamr@2: 	enum TSpriteResizeMode
williamr@2: 		{
williamr@2: 		ENoResizing,
williamr@2: 		EResizeHorizToFit,
williamr@2: 		EResizeVertToFit,
williamr@2: 		EResizeHorizAndVertToFit
williamr@2: 		};
williamr@2: public:
williamr@2: 	// methods for creation of the sprite set
williamr@2: 	IMPORT_C static CSpriteSet* NewL(RWindowTreeNode& aWindow, RWsSession& aWs, CWsScreenDevice& aDevice, CGulIcon* aSpriteSetMember, TBool aInvertMask);
williamr@2: 	IMPORT_C static CSpriteSet* NewLC(RWindowTreeNode& aWindow, RWsSession& aWs, CWsScreenDevice& aDevice, CGulIcon* aSpriteSetMember, TBool aInvertMask);
williamr@2: 	IMPORT_C void AddMemberL(CGulIcon* aSpriteSetMember);
williamr@2: 	IMPORT_C void RemoveMember(TInt aSpriteSetMemberIndex);
williamr@2: 	// methods for preparing and using a sprite in the set
williamr@2: 	IMPORT_C void PrepareSpriteForDisplayL(TInt aSpriteType, const TPoint& aSpritePos, const TSize& aSpriteSize, TSpriteResizeMode aSpriteResizeMode);
williamr@2: 	IMPORT_C void StartDisplayingSpriteL();
williamr@2: 	IMPORT_C void StopDisplayingSprite();
williamr@2: 	IMPORT_C CWindowGc* SpriteGc() const;
williamr@2: 	IMPORT_C void TranslateSpritePosition(const TPoint& aSpritePos);
williamr@2: 	IMPORT_C void SetClippingRect(const TRect& aRect);
williamr@2: public:
williamr@2: 	~CSpriteSet();
williamr@2: private:
williamr@2: 	enum TInternalSpriteResizeMode
williamr@2: 		{
williamr@2: 		EHSameVSame,
williamr@2: 		EHSameVShrink,
williamr@2: 		EHSameVStretch,
williamr@2: 		EHShrinkVSame,
williamr@2: 		EHShrinkVShrink,
williamr@2: 		EHShrinkVStretch,
williamr@2: 		EHStretchVSame,
williamr@2: 		EHStretchVShrink,
williamr@2: 		EHStretchVStretch
williamr@2: 		};
williamr@2: private:
williamr@2: 	CSpriteSet(TBool aInvertMask);
williamr@2: 	void ConstructL(RWindowTreeNode& aWindow, RWsSession& aWs, CWsScreenDevice& aDevice);
williamr@2: 	void CreateSpriteMember();
williamr@2: 	void AdjustSpriteSizeAccordingToResizeMode(TSize& aTargetSize, const TSize& aSourceSize, TSpriteResizeMode aSpriteResizeMode) const;
williamr@2: 	void ComputeInternalResizeMode(TInternalSpriteResizeMode& aInternalSpriteResizeMode, TSpriteResizeMode aSpriteResizeMode, const TSize& aSourceSize, const TSize& aSpriteSize) const;
williamr@2: 	void RenderSprite(TInt aSpriteType, TInternalSpriteResizeMode aInternalSpriteResizeMode, const TSize& aSourceSize, const TSize& aSpriteSize);
williamr@2: private:
williamr@2: 	enum TFlags
williamr@2: 		{
williamr@2: 		EMaskIsInverted				=0x01,
williamr@2: 		ESpriteIsCurrentlyDisplayed	=0x02
williamr@2: 		};
williamr@2: private:
williamr@2: 	RPointerArray<CGulIcon> iSourceMembers;
williamr@2: 	CWsBitmap* iTargetBitmap;
williamr@2: 	CWsBitmap* iTargetMaskBitmap;
williamr@2: 	RWsSprite iSprite;
williamr@2: 	TSpriteMember iSpriteMember;
williamr@2: 	CWindowToBitmapMappingGc* iWindowToBitmapMappingGc;
williamr@2: 	CFbsBitGc* iMainFbsBitGc;
williamr@2: 	CFbsBitGc* iMaskFbsBitGc;
williamr@2: 	CFbsBitmapDevice* iMainBmpDevice;
williamr@2: 	CFbsBitmapDevice* iMaskBmpDevice;
williamr@2: 	TPoint iSpritePosition;
williamr@2: 	TRect iClippingRect;
williamr@2: 	TInt iFlags;
williamr@2: 	};
williamr@2: 
williamr@2: #endif