diff -r 000000000000 -r 5d03bc08d59c graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdiengine.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdiengine.h Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,259 @@ +// Copyright (c) 2007-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 CSWDIRECTGDIENGINE_H +#define CSWDIRECTGDIENGINE_H + +/** +@file +@internalComponent +*/ + +#include "directgdiadapter.h" +#include "swdirectgdibitmap.h" +#include +#include +#include +#include +#include + +// For use when testing the code, allows the fast blending to be disabled so back to back comparisons +// can done be to check either timing or exact output. +//#define __ALLOW_FAST_BLEND_DISABLE__ + +class RDirectGdiDrawableSource; +class CSwDirectGdiDriverImpl; +class CSwDirectGdiImageSourceImpl; +class CSwDirectGdiImageTargetImpl; +class CFbsDrawDevice; +class CBitwiseBitmap; +class MFastBlend; + +/** +Concrete (reference) implementation of a MDirectGdi Engine. It is a +collection of drawing routines which implement the software adaptation of DirectGDI. +*/ +NONSHARABLE_CLASS(CSwDirectGdiEngine) : public CBase, public MDirectGdiEngine, public MDrawDeviceOrigin + { +public: + CSwDirectGdiEngine(CSwDirectGdiDriverImpl*); + virtual ~CSwDirectGdiEngine(); + + // from MDirectGdiEngine + TInt Activate(RDirectGdiImageTarget& aTarget); + void Deactivate(); + void SetOrigin(const TPoint& aOrigin); + void SetClippingRegion(const TRegion& aRegion); + void ResetClippingRegion(); + void SetDrawMode(DirectGdi::TDrawMode aMode); + void SetPenColor(const TRgb& aColor); + void SetPenStyle(DirectGdi::TPenStyle aStyle); + void SetPenSize(const TSize& aSize); + void SetTextShadowColor(const TRgb& aColor); + void SetBrushColor(const TRgb& aColor); + void SetBrushStyle(DirectGdi::TBrushStyle aStyle); + void SetBrushOrigin(const TPoint& aOrigin); + TInt SetBrushPattern(const CFbsBitmap& aPattern); + void ResetBrushPattern(); + void SetFont(TUint32 aFontId); + void ResetFont(); + void Reset(); + void Clear(const TRect& aRect); + void Clear(); + void MoveTo(const TPoint& aPoint); + void MoveBy(const TPoint& aVector); + void Plot(const TPoint& aPoint); + void DrawLine(const TPoint& aStart, const TPoint& aEnd); + void DrawLineTo(const TPoint& aPoint); + void DrawLineBy(const TPoint& aVector); + void DrawRect(const TRect& aRect); + void DrawRoundRect(const TRect& aRect, const TSize& aCornerSize); + void DrawPolyLine(const TArray& aPointList); + void DrawPolyLineNoEndPoint(const TArray& aPointList); + void DrawPolygon(const TArray& aPoints, DirectGdi::TFillRule aRule); + void DrawArc(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd); + void DrawPie(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd); + void DrawEllipse(const TRect& aRect); + void BitBlt(const TPoint& aDestPos, const CFbsBitmap& aBitmap, const TRect& aSrcRect); + void BitBltMasked(const TPoint& aDestPos, const CFbsBitmap& aBitmap, const TRect& aSrcRect, + const CFbsBitmap& aMask, TBool aInvertMask); + void BitBltMasked(const TPoint& aDestPos, const CFbsBitmap& aBitmap, const TRect& aSrcRect, + const CFbsBitmap& aAlpha, const TPoint& aAlphaPos); + void DrawBitmap(const TRect& aDestRect, const CFbsBitmap& aBitmap, const TRect& aSrcRect); + void DrawBitmapMasked(const TRect& aDestRect, const CFbsBitmap& aBitmap, const TRect& aSrcRect, + const CFbsBitmap& aMask, TBool aInvertMask); + void DrawResource(const TRect& aDestRect, const RDirectGdiDrawableSource& aSource, const TRect& aSrcRect, + DirectGdi::TGraphicsRotation aRotation); + void DrawResource(const TPoint& aPos, const RDirectGdiDrawableSource& aSource, + DirectGdi::TGraphicsRotation aRotation); + void DrawResource(const TRect& aDestRect, const RDirectGdiDrawableSource& aSource, + DirectGdi::TGraphicsRotation aRotation); + void DrawResource(const TRect& aDestRect, const RDirectGdiDrawableSource& aSource, const TDesC8& aParam); + void DrawGlyph(const TPoint& aPos, const TChar aChar, const TUint8* aGlyphImage, + const TGlyphBitmapType aGlyphBitmapType, const TSize& aGlyphImageSize, const TRect& aClipRect, + const DirectGdi::TGraphicsRotation aRotation = DirectGdi::EGraphicsRotationNone); + void CopyRect(const TPoint& aOffset, const TRect& aRect); + void ExternalizeL(RWriteStream& aWriteStream); + void InternalizeL(RReadStream& aReadStream); + TInt GetInterface(TUid aInterfaceId, TAny*& aInterface); + void BeginDrawGlyph(); + void EndDrawGlyph(); + + //from MDrawDeviceOrigin + TInt Set(const TPoint& aDrawOrigin); + void Get(TPoint& aDrawOrigin); + +private: + CSwDirectGdiEngine(); + TBool AnalyseEllipse(const TRect& rc,TPoint& srad,TPoint& erad, TInt& startq,TInt& endq,TBool* quads); + TUint32* ClipBinaryArray(TUint32* aArray, TUint32* aArrayLimit, TInt& aDataWd, TInt& aDataHt, TPoint& aPos, const TRect& aClipRect); + void ClipFillLine(TPoint aLeft,TPoint aRight, TRect aClipRect); + void CopyCharLine(TUint32* aBinaryDataPtr, TInt aBufferWords, const TUint8* aData, TInt aBitShift, TInt aCharWidth); + void DrawPolyLineNoEndPoint(const TPoint* aPointList, TInt aNumPoints); + void DoBitBlt(const TPoint& aDest, CBitwiseBitmap* aSrce, TUint32* aBase, TInt aStride, + const TRect& aSrceRect); + void DoBitBltAlpha(const TPoint& aDest,CBitwiseBitmap* aSourceBitmap, TUint32* aSourceBase, + const TRect& aSourceRect, CBitwiseBitmap* aMaskBitmap,TUint32* aMaskBase, + const TPoint& aAlphaPoint, TBool aInvertMask); + void DoBitBltMasked(const TPoint& aDest, CBitwiseBitmap* aSourceBitmap, + TUint32* aSourceBase, const TRect& aSourceRect, CBitwiseBitmap* aMaskBitmap, + TUint32* aMaskBase, TBool aInvertMask); + void DoBitBltMaskedFlicker(const TPoint& aDest, CBitwiseBitmap* aSourceBitmap, TUint32* aSourceBase, + const TRect& aSourceRect, CBitwiseBitmap* aMaskBitmap, TUint32* aMaskBase, TBool aInvertMask); + void DoCopyRect(const TPoint& aOffset, const TRect& rect); + void DoDrawLine(TPoint aPt1,TPoint aPt2,TBool aDrawStartPoint); + void DoPlot(const TPoint& aPoint); + void DoDrawBitmap(const TRect& aDestRect, CBitwiseBitmap* aBitmap, TUint32* aBase, TInt aStride, + const TRect& aSrceRect, const TRect& aClipRect); + void DoDrawBitmapMasked(const TRect& aDestRect, CBitwiseBitmap* aSourceBitmap, TUint32* aSourceBase, + const TRect& aSourceRect, CBitwiseBitmap* aMaskBitmap, TUint32* aMaskBase, TBool aInvertMask, + const TRect& aClipRect); + TInt CheckImageSource(TInt aSourceHandle, CSwDirectGdiImageSourceImpl*& aImpl, TSize* aImgSize); + void DrawResourceCommon(const TRect& aDestRect, const CSwDirectGdiImageSourceImpl* aImpl, + const TRect& aSrcRect, DirectGdi::TGraphicsRotation aRotation); + void DoDrawResource(const TRect& aDestRect, const CSwDirectGdiImageSourceImpl* aImpl, + const TRect& aSrceRect, DirectGdi::TGraphicsRotation aRotation, const TRect& aClipRect); + void DoBlitResource(const TPoint& aDest, const CSwDirectGdiImageSourceImpl* aImpl, + const TRect& aSrceRect, DirectGdi::TGraphicsRotation aRotation); + void DoScaledBlitResource(const TRect& aDestRect, const CSwDirectGdiImageSourceImpl* aImpl, + const TRect& aSrceRect, DirectGdi::TGraphicsRotation aRotation, const TRect& aClipRect); + void DoDrawDottedWideLine(const TPoint& aPt1, const TPoint& aPt2, TBool aDrawStartPoint, + const TRect& aScreenRect, TRect aClipRect); + void DoDrawSolidWideLine(const TPoint& aPt1, const TPoint& aPt2, TBool aDrawStartPoint, + const TRect& aScreenRect, TRect aClipRect); + void DrawBitmapGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect); + void DrawLargeBitmapGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect); + void DrawRotatedBitmapGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect, const DirectGdi::TGraphicsRotation aRotation); + void DrawAntiAliasedGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect); + void DrawRotatedAntiAliasedGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect, const DirectGdi::TGraphicsRotation aRotation); + void DrawFourColourGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect); + void DrawRotatedFourColourGlyph(const TPoint& aPos, const TUint8* aGlyphImage, + const TSize& aGlyphImageSize, const TRect& aClipRect, const DirectGdi::TGraphicsRotation aRotation); + void EllipseFill(const TRect& aRect); + void EllipseOutline(const TRect& aRect); + void EllipseOutlineWide(const TRect& aRect); + TUint32* GetScanLineOffsetPtr(CBitwiseBitmap* aSrce, TUint32*& aSlptr, TInt aLength, TPoint aPixel, + TUint32* aBase, TLineScanningPosition& aLineScanningPosition, TUint aXOffset); + inline static TInt16 Load16(const TUint8* aPtr) { return TInt16(aPtr[0]+(aPtr[1]<<8)); } + TUint MemoryOffsetForPixelPitch(TUint aX, TDisplayMode aDisplayMode) const; + void OutputCharLineMultiplied(TPoint aPrintPos, TUint32* aBuffer, TInt aDataLength, TInt aNum, const TRect& aClipRect); + void OutputCharLineVertical(TPoint aPrintPos, TUint32* aBuffer, TInt aDataLength, TInt aNum, TInt aDirection, const TRect& aClipRect); + TInt PenAllocate(); + void PenDrawClipped(TPoint aPoint, const TRect& aClipRect); + void PenDrawDeferred(TPoint aPoint,TInt* aArray,TInt aFirstElement); + void PieArcOutline(const TRect& ellrect,const TPoint& startradius, const TPoint& endradius, TBool pie); + void PieFill(const TRect& ellrect, const TPoint& aStartIntersect, const TPoint& aEndIntersect, + TInt aStartQuadrant, TInt aEndQuadrant, const TBool* aQuadrants); + void PieShell(const TRect& ellrect,const TPoint& startradius, const TPoint& endradius, + const TBool* quads, TInt startquad, TInt endquad, TRect aClipRect); + void PieSliver(const TRect& ellrect,const TPoint& startradius, const TPoint& endradius, + TInt quad, TRect aClipRect); + void PieTriangles(TBool aInside,const TPoint& aStart,const TPoint& aEnd, TRect aClipRect); + void PolyFill(const TPoint* aPointList, TInt aNumPoints, DirectGdi::TFillRule aFillRule); + void PolyFill(const TArray* aPointList, DirectGdi::TFillRule aFillRule); + void PolyFillLarge(const TArray* aPointList, DirectGdi::TFillRule aFillRule); + void PolyFillLarge(const TPoint* aPointList, TInt aNumPoints, DirectGdi::TFillRule aFillRule); + void PolyOutline(const TArray* aPointList); + void PolyOutline(const TPoint* aPointList,TInt aNumPoints); + void RectFill(const TRect& aRect); + void ResetPenArray(); + void RoundRectFill(const TRect& aRect, const TSize& aCornerSize); + void RoundRectOutline(const TRect& aRect, const TSize& aCornerSize); + void SetPenArray(TInt* aPenArray); + void TruncateRect(TRect& aRect); + void Rotate90(TRect& aRect, const TPoint& aOrig); + void Rotate180(TRect& aRect, const TPoint& aOrig); + void Rotate270(TRect& aRect, const TPoint& aOrig); + TBool RotatedSizeMatch(const TRect& aDst, const TRect& aSrc, DirectGdi::TGraphicsRotation aRot); + void TileScanLine(TPtr8& aScanLine, TInt aLengthInPixels, const TPoint& aSrcPt, + const CBitwiseBitmap* aMaskBitmap, TLineScanningPosition& aScanLinePos, + TUint32* aMaskBase, TDisplayMode aDisplayMode); + TInt FastBlendInterface(const CBitwiseBitmap* aSource, const CBitwiseBitmap* aMask, MFastBlend*& aFastBlend) const; + inline CGraphicsContext::TDrawMode GcDrawMode(DirectGdi::TDrawMode aMode) const ; + TDisplayMode ScanLineBufferDisplayMode(CFbsDrawDevice* aDrawDevice); + +private: + CSwDirectGdiBitmap iBrushBitmap; + TRgb iBrushColor; + TPoint iBrushOrigin; + DirectGdi::TBrushStyle iBrushStyle; + TRegionFix<1> iDefaultRegion; + const TRegion* iDefaultRegionPtr; + TInt iDotLength; + TInt iDotMask; + TInt iDotParam; + TInt iDotDirection; + CFbsDrawDevice* iDrawDevice; + DirectGdi::TDrawMode iDrawMode; + CSwDirectGdiDriverImpl* iDriver; + TPoint iLinePosition; + TPoint iOrigin; + TPoint iDrawOrigin; + TInt* iPenArray; + TRgb iPenColor; /**< The current pen colour. The default pen colour is black. */ + TRgb iTextShadowColor; /**< Colour for text shadows. */ + TSize iPenSize; + DirectGdi::TPenStyle iPenStyle; + RRegion iClippingRegion; + CSwDirectGdiImageTargetImpl* iRenderingTarget; +#if defined(__ALLOW_FAST_BLEND_DISABLE__) + TBool iFastBlendDisabled; +#endif + + }; + +/** +Converts a draw-mode enum from the DirectGdi namespace to the CGraphicsContext namespace. +*/ +inline CGraphicsContext::TDrawMode CSwDirectGdiEngine::GcDrawMode(DirectGdi::TDrawMode aMode) const + { + switch(aMode) + { + case DirectGdi::EDrawModePEN: + return CGraphicsContext::EDrawModePEN; + case DirectGdi::EDrawModeWriteAlpha: + return CGraphicsContext::EDrawModeWriteAlpha; + default: + return CGraphicsContext::EDrawModePEN; + } + } + +#endif /*CSWDIRECTGDIENGINE_H*/