diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/inc/CommandBuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/inc/CommandBuffer.h Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,349 @@ +// 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: +// + +#ifndef __COMMANDBUFFER_H__ +#define __COMMANDBUFFER_H__ + +#include +#include +#include + +class CBitmapCache; +class CFontsCache; +class CDrawableCacheBase; +class CDrawSection; +class MWsGraphicsContext; + +/** +MWsGraphicResolver should be implemented by CWsGraphicDrawers that want to be able to play DrawWsGraphic drawcommands. +@publishedPartner +@released*/ +class MWsGraphicResolver + { +public: + /** + This method is called when a DrawWsGraphics drawcommand is played by the commandbuffer. The CWsGraphicDrawer that + implements this method needs to resolve the WsGraphics from the MWsGraphicDrawerEnvironment and then draw it. + + @param aId The id of the WsGraphic. + @param aIsUid If ETrue the WsGraphic has a uid. + @param aRect The rect to draw the WsGraphic in. + @param aData Data passed along with the DrawWsGraphic command. + */ + virtual void DrawWsGraphic(TInt aId, TBool aIsUid, const TRect& aRect, const TDesC8& aData) const = 0; + }; + +/** +The commandbuffer can record and play drawcommands. +It has an array of CDrawSections which contains information about every redraw that has been recorded. +@publishedPartner +@released*/ +NONSHARABLE_CLASS(CCommandBuffer): public CBase + { +public: + IMPORT_C static CCommandBuffer* NewL(); + IMPORT_C ~CCommandBuffer(); + IMPORT_C void InternalizeL(const TDesC8& aBuf); + IMPORT_C void InternalizeAppendL(const TDesC8& aBuf); + IMPORT_C const TRegion& ClippingRegion() const; + IMPORT_C TInt Play(const TPoint& aPosition, const TRect& aSourceRect, const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aBitmapContext); + IMPORT_C TInt Play(const TPoint& aMasterOrigin, const TRegion * aMasterClippingRegion, const TRect& aMasterClippingRect, const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aContext); + IMPORT_C TInt Play(const TPoint& aOffset, const TRegion* aClippingRegion, const TRect& aSourceRect, const MWsGraphicResolver& aWsGraphicResolver, MWsGraphicsContext& aGraphicsContext); + IMPORT_C TInt Play(const TPoint& aOffset, const TRegion* aClippingRegion, const TRect& aSourceRect, RWsSession& aWsSession, CWindowGc& aWindowGc); + + IMPORT_C TBool IsIdentical(const CCommandBuffer& aBuffer) const; + void ExternalizeL(RWsGraphicMsgBuf& aMsgBuf, TBool aEntireBuffer); + void Reset(); + void Prepare(const TRect& aDrawRect); + TInt Finish(const TRect& aDrawRect, const TRect& aBoundingRect, TBool aHasBitmapCommand); + + template void Write(const TClass& aValue); + void WriteText(const TDesC16 &aText); + void WriteText(const TDesC8 &aText); + +private: + void ConstructL(); + CCommandBuffer(); + + // Help methods + void Tidy(); + TBool AllSectionsExternalized() const; + TBool CheckForDuplicate(const CDrawSection& aDrawSection) const; + void UpdateClippingRegion(TInt aDrawSectionIndex); + // Reading writing + void Write(const TUint8* aSrc, TUint aLength); + void DoWriteTextL(const TDesC8 &aText); + void ReadL(TUint8* aDest, TUint aLength); + template void ReadL(TClass& aValue); + void ReadTextLC(TPtrC8& aText); + void ReadTextLC(TPtrC16& aText); + void DoReadTextLC(TPtrC8& aText,TBool a16Bit); + + // Drawing the commands +#ifdef SYMBIAN_GRAPHICS_GCE + template void DoPlayL(const MWsGraphicResolver& aWsGraphicResolver, ContextType& aGraphicsContext); + template void DrawSectionL(const CDrawSection& aDrawSection, const MWsGraphicResolver& aWsGraphicResolver, ContextType& aGraphicsContext); +#else + void DoPlayL(const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aBitmapContext); + void DrawSectionL(const CDrawSection& aDrawSection, const MWsGraphicResolver& aWsGraphicResolver, CBitmapContext& aBitmapContext); +#endif +#if defined(SYMBIAN_GRAPHICS_GCE) + template void Clear(ContextType& aGraphicsContext) const; + template void ClearRectL(ContextType& aGraphicsContext); + template void CopyRectL(ContextType& aGraphicsContext); + template void BitBlt1L(ContextType& aGraphicsContext); + void DoBitBlt1L(CWindowGc& aWindowGc, TPoint aPoint, TInt aHandle); + void DoBitBlt1L(MWsGraphicsContext& aGraphicsContext, TPoint aPoint, TInt aHandle); + template void BitBlt2L(ContextType& aGraphicsContext); + void DoBitBlt2L(CWindowGc& aWindowGc, TPoint aPoint, TInt aHandle, TRect aSourceRect); + void DoBitBlt2L(MWsGraphicsContext& aGraphicsContext, TPoint aPoint, TInt aHandle, TRect aSourceRect); + template void BitBltMaskedL(ContextType& aGraphicsContext); + void DoBitBltMaskedL(CWindowGc& aWindowGc, TPoint aPoint, TInt aBitmapHandle, TRect aSourceRect, TInt aMaskHandle, TBool aInvertMask); + void DoBitBltMaskedL(MWsGraphicsContext& aGraphicsContext, TPoint aPoint, TInt aBitmapHandle, TRect aSourceRect, TInt aMaskHandle, TBool aInvertMask); + void SetFadedL(CWindowGc& aWindowGc); + void SetFadingParametersL(CWindowGc& aWindowGc); + template void AlphaBlendBitmapsL(ContextType& aGraphicsContext); + void DoAlphaBlendBitmapsL(CWindowGc& aWindowGc, TPoint aDestPoint, TInt aSrcHandle, TRect aSourceRect, TInt aAlphaHandle, TPoint aAlphaPoint); + void DoAlphaBlendBitmapsL(MWsGraphicsContext& aGraphicsContext, TPoint aDestPoint, TInt aSrcHandle, TRect aSourceRect, TInt aAlphaHandle, TPoint aAlphaPoint); + template void SetOriginL(ContextType& aGraphicsContext); + template void SetDrawModeL(ContextType& aGraphicsContext); + void DoSetDrawModeL(CWindowGc& aWindowGc, CGraphicsContext::TDrawMode aDrawMode); + void DoSetDrawModeL(MWsGraphicsContext& aGraphicsContext, CGraphicsContext::TDrawMode aDrawMode); + template void SetClippingRectL(ContextType& aGraphicsContext); + template void CancelClippingRect(ContextType& aGraphicsContext); + void Reset(CWindowGc& aWindowGc); + void Reset(MWsGraphicsContext& aGraphicsContext); + template void UseFontL(ContextType& aGraphicsContext); + void DoUseFontL(CWindowGc& aWindowGc, TInt aFontHandle); + void DoUseFontL(MWsGraphicsContext& aGraphicsContext, TInt aFontHandle); + void DiscardFont(CWindowGc& aWindowGc) const; + void DiscardFont(MWsGraphicsContext& aGraphicsContext) const; + template void SetUnderlineStyleL(ContextType& aGraphicsContext); + void DoSetUnderlineStyleL(CWindowGc& aWindowGc, TFontUnderline aUnderlineStyle); + void DoSetUnderlineStyleL(MWsGraphicsContext& aGraphicsContext, TFontUnderline aUnderlineStyle); + template void SetStrikethroughStyleL(ContextType& aGraphicsContext); + void DoSetStrikethroughStyleL(CWindowGc& aWindowGc, TFontStrikethrough aStrikethroughStyle); + void DoSetStrikethroughStyleL(MWsGraphicsContext& aGraphicsContext, TFontStrikethrough aStrikethroughStyle); + template void SetWordJustificationL(ContextType& aGraphicsContext); + template void SetCharJustificationL(ContextType& aGraphicsContext); + template void SetPenColorL(ContextType& aGraphicsContext); + template void SetPenStyleL(ContextType& aGraphicsContext); + void DoSetPenStyleL(CWindowGc& aWindowGc, CGraphicsContext::TPenStyle aPenStyle); + void DoSetPenStyleL(MWsGraphicsContext& aGraphicsContext, CGraphicsContext::TPenStyle aPenStyle); + template void SetPenSizeL(ContextType& aGraphicsContext); + void DoSetPenSizeL(CWindowGc& aWindowGc, TSize aSize); + void DoSetPenSizeL(MWsGraphicsContext& aGraphicsContext, TSize aSize); + template void SetBrushColorL(ContextType& aGraphicsContext); + template void SetBrushStyleL(ContextType& aGraphicsContext); + void DoSetBrushStyleL(CWindowGc& aWindowGc, CGraphicsContext::TBrushStyle aBrushStyle); + void DoSetBrushStyleL(MWsGraphicsContext& aGraphicsContext, CGraphicsContext::TBrushStyle aBrushStyle); + template void SetBrushOriginL(ContextType& aGraphicsContext); + template void UseBrushPatternL(ContextType& aGraphicsContext); + void DoUseBrushPatternL(CWindowGc& aWindowGc, TInt aDeviceHandle); + void DoUseBrushPatternL(MWsGraphicsContext& aGraphicsContext, TInt aDeviceHandle); + void DiscardBrushPattern(CWindowGc& aWindowGc) const; + void DiscardBrushPattern(MWsGraphicsContext& aGraphicsContext) const; + template void MoveToL(ContextType& aGraphicsContext); + template void MoveByL(ContextType& aGraphicsContext); + template void PlotL(ContextType& aGraphicsContext); + template void DrawArcL(ContextType& aGraphicsContext); + template void DrawLineL(ContextType& aGraphicsContext); + template void DrawLineToL(ContextType& aGraphicsContext); + template void DrawLineByL(ContextType& aGraphicsContext); + void DrawPolyLineL(CWindowGc& aWindowGc); + void DrawPolyLineL(MWsGraphicsContext& aGraphicsContext); + template void DrawPieL(ContextType& aGraphicsContext); + template void DrawEllipseL(ContextType& aGraphicsContext); + template void DrawRectL(ContextType& aGraphicsContext); + template void DrawRoundRectL(ContextType& aGraphicsContext); + void DrawPolygonL(CWindowGc& aWindowGc); + void DrawPolygonL(MWsGraphicsContext& aGraphicsContext); + void DrawBitmap1L(CWindowGc& aWindowGc); + void DrawBitmap1L(MWsGraphicsContext& aGraphicsContext); + template void DrawBitmap2L(ContextType& aGraphicsContext); + void DoDrawBitmap2L(CWindowGc& aWindowGc, TRect aDestRect, TInt aBitmapHandle); + void DoDrawBitmap2L(MWsGraphicsContext& aGraphicsContext, TRect aDestRect, TInt aBitmapHandle); + template void DrawBitmap3L(ContextType& aGraphicsContext); + void DoDrawBitmap3L(CWindowGc& aWindowGc, TRect aDestRect, TInt aBitmapHandle, TRect aSourceRect); + void DoDrawBitmap3L(MWsGraphicsContext& aGraphicsContext, TRect aDestRect, TInt aBitmapHandle, TRect aSourceRect); + template void DrawBitmapMaskedL(ContextType& aGraphicsContext); + void DoDrawBitmapMaskedL(CWindowGc& aWindowGc, TRect aDestRect, TInt aBitmapHandle, TRect aSourceRect, TInt aMaskHandle, TBool aInvertedMask); + void DoDrawBitmapMaskedL(MWsGraphicsContext& aGraphicsContext, TRect aDestRect, TInt aBitmapHandle, TRect aSourceRect, TInt aMaskHandle, TBool aInvertedMask); + template void DrawText1L(ContextType& aGraphicsContext); + void DoDrawText1L(CWindowGc& aWindowGc, TPtrC16 aText, TPoint aPoint); + void DoDrawText1L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, TPoint aPoint); + template void DrawText2L(ContextType& aGraphicsContext); + void DoDrawText2L(CWindowGc& aWindowGc, TPtrC16 aText, TRect aBox, TInt aBaselineOffset, CGraphicsContext::TTextAlign aHoriz, TInt aLeftMargin); + void DoDrawText2L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, TRect aBox, TInt aBaselineOffset, CGraphicsContext::TTextAlign aHoriz, TInt aLeftMargin); + template void DrawText3L(ContextType& aGraphicsContext); + void DoDrawText3L(CWindowGc& aWindowGc, TPtrC16 aText, TPoint aPoint); + void DoDrawText3L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, TPoint aPoint); + template void DrawText4L(ContextType& aGraphicsContext); + void DoDrawText4L(CWindowGc& aWindowGc, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TPoint aPoint); + void DoDrawText4L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TPoint aPoint); + template void DrawText5L(ContextType& aGraphicsContext); + void DoDrawText5L(CWindowGc& aWindowGc, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TRect aBox, TInt aBaselineOffset, CGraphicsContext::TTextAlign aHoriz, TInt aLeftMargin); + void DoDrawText5L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TRect aBox, TInt aBaselineOffset, CGraphicsContext::TTextAlign aHoriz, TInt aLeftMargin); + template void MapColorsL(ContextType& aGraphicsContext); + template void SetClippingRegionL(ContextType& aGraphicsContext); + template void CancelClippingRegion(ContextType& aGraphicsContext); + void DoCancelClippingRegion(CWindowGc& aWindowGc); + void DoCancelClippingRegion(MWsGraphicsContext& aGraphicsContext); + template void DrawTextVertical1L(ContextType& aGraphicsContext); + void DoDrawTextVertical1L(CWindowGc& aWindowGc, TPtrC16 aText, TPoint aPoint, TBool aUp); + void DoDrawTextVertical1L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, TPoint aPoint, TBool aUp); + template void DrawTextVertical2L(ContextType& aGraphicsContext); + void DoDrawTextVertical2L(CWindowGc& aWindowGc, TPtrC16 aText, TRect aBox, TInt aBaselineOffset, TBool aUp, CGraphicsContext::TTextAlign aVertical, TInt aMargin); + void DoDrawTextVertical2L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, TRect aBox, TInt aBaselineOffset, TBool aUp, CGraphicsContext::TTextAlign aVertical, TInt aMargin); + template void DrawTextVertical3L(ContextType& aGraphicsContext); + void DoDrawTextVertical3L(CWindowGc& aWindowGc, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TPoint aPoint, TBool aUp); + void DoDrawTextVertical3L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TPoint aPoint, TBool aUp); + template void DrawTextVertical4L(ContextType& aGraphicsContext); + void DoDrawTextVertical4L(CWindowGc& aWindowGc, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TRect aBox, TInt aBaselineOffset, TBool aUp, CGraphicsContext::TTextAlign aVertical, TInt aMargin); + void DoDrawTextVertical4L(MWsGraphicsContext& aGraphicsContext, TPtrC16 aText, CGraphicsContext::TTextParameters aParam, TRect aBox, TInt aBaselineOffset, TBool aUp, CGraphicsContext::TTextAlign aVertical, TInt aMargin); + void DrawWsGraphic1L(const MWsGraphicResolver& aWsGraphicResolver); + void DrawWsGraphic2L(const MWsGraphicResolver& aWsGraphicResolver); + template void SetShadowColorL(ContextType& aGraphicsContext); + void DoSetShadowColorL(CWindowGc& aWindowGc, TRgb aShadowColor); + void DoSetShadowColorL(MWsGraphicsContext& aGraphicsContext, TRgb aShadowColor); + template void DrawResourceToPosL(ContextType& aGraphicsContext); + template void DrawResourceToRectL(ContextType& aGraphicsContext); + template void DrawResourceFromRectToRectL(ContextType& aGraphicsContext); + template void DrawResourceWithDataL(ContextType& aGraphicsContext); + void DoDrawResourceToPos(CWindowGc& aGraphicsContext, const TAny* aDrawableSource, const TPoint& aPos, CWindowGc::TGraphicsRotation aRotation); + void DoDrawResourceToRect(CWindowGc& aGraphicsContext, const TAny* aDrawableSource, const TRect& aRect, CWindowGc::TGraphicsRotation aRotation); + void DoDrawResourceFromRectToRect(CWindowGc& aGraphicsContext, const TAny* aDrawableSource, const TRect& aRectDest, const TRect& aRectSrc, CWindowGc::TGraphicsRotation aRotation); + void DoDrawResourceWithData(CWindowGc& aGraphicsContext, const TAny* aDrawableSource, const TRect& aRect, const TDesC8& aParam); + void DoDrawResourceToPos(MWsGraphicsContext& aGraphicsContext, const TAny* aDrawableSource, const TPoint& aPos, CWindowGc::TGraphicsRotation aRotation); + void DoDrawResourceToRect(MWsGraphicsContext& aGraphicsContext, const TAny* aDrawableSource, const TRect& aRect, CWindowGc::TGraphicsRotation aRotation); + void DoDrawResourceFromRectToRect(MWsGraphicsContext& aGraphicsContext, const TAny* aDrawableSource, const TRect& aRectDest, const TRect& aRectSrc, CWindowGc::TGraphicsRotation aRotation); + void DoDrawResourceWithData(MWsGraphicsContext& aGraphicsContext, const TAny* aDrawableSource, const TRect& aRect, const TDesC8& aParam); +#else //SYMBIAN_GRAPHICS_GCE + void Clear(CBitmapContext& aBitmapContext) const; + void ClearRectL(CBitmapContext& aBitmapContext); + void CopyRectL(CBitmapContext& aBitmapContext); + void BitBlt1L(CBitmapContext& aBitmapContext); + void BitBlt2L(CBitmapContext& aBitmapContext); + void BitBltMaskedL(CBitmapContext& aBitmapContext); + void SetFadedL(CBitmapContext& aBitmapContext); + void SetFadingParametersL(CBitmapContext& aBitmapContext); + void AlphaBlendBitmapsL(CBitmapContext& aBitmapContext); + void SetOriginL(CBitmapContext& aBitmapContext); + void SetDrawModeL(CBitmapContext& aBitmapContext); + void SetClippingRectL(CBitmapContext& aBitmapContext); + void CancelClippingRect(CBitmapContext& aBitmapContext); + void Reset(CBitmapContext& aBitmapContext); + void UseFontL(CBitmapContext& aBitmapContext); + void DiscardFont(CBitmapContext& aBitmapContext) const; + void SetUnderlineStyleL(CBitmapContext& aBitmapContext); + void SetStrikethroughStyleL(CBitmapContext& aBitmapContext); + void SetWordJustificationL(CBitmapContext& aBitmapContext); + void SetCharJustificationL(CBitmapContext& aBitmapContext); + void SetPenColorL(CBitmapContext& aBitmapContext); + void SetPenStyleL(CBitmapContext& aBitmapContext); + void SetPenSizeL(CBitmapContext& aBitmapContext); + void SetBrushColorL(CBitmapContext& aBitmapContext); + void SetBrushStyleL(CBitmapContext& aBitmapContext); + void SetBrushOriginL(CBitmapContext& aBitmapContext); + void UseBrushPatternL(CBitmapContext& aBitmapContext); + void DiscardBrushPattern(CBitmapContext& aBitmapContext) const; + void MoveToL(CBitmapContext& aBitmapContext); + void MoveByL(CBitmapContext& aBitmapContext); + void PlotL(CBitmapContext& aBitmapContext); + void DrawArcL(CBitmapContext& aBitmapContext); + void DrawLineL(CBitmapContext& aBitmapContext); + void DrawLineToL(CBitmapContext& aBitmapContext); + void DrawLineByL(CBitmapContext& aBitmapContext); + void DrawPolyLineL(CBitmapContext& aBitmapContext); + void DrawPieL(CBitmapContext& aBitmapContext); + void DrawEllipseL(CBitmapContext& aBitmapContext); + void DrawRectL(CBitmapContext& aBitmapContext); + void DrawRoundRectL(CBitmapContext& aBitmapContext); + void DrawPolygonL(CBitmapContext& aBitmapContext); + void DrawBitmap1L(CBitmapContext& aBitmapContext); + void DrawBitmap2L(CBitmapContext& aBitmapContext); + void DrawBitmap3L(CBitmapContext& aBitmapContext); + void DrawBitmapMaskedL(CBitmapContext& aBitmapContext); + void DrawText1L(CBitmapContext& aBitmapContext); + void DrawText2L(CBitmapContext& aBitmapContext); + void DrawText3L(CBitmapContext& aBitmapContext); + void MapColorsL(CBitmapContext& aBitmapContext); + void SetClippingRegionL(CBitmapContext& aBitmapContext); + void CancelClippingRegion(CBitmapContext& aBitmapContext); + void DrawTextVertical1L(CBitmapContext& aBitmapContext); + void DrawTextVertical2L(CBitmapContext& aBitmapContext); + void DrawWsGraphic1L(const MWsGraphicResolver& aWsGraphicResolver); + void DrawWsGraphic2L(const MWsGraphicResolver& aWsGraphicResolver); + void SetShadowColorL(CBitmapContext& aBitmapContext); +#endif //SYMBIAN_GRAPHICS_GCE +private: + // Values set by the system calling play + TPoint iMasterOrigin; + const TRegion * iMasterClippingRegion; + const TRegion * iActiveMasterClippingRegion; + + RRegionBuf<10> iDrawSectionClippingRegion; + TRect iMasterClippingRect; + TRect iDrawSectionRect; + + // Values set by the draw commands executed during play + TPoint iOrigin; + RRegionBuf<10> iClippingRegion; + TRect iClippingRect; + TBool iParsedClippingRegionIsSet; + +#ifndef SYMBIAN_GRAPHICS_GCE + TPoint iOffSet; //only used by nonnga in order to preserve compatibility with nga + RRegionBuf<10> iCurrentSectionClippingRegion; //only used by nonnga in order to preserve compatibility with nga +#else + RRegion iIntersectedRegion; + CDrawableCacheBase* iDrawableCache; +#endif + + TInt iError; + CBufBase* iRecordSegBuf; + CBitmapCache* iBitmapCache; + CFontsCache* iFontCache; + CBufBase* iBufRead; + RBufReadStream iBufReadStream; + RPointerArray iDrawSections; + }; + +template void CCommandBuffer::Write(const TClass& aValue) + { + __ASSERT_COMPILE(sizeof(TClass) <= KMaxTUint8); + + #ifdef _DEBUG + const TUint8 size = sizeof(TClass); + Write(reinterpret_cast(&size), 1); + #endif + + Write(reinterpret_cast(&aValue), sizeof(TClass)); + } + +template void CCommandBuffer::ReadL(TClass& aValue) + { + __ASSERT_COMPILE(sizeof(TClass) <= KMaxTUint8); + + #ifdef _DEBUG + TUint8 size = 0; + ReadL(reinterpret_cast(&size), 1); + ASSERT(sizeof(TClass) == size); + #endif + + ReadL(reinterpret_cast(&aValue), sizeof(TClass)); + } + +#endif // __COMMANDBUFFER_H__