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