--- /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 <graphics/directgdiengine.h>
+#include <e32base.h>
+#include <bitdraw.h>
+#include <bitdraworigin.h>
+#include <bitmap.h>
+
+// 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<TPoint>& aPointList);
+ void DrawPolyLineNoEndPoint(const TArray<TPoint>& aPointList);
+ void DrawPolygon(const TArray<TPoint>& 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<TPoint>* aPointList, DirectGdi::TFillRule aFillRule);
+ void PolyFillLarge(const TArray<TPoint>* aPointList, DirectGdi::TFillRule aFillRule);
+ void PolyFillLarge(const TPoint* aPointList, TInt aNumPoints, DirectGdi::TFillRule aFillRule);
+ void PolyOutline(const TArray<TPoint>* 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*/