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