OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2011 Google Inc. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license that can be | |
5 * found in the LICENSE file. | |
6 */ | |
7 | |
8 #ifndef SkXPSDevice_DEFINED | |
9 #define SkXPSDevice_DEFINED | |
10 | |
11 #include "SkTypes.h" | |
12 | |
13 #ifdef SK_BUILD_FOR_WIN | |
14 | |
15 #include <ObjBase.h> | |
16 #include <XpsObjectModel.h> | |
17 | |
18 #include "SkAutoCoInitialize.h" | |
19 #include "SkBitmapDevice.h" | |
20 #include "SkBitSet.h" | |
21 #include "SkCanvas.h" | |
22 #include "SkColor.h" | |
23 #include "SkPaint.h" | |
24 #include "SkPath.h" | |
25 #include "SkPoint.h" | |
26 #include "SkShader.h" | |
27 #include "SkSize.h" | |
28 #include "SkTArray.h" | |
29 #include "SkTScopedComPtr.h" | |
30 #include "SkTypeface.h" | |
31 | |
32 //#define SK_XPS_USE_DETERMINISTIC_IDS | |
33 | |
34 /** \class SkXPSDevice | |
35 | |
36 The drawing context for the XPS backend. | |
37 */ | |
38 class SkXPSDevice : public SkBitmapDevice { | |
39 public: | |
40 SK_API SkXPSDevice(); | |
41 SK_API virtual ~SkXPSDevice(); | |
42 | |
43 virtual bool beginPortfolio(SkWStream* outputStream); | |
44 /** | |
45 @param unitsPerMeter converts geometry units into physical units. | |
46 @param pixelsPerMeter resolution to use when geometry must be rasterized. | |
47 @param trimSize final page size in physical units. | |
48 The top left of the trim is the origin of physical space. | |
49 @param mediaBox The size of the physical media in physical units. | |
50 The top and left must be less than zero. | |
51 The bottom and right must be greater than the trimSize. | |
52 The default is to coincide with the trimSize. | |
53 @param bleedBox The size of the bleed box in physical units. | |
54 Must be contained within the mediaBox. | |
55 The default is to coincide with the mediaBox. | |
56 @param artBox The size of the content box in physical units. | |
57 Must be contained within the trimSize. | |
58 The default is to coincide with the trimSize. | |
59 @param cropBox The size of the recommended view port in physical units. | |
60 Must be contained within the mediaBox. | |
61 The default is to coincide with the mediaBox. | |
62 */ | |
63 virtual bool beginSheet( | |
64 const SkVector& unitsPerMeter, | |
65 const SkVector& pixelsPerMeter, | |
66 const SkSize& trimSize, | |
67 const SkRect* mediaBox = NULL, | |
68 const SkRect* bleedBox = NULL, | |
69 const SkRect* artBox = NULL, | |
70 const SkRect* cropBox = NULL); | |
71 | |
72 virtual bool endSheet(); | |
73 virtual bool endPortfolio(); | |
74 | |
75 protected: | |
76 void drawPaint(const SkDraw&, const SkPaint& paint) override; | |
77 | |
78 virtual void drawPoints( | |
79 const SkDraw&, | |
80 SkCanvas::PointMode mode, | |
81 size_t count, const SkPoint[], | |
82 const SkPaint& paint) override; | |
83 | |
84 virtual void drawRect( | |
85 const SkDraw&, | |
86 const SkRect& r, | |
87 const SkPaint& paint) override; | |
88 | |
89 virtual void drawRRect( | |
90 const SkDraw&, | |
91 const SkRRect&, | |
92 const SkPaint& paint) override; | |
93 | |
94 virtual void drawPath( | |
95 const SkDraw&, | |
96 const SkPath& platonicPath, | |
97 const SkPaint& paint, | |
98 const SkMatrix* prePathMatrix, | |
99 bool pathIsMutable) override; | |
100 | |
101 virtual void drawBitmap( | |
102 const SkDraw&, | |
103 const SkBitmap& bitmap, | |
104 const SkMatrix& matrix, | |
105 const SkPaint& paint) override; | |
106 | |
107 virtual void drawSprite( | |
108 const SkDraw&, | |
109 const SkBitmap& bitmap, | |
110 int x, int y, | |
111 const SkPaint& paint) override; | |
112 | |
113 virtual void drawText( | |
114 const SkDraw&, | |
115 const void* text, size_t len, | |
116 SkScalar x, SkScalar y, | |
117 const SkPaint& paint) override; | |
118 | |
119 virtual void drawPosText( | |
120 const SkDraw&, | |
121 const void* text, size_t len, | |
122 const SkScalar pos[], int scalarsPerPos, | |
123 const SkPoint& offset, const SkPaint& paint) override; | |
124 | |
125 virtual void drawVertices( | |
126 const SkDraw&, | |
127 SkCanvas::VertexMode, | |
128 int vertexCount, const SkPoint verts[], | |
129 const SkPoint texs[], const SkColor colors[], | |
130 SkXfermode* xmode, | |
131 const uint16_t indices[], int indexCount, | |
132 const SkPaint& paint) override; | |
133 | |
134 virtual void drawDevice( | |
135 const SkDraw&, | |
136 SkBaseDevice* device, | |
137 int x, int y, | |
138 const SkPaint& paint) override; | |
139 | |
140 private: | |
141 class TypefaceUse : ::SkNoncopyable { | |
142 public: | |
143 SkFontID typefaceId; | |
144 int ttcIndex; | |
145 SkStream* fontData; | |
146 IXpsOMFontResource* xpsFont; | |
147 SkBitSet* glyphsUsed; | |
148 | |
149 explicit TypefaceUse(); | |
150 ~TypefaceUse(); | |
151 }; | |
152 friend static HRESULT subset_typeface(TypefaceUse* current); | |
153 | |
154 SkXPSDevice(IXpsOMObjectFactory* xpsFactory); | |
155 | |
156 SkAutoCoInitialize fAutoCo; | |
157 SkTScopedComPtr<IXpsOMObjectFactory> fXpsFactory; | |
158 SkTScopedComPtr<IStream> fOutputStream; | |
159 SkTScopedComPtr<IXpsOMPackageWriter> fPackageWriter; | |
160 | |
161 unsigned int fCurrentPage; | |
162 SkTScopedComPtr<IXpsOMCanvas> fCurrentXpsCanvas; | |
163 SkSize fCurrentCanvasSize; | |
164 SkVector fCurrentUnitsPerMeter; | |
165 SkVector fCurrentPixelsPerMeter; | |
166 | |
167 SkTArray<TypefaceUse, true> fTypefaces; | |
168 | |
169 /** Creates a GUID based id and places it into buffer. | |
170 buffer should have space for at least GUID_ID_LEN wide characters. | |
171 The string will always be wchar null terminated. | |
172 XXXXXXXXsXXXXsXXXXsXXXXsXXXXXXXXXXXX0 | |
173 The string may begin with a digit, | |
174 and so may not be suitable as a bare resource key. | |
175 */ | |
176 HRESULT createId(wchar_t* buffer, size_t bufferSize, wchar_t sep = '-'); | |
177 #ifdef SK_XPS_USE_DETERMINISTIC_IDS | |
178 decltype(GUID::Data1) fNextId = 0; | |
179 #endif | |
180 | |
181 HRESULT initXpsDocumentWriter(IXpsOMImageResource* image); | |
182 | |
183 HRESULT createXpsPage( | |
184 const XPS_SIZE& pageSize, | |
185 IXpsOMPage** page); | |
186 | |
187 HRESULT createXpsThumbnail( | |
188 IXpsOMPage* page, const unsigned int pageNumber, | |
189 IXpsOMImageResource** image); | |
190 | |
191 void internalDrawRect( | |
192 const SkDraw&, | |
193 const SkRect& r, | |
194 bool transformRect, | |
195 const SkPaint& paint); | |
196 | |
197 HRESULT createXpsBrush( | |
198 const SkPaint& skPaint, | |
199 IXpsOMBrush** xpsBrush, | |
200 const SkMatrix* parentTransform = NULL); | |
201 | |
202 HRESULT createXpsSolidColorBrush( | |
203 const SkColor skColor, const SkAlpha alpha, | |
204 IXpsOMBrush** xpsBrush); | |
205 | |
206 HRESULT createXpsImageBrush( | |
207 const SkBitmap& bitmap, | |
208 const SkMatrix& localMatrix, | |
209 const SkShader::TileMode (&xy)[2], | |
210 const SkAlpha alpha, | |
211 IXpsOMTileBrush** xpsBrush); | |
212 | |
213 HRESULT createXpsLinearGradient( | |
214 SkShader::GradientInfo info, | |
215 const SkAlpha alpha, | |
216 const SkMatrix& localMatrix, | |
217 IXpsOMMatrixTransform* xpsMatrixToUse, | |
218 IXpsOMBrush** xpsBrush); | |
219 | |
220 HRESULT createXpsRadialGradient( | |
221 SkShader::GradientInfo info, | |
222 const SkAlpha alpha, | |
223 const SkMatrix& localMatrix, | |
224 IXpsOMMatrixTransform* xpsMatrixToUse, | |
225 IXpsOMBrush** xpsBrush); | |
226 | |
227 HRESULT createXpsGradientStop( | |
228 const SkColor skColor, | |
229 const SkScalar offset, | |
230 IXpsOMGradientStop** xpsGradStop); | |
231 | |
232 HRESULT createXpsTransform( | |
233 const SkMatrix& matrix, | |
234 IXpsOMMatrixTransform ** xpsTransform); | |
235 | |
236 HRESULT createXpsRect( | |
237 const SkRect& rect, | |
238 BOOL stroke, BOOL fill, | |
239 IXpsOMGeometryFigure** xpsRect); | |
240 | |
241 HRESULT createXpsQuad( | |
242 const SkPoint (&points)[4], | |
243 BOOL stroke, BOOL fill, | |
244 IXpsOMGeometryFigure** xpsQuad); | |
245 | |
246 HRESULT CreateTypefaceUse( | |
247 const SkPaint& paint, | |
248 TypefaceUse** fontResource); | |
249 | |
250 HRESULT AddGlyphs( | |
251 const SkDraw& d, | |
252 IXpsOMObjectFactory* xpsFactory, | |
253 IXpsOMCanvas* canvas, | |
254 TypefaceUse* font, | |
255 LPCWSTR text, | |
256 XPS_GLYPH_INDEX* xpsGlyphs, | |
257 UINT32 xpsGlyphsLen, | |
258 XPS_POINT *origin, | |
259 FLOAT fontSize, | |
260 XPS_STYLE_SIMULATION sims, | |
261 const SkMatrix& transform, | |
262 const SkPaint& paint); | |
263 | |
264 HRESULT addXpsPathGeometry( | |
265 IXpsOMGeometryFigureCollection* figures, | |
266 BOOL stroke, BOOL fill, const SkPath& path); | |
267 | |
268 HRESULT createPath( | |
269 IXpsOMGeometryFigure* figure, | |
270 IXpsOMVisualCollection* visuals, | |
271 IXpsOMPath** path); | |
272 | |
273 HRESULT sideOfClamp( | |
274 const SkRect& leftPoints, const XPS_RECT& left, | |
275 IXpsOMImageResource* imageResource, | |
276 IXpsOMVisualCollection* visuals); | |
277 | |
278 HRESULT cornerOfClamp( | |
279 const SkRect& tlPoints, | |
280 const SkColor color, | |
281 IXpsOMVisualCollection* visuals); | |
282 | |
283 HRESULT clip( | |
284 IXpsOMVisual* xpsVisual, | |
285 const SkDraw& d); | |
286 HRESULT clipToPath( | |
287 IXpsOMVisual* xpsVisual, | |
288 const SkPath& clipPath, | |
289 XPS_FILL_RULE fillRule); | |
290 | |
291 HRESULT drawInverseWindingPath( | |
292 const SkDraw& d, | |
293 const SkPath& devicePath, | |
294 IXpsOMPath* xpsPath); | |
295 | |
296 HRESULT shadePath( | |
297 IXpsOMPath* shadedPath, | |
298 const SkPaint& shaderPaint, | |
299 const SkMatrix& matrix, | |
300 BOOL* fill, BOOL* stroke); | |
301 | |
302 void convertToPpm( | |
303 const SkMaskFilter* filter, | |
304 SkMatrix* matrix, | |
305 SkVector* ppuScale, | |
306 const SkIRect& clip, SkIRect* clipIRect); | |
307 | |
308 HRESULT applyMask( | |
309 const SkDraw& d, | |
310 const SkMask& mask, | |
311 const SkVector& ppuScale, | |
312 IXpsOMPath* shadedPath); | |
313 | |
314 SkBaseDevice* onCreateDevice(const CreateInfo&, const SkPaint*) override; | |
315 | |
316 // Disable the default copy and assign implementation. | |
317 SkXPSDevice(const SkXPSDevice&); | |
318 void operator=(const SkXPSDevice&); | |
319 | |
320 typedef SkBitmapDevice INHERITED; | |
321 }; | |
322 | |
323 #endif // SK_BUILD_FOR_WIN | |
324 #endif // SkXPSDevice_DEFINED | |
OLD | NEW |