os/graphics/graphicsdeviceinterface/directgdiadaptation/hwsrc/vgengine.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #ifndef VGENGINE_H_
    17 #define VGENGINE_H_
    18 
    19 /**
    20 @file
    21 @internalComponent Reference implementation of Open VG hardware accelerated DirectGDI adaptation.
    22 */
    23 
    24 #include "directgdidriverimpl.h"
    25 #include "directgdiadapter.h"
    26 #include "clippingregionmanager.h"
    27 #include <bitdraworigin.h>
    28 #include <graphics/directgdiengine.h>
    29 #include <graphics/sgimage.h>
    30 #include <VG/openvg.h>
    31 #include <VG/vgu.h>
    32 #include <gdi.h>
    33 
    34 class CDirectGdiDriverImpl;
    35 
    36 #ifdef DRAWGLYPH_BUFFERED
    37 const TInt KMaxGlyphs = 64;
    38 typedef struct TDrawGlyphCommand_Tag
    39 {
    40 	TPoint pos;
    41 	TChar aChar;
    42 	TUint8* aGlyphImage;
    43 	TGlyphBitmapType aGlyphBitmapType;
    44 	TSize aGlyphImageSize;
    45 	TRect aClipRect;
    46 	DirectGdi::TGraphicsRotation aRotation;	
    47 	
    48 	TBool SameGlyph(const TDrawGlyphCommand_Tag aOther)
    49 		{ 
    50 		return aGlyphImage == aOther.aGlyphImage && 
    51 				aChar == aOther.aChar && 
    52 				aGlyphImage == aOther.aGlyphImage && 
    53 				aGlyphBitmapType == aOther.aGlyphBitmapType && 
    54 				aGlyphImageSize == aOther.aGlyphImageSize;
    55 		}
    56 } TDrawGlyphCommand;
    57 #endif
    58 
    59 /**
    60 Concrete (reference) implementation of a MDirectGdiEngine.
    61 
    62 This class implements the rendering mechanism for DirectGDI. In this case,
    63 OpenVG is used to get things done, so hardware acceleration is used.
    64 */
    65 NONSHARABLE_CLASS(CVgEngine): public CBase, public MDirectGdiEngine, public MDrawDeviceOrigin
    66 	{
    67 public:
    68 	virtual ~CVgEngine();
    69 	CVgEngine(CDirectGdiDriverImpl& aDriver);
    70 
    71 	// from MDirectGdiEngine
    72 	TInt Activate(RDirectGdiImageTarget& aTarget);
    73 	void Deactivate();
    74 	void SetOrigin(const TPoint& aOrigin);
    75 	void SetClippingRegion(const TRegion& aRegion);
    76 	void ResetClippingRegion();
    77 	void SetDrawMode(DirectGdi::TDrawMode aMode);
    78 	void SetPenColor(const TRgb& aColor);
    79 	void SetPenStyle(DirectGdi::TPenStyle aStyle);
    80 	void SetPenSize(const TSize& aSize);
    81 	void SetTextShadowColor(const TRgb& aColor);
    82 	void SetBrushColor(const TRgb& aColor);
    83 	void SetBrushStyle(DirectGdi::TBrushStyle aStyle);
    84 	void SetBrushOrigin(const TPoint& aOrigin);
    85 	TInt SetBrushPattern(const CFbsBitmap& aPattern);
    86 	void ResetBrushPattern();
    87 	void SetFont(TUint32 aFontId);
    88 	void ResetFont();
    89 	void Reset();
    90 	void Clear(const TRect& aRect);
    91 	void Clear();
    92 	void MoveTo(const TPoint& aPoint);
    93 	void MoveBy(const TPoint& aVector);
    94 	void Plot(const TPoint& aPoint);
    95 	void DrawLine(const TPoint& aStart, const TPoint& aEnd);
    96 	void DrawLineTo(const TPoint& aPoint);
    97 	void DrawLineBy(const TPoint& aVector);
    98 	void DrawRect(const TRect& aRect);
    99 	void DrawRoundRect(const TRect& aRect, const TSize& aCornerSize);
   100 	void DrawPolyLine(const TArray<TPoint>& aPointList);
   101 	void DrawPolyLineNoEndPoint(const TArray<TPoint>& aPointList);
   102 	void DrawPolygon(const TArray<TPoint>& aPoints,	DirectGdi::TFillRule aRule);
   103 	void DrawArc(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd);
   104 	void DrawPie(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd);
   105 	void DrawEllipse(const TRect& aRect);
   106 	void BitBlt(const TPoint& aDestPos, const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect);
   107 	void BitBltMasked(
   108 			const TPoint& aDestPos,				
   109 			const CFbsBitmap& aSourceBitmap,
   110 			const TRect& aSourceRect,				
   111 			const CFbsBitmap& aMaskBitmap, 
   112 			TBool aInvertMask);
   113 	void BitBltMasked(const TPoint& aDestPt,
   114 			const CFbsBitmap& aSourceBitmap, const TRect& aSourceRect,				
   115 			const CFbsBitmap& aMaskBitmap, const TPoint& aMaskPos);
   116 	void DrawBitmap(const TRect& aDestRect, const CFbsBitmap& aSourceBitmap,
   117 			const TRect& aSrcRect);
   118 	void DrawBitmapMasked(const TRect& aDestRect,				
   119 			const CFbsBitmap& aSourceBitmap,const TRect& aSourceRect,				
   120 			const CFbsBitmap& aMaskBitmap, TBool aInvertMask);
   121 	void DrawResource(const TPoint& aPos, 
   122 			const RDirectGdiDrawableSource& aSource, 
   123 			DirectGdi::TGraphicsRotation aRotation);	
   124 	void DrawResource(const TRect& aDestRect,
   125 			const RDirectGdiDrawableSource& aSource,
   126 			DirectGdi::TGraphicsRotation aRotation);
   127 	void DrawResource(const TRect& aDestRect,				
   128 			const RDirectGdiDrawableSource& aSource, 
   129 			const TRect& aSrcRect,
   130 			DirectGdi::TGraphicsRotation aRotation);
   131 	void DrawResource(
   132 			const TRect& aDestRect,				
   133 			const RDirectGdiDrawableSource& aSource,
   134 			const TDesC8& aParam);
   135 	void DrawGlyph(const TPoint& aPos, const TChar aChar, const TUint8* aGlyphImage,
   136 			const TGlyphBitmapType aGlyphBitmapType, const TSize& aGlyphImageSize, const TRect& aClipRect,
   137 			const DirectGdi::TGraphicsRotation aRotation = DirectGdi::EGraphicsRotationNone);
   138 	void CopyRect(const TPoint& aOffset, const TRect& aRect);
   139 	void ExternalizeL(RWriteStream& aWriteStream);
   140 	void InternalizeL(RReadStream& aReadStream);
   141 	TInt GetInterface(TUid aInterfaceId, TAny*& aInterface);
   142 	
   143 	void BeginDrawGlyph();
   144 	void EndDrawGlyph();
   145 	
   146 	//from MDrawDeviceOrigin
   147 	TInt Set(const TPoint& aDrawOrigin);
   148 	void Get(TPoint& aDrawOrigin);
   149 private:
   150 	TRect SgMetricsToVgTRect (const TPoint& aCoord, const TInt width, const TInt height) const;
   151 
   152 	const TPoint ConvertToVgCoords(const TPoint& aPoint);
   153 	const TPoint ConvertToVgCoords(const TRect& aRect);
   154 	void ResetVgMatrix();
   155 	void ResetVgMatrix(const VGMatrixMode aMatrixMode);
   156 
   157 	// Path (line) creation commands
   158 	TBool PreparePath(VGPath& aPath, TInt aExpectedCommandCount);
   159 	void AppendPathCommand(VGubyte aCommand);
   160 	void AppendPathCommand(VGubyte aCommand, VGfloat aCoord);
   161 	void AppendPathCommand(VGubyte aCommand, VGfloat aCoord1, VGfloat aCoord2);
   162 	TInt PrepareForPathCommand(TInt aCommandCount, TInt aCoordCount);
   163 	void FinishPath(VGPath aPath);	
   164 	TInt AllocPathCommands(TInt aCommandCount);
   165 	TInt AllocPathCoords(TInt aCoordCount);
   166 	TBool ConvertBitmapToVgImage(const CFbsBitmap& aBitmap, VGImage& aImage, TBool aIsMask = EFalse, const TPoint& aOrigin = TPoint(0,0));
   167 	VGImage CreateSourceVGImage(const CFbsBitmap& aSource, TBool aFlipY = EFalse, const TPoint& aOrigin = TPoint(0,0));	
   168 	TInt CreateStandardBrush(TSize& aPatternSize, VGbyte* aBrushPattern);
   169 	TBool NonZeroBrushPatternOrigin();
   170 	TInt CopyCurrentBrushPatternForNonZeroOrigin();	
   171 	inline VGfloat* Identity (void) {return iIdentityMatrix;}
   172 	void SetVgState();
   173 	void SetVguError(VGUErrorCode aErr);
   174 	TBool GetCurrentBrushPattern(VGImage& aBrush, TSize& aSize, VGImageFormat& aFormat) const;
   175 
   176 	TReal GetAngleFromXAxisAnticlockwise(const TReal aOriginX, const TReal aOriginY, const TReal aPointX, const TReal aPointY, const TReal aWidth, const TReal aHeight);
   177 
   178 	void DoDrawArc(const TRect& aRect, const TPoint& aStart, const TPoint& aEnd, VGUArcType aArcType);
   179 	void DoDrawPoly(const TArray<TPoint>& aPointList, TBool aClosed);
   180 
   181 	TBool MakeEngineCurrent();
   182 
   183 	void DoBitBltMasked (
   184 		const TPoint& aDestPos,
   185 		const CFbsBitmap& aSourceBitmap,
   186 		const TRect& aSourceRect,
   187 		const CFbsBitmap& aMaskBitmap,
   188 		TBool aInvertMask,
   189 		const TPoint& aMaskPos);
   190 
   191 	void DoVgImageDraw (
   192 		const TRect& aDestRect, 
   193 		const CFbsBitmap& aSourceBitmap, 
   194 		const TRect& aSourceRect);
   195 
   196 	void DoVgMaskedImageDraw(
   197 		const TPoint& aDestPos,
   198 		VGImage aSourceImage,
   199 		const TRect& aSourceImageSize,
   200 		const TRect& aSourceRect,
   201 		const VGImage aMaskImage,
   202 		const TSize& srcMaskSize,
   203 		const TSize& aDestSize,
   204 		TBool aInvertMask);
   205 
   206 	inline TBool IntersectsClippingRegion (const TRect& aRect);
   207 
   208 	void DoDrawResource(const TRect& aDestRect, CDirectGdiImageSourceImpl* aSource, DirectGdi::TGraphicsRotation aRotation);	
   209 	void DoDrawResource(const TRect& aDestRect, CDirectGdiImageSourceImpl* aSource, const TRect& aSrcRect, DirectGdi::TGraphicsRotation aRotation);
   210 	
   211 	VGImage DoVgCreateImage(VGImageFormat aFormat, VGint aWidth, VGint aHeight, VGbitfield aAllowedQuality);
   212 	void SetVgPaintColor(VGPaint& aPaint, const TRgb& aColor);
   213 	
   214 private:	
   215 	CDirectGdiDriverImpl& iDriver;
   216 	RClippingRegionManager iRegionManager;
   217 	CDirectGdiImageTargetImpl* iRenderingTarget;
   218 	TRegionFix<1> iTargetRegion;	/**< The region which the rendering target occupies.*/
   219 	TSize iSize;	/**< The size of the rendering target.*/
   220 
   221 	TPoint iOrigin;		/**< The origin of the drawing engine coordinate system.*/
   222 	TPoint iDrawOrigin; /**< The origin of all drawing, affected by app mode offset */
   223 	VGPaint iPen;		/**< VGPaint object for all pen operations (Stroke operations in OpenVG).*/
   224 	TSize iPenSize;		/**< The current pen size.*/
   225 	TRgb iPenColor;		/**< The current pen colour.*/
   226 	TRgb iTextShadowColor;	/**< The current colour for blending text shadow.*/
   227 	DirectGdi::TPenStyle iPenStyle;	/**< The current pen style.*/
   228 	VGPaint iBrush;		/**< VGPaint object for all brush operations (Fill operations in OpenVG).*/
   229 	VGPaint iClearBrush;	/**< VGPaint object for Clear() operations only.*/
   230 	TRgb iBrushColor;	/**< The current brush colour.*/
   231 	VGPath iVgPath;		/**< OpenVG path used for all path drawing.*/
   232 	TUint32 iFontId;	/**< The id of the current font.*/
   233 	VGPaint iTextBrush; /**< VGPaint object used to draw text. */
   234 
   235 	/**
   236 	VGImage for holding the current user brush pattern (i.e when 
   237 	DirectGdi::TBrushStyle::EPatternedBrush is selected).
   238 	*/
   239 	VGImage iBrushPatternUser;
   240 
   241 	/**
   242 	VGImage for holding the current standard brush pattern (i.e. when one of 
   243 	DirectGdi::TBrushStyle::EVerticalHatchBrush to DirectGdi::TBrushStyle::EDiamondCrossHatchBrush
   244 	brush styles are selected).
   245 	*/
   246 	VGImage iBrushPatternStandard;
   247 
   248 	VGImage iBrushPatternStandardRegion; /**< VGImage for holding a sub-region of iBrushPatternStandard.*/
   249 	TInt iBrushPatternStandardId;	/**< The id of the currently loaded standard brush pattern. This is initialised to -1 inside Activate().*/
   250 	DirectGdi::TBrushStyle iBrushStyle;	/**< The current brush style.*/
   251 	TPoint iBrushOrigin;	/**< The current brush origin.*/
   252 
   253 	/**
   254 	This VGImage should always hold the current brush pattern if iBrushOrigin is not (0,0).
   255 	This could be a shifted version of either iBrushPatternUser or iBrushPatternStandard.
   256 	*/
   257 	VGImage iBrushPatternNonZeroOrigin;
   258 
   259 	VGbitfield iPaintMode;	/**< The current paint mode.*/
   260 
   261 	// The following members variables are used when drawing paths
   262 	VGubyte* iPathCommands;	/**< Pointer to list of stored commands to be used in a VGPath.*/
   263 	VGfloat* iPathCoords;	/**< Pointer to list of stored coordinates to be used in a VGPath.*/
   264 	TInt iPathCommandCount; /**< The number of commands to be used in a VGPath.*/
   265 	TInt iPathCoordCount;	/**< The number of coordinates to be used in a VGPath.*/
   266 	TInt iCurrentMaxCommands;	/**< The current maximum number of commands which can be entered in a VGPath.*/
   267 	TInt iCurrentMaxCoords;	/**< The current maximum number of coordinates which can be entered in a VGPath.*/
   268 
   269 	TPoint iLinePos;	/**< The current line position. Can be changed using MoveTo(), MoveBy(), DrawLineTo(), DrawLineBy() and DrawPolyline().*/
   270 	DirectGdi::TDrawMode iDrawMode;	/**< The current drawing mode.*/
   271 	VGfloat iIdentityMatrix[9];	/**< The matrix used to convert coordinate systems.*/
   272 
   273 	// Brush sizes. We'll remember them instead of doing potentially expensive vgGets
   274 	TSize iBrushPatternStandardRegionSize;	/**< The size of the current sub-region of the standard brush pattern.*/
   275 	TSize iBrushPatternStandardSize;	/**< The size of the current standard brush pattern.*/
   276 	TSize iBrushPatternUserSize;	/**< The size of the curent  user brush pattern.*/
   277 
   278 	TInt iBrushPatternUserBitmapHandle;	/**< Stores the bitmap handle to recreate the iBrushPatternUser VGImage.*/
   279 
   280 	MFontGlyphImageStorage* iFontGlyphImageStorage;	/**< Interface which deals with glyph cache images.*/
   281 
   282 #ifdef	DRAWGLYPH_BUFFERED
   283 	TInt iDrawGlyphCount;
   284 	TDrawGlyphCommand iDrawGlyphCommand[KMaxGlyphs];
   285 	void FlushDrawGlyphs();
   286 #endif
   287 	};
   288 
   289 inline TBool CVgEngine::NonZeroBrushPatternOrigin()
   290 	{
   291 	return ((iBrushOrigin.iX != 0) || (iBrushOrigin.iY != 0));
   292 	}
   293 
   294 /**
   295 Helper method to determine if a specified rectangle intersects with the current clipping region.
   296 If the current clipping region is a null pointer then intersection is assumed.
   297 
   298 @param 	aRect Rectangle to check for intersection with clipping region.
   299 
   300 @return ETrue if aRect intersects with clipping region, else EFalse.
   301  */
   302 inline TBool CVgEngine::IntersectsClippingRegion (const TRect& aRect)
   303 	{
   304 	if(iRegionManager.ClippingRegion().IsEmpty())
   305 		{
   306 		return (aRect.Intersects(iTargetRegion.BoundingRect()));
   307 		}
   308 	else 
   309 		{
   310 		return (iRegionManager.ClippingRegion().Intersects(aRect));
   311 		}
   312 	}
   313 
   314 #endif /*VGENGINE_H_*/