graphicsdeviceinterface/directgdiadaptation/swsrc/swdirectgdiengine.h
author William Roberts <williamr@symbian.org>
Thu, 03 Jun 2010 17:39:46 +0100
branchNewGraphicsArchitecture
changeset 87 0709f76d91e5
parent 0 5d03bc08d59c
permissions -rw-r--r--
Add MMP files to build libOpenVG_sw.lib which uses LINKAS to redirect to libOpenVG.dll (and the same for libEGL_sw.lib and libOpenVGU_sw.lib). Only the libEGL_sw.lib redirection isn't activated - this can't happen until there is a merged libEGL.dll which supports the OpenWF synchronisation and also implements the graphical support functions. The overall aim is to eliminate the *_sw.dll implementations, at least as a compile-time way of choosing a software-only implementation.The correct way to choose is to put the right set of libraries into a ROM with suitable renaming, and in the emulator to use the "switching DLL" technique to pick the right set. As the Symbian Foundation doesn't have any alternative implementations, we don't need the switching DLLs and we can build directly to the correct name.

// 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*/