graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdiengine.h
changeset 0 5d03bc08d59c
--- /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*/