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