Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Side by Side Diff: include/pdf/SkPDFDevice.h

Issue 727343002: move SkPDFD*.h from include to src (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « gyp/tools.gyp ('k') | include/pdf/SkPDFDocument.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1
2 /*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10 #ifndef SkPDFDevice_DEFINED
11 #define SkPDFDevice_DEFINED
12
13 #include "SkDevice.h"
14 #include "SkBitmap.h"
15 #include "SkCanvas.h"
16 #include "SkPaint.h"
17 #include "SkPath.h"
18 #include "SkPicture.h"
19 #include "SkRect.h"
20 #include "SkRefCnt.h"
21 #include "SkStream.h"
22 #include "SkTDArray.h"
23 #include "SkTemplates.h"
24
25 class SkPDFArray;
26 class SkPDFDevice;
27 class SkPDFDict;
28 class SkPDFFont;
29 class SkPDFFormXObject;
30 class SkPDFGlyphSetMap;
31 class SkPDFGraphicState;
32 class SkPDFObject;
33 class SkPDFResourceDict;
34 class SkPDFShader;
35 class SkPDFStream;
36 class SkRRect;
37 template <typename T> class SkTSet;
38
39 // Private classes.
40 struct ContentEntry;
41 struct GraphicStateEntry;
42 struct NamedDestination;
43
44 /** \class SkPDFDevice
45
46 The drawing context for the PDF backend.
47 */
48 class SkPDFDevice : public SkBaseDevice {
49 public:
50 /** Create a PDF drawing context with the given width and height.
51 * 72 points/in means letter paper is 612x792.
52 * @param pageSize Page size in points.
53 * @param contentSize The content size of the page in points. This will be
54 * combined with the initial transform to determine the drawing area
55 * (as reported by the width and height methods). Anything outside
56 * of the drawing area will be clipped.
57 * @param initialTransform The initial transform to apply to the page.
58 * This may be useful to, for example, move the origin in and
59 * over a bit to account for a margin, scale the canvas,
60 * or apply a rotation. Note1: the SkPDFDevice also applies
61 * a scale+translate transform to move the origin from the
62 * bottom left (PDF default) to the top left. Note2: drawDevice
63 * (used by layer restore) draws the device after this initial
64 * transform is applied, so the PDF device does an
65 * inverse scale+translate to accommodate the one that SkPDFDevice
66 * always does.
67 */
68 // Deprecated, please use SkDocument::CreatePdf() instead.
69 SK_API SkPDFDevice(const SkISize& pageSize, const SkISize& contentSize,
70 const SkMatrix& initialTransform);
71 SK_API virtual ~SkPDFDevice();
72
73 /** These are called inside the per-device-layer loop for each draw call.
74 When these are called, we have already applied any saveLayer operations,
75 and are handling any looping from the paint, and any effects from the
76 DrawFilter.
77 */
78 void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE;
79 void drawPoints(const SkDraw&, SkCanvas::PointMode mode,
80 size_t count, const SkPoint[],
81 const SkPaint& paint) SK_OVERRIDE;
82 void drawRect(const SkDraw&, const SkRect& r, const SkPaint& paint) SK_OVERR IDE;
83 void drawOval(const SkDraw&, const SkRect& oval, const SkPaint& paint) SK_OV ERRIDE;
84 void drawRRect(const SkDraw&, const SkRRect& rr, const SkPaint& paint) SK_OV ERRIDE;
85 void drawPath(const SkDraw&, const SkPath& origpath,
86 const SkPaint& paint, const SkMatrix* prePathMatrix,
87 bool pathIsMutable) SK_OVERRIDE;
88 void drawBitmapRect(const SkDraw& draw, const SkBitmap& bitmap,
89 const SkRect* src, const SkRect& dst,
90 const SkPaint& paint,
91 SkCanvas::DrawBitmapRectFlags flags) SK_OVERRIDE;
92 void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
93 const SkMatrix& matrix, const SkPaint&) SK_OVERRIDE;
94 void drawSprite(const SkDraw&, const SkBitmap& bitmap, int x, int y,
95 const SkPaint& paint) SK_OVERRIDE;
96 void drawText(const SkDraw&, const void* text, size_t len,
97 SkScalar x, SkScalar y, const SkPaint&) SK_OVERRIDE;
98 void drawPosText(const SkDraw&, const void* text, size_t len,
99 const SkScalar pos[], int scalarsPerPos,
100 const SkPoint& offset, const SkPaint&) SK_OVERRIDE;
101 void drawVertices(const SkDraw&, SkCanvas::VertexMode,
102 int vertexCount, const SkPoint verts[],
103 const SkPoint texs[], const SkColor colors[],
104 SkXfermode* xmode, const uint16_t indices[],
105 int indexCount, const SkPaint& paint) SK_OVERRIDE;
106 void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
107 const SkPaint&) SK_OVERRIDE;
108
109 void onAttachToCanvas(SkCanvas* canvas) SK_OVERRIDE;
110 void onDetachFromCanvas() SK_OVERRIDE;
111 SkImageInfo imageInfo() const SK_OVERRIDE;
112
113 enum DrawingArea {
114 kContent_DrawingArea, // Drawing area for the page content.
115 kMargin_DrawingArea, // Drawing area for the margin content.
116 };
117
118 /** Sets the drawing area for the device. Subsequent draw calls are directed
119 * to the specific drawing area (margin or content). The default drawing
120 * area is the content drawing area.
121 *
122 * Currently if margin content is drawn and then a complex (for PDF) xfer
123 * mode is used, like SrcIn, Clear, etc, the margin content will get
124 * clipped. A simple way to avoid the bug is to always draw the margin
125 * content last.
126 */
127 SK_API void setDrawingArea(DrawingArea drawingArea);
128
129 /** Sets the DCTEncoder for images.
130 * @param encoder The encoder to encode a bitmap as JPEG (DCT).
131 * Result of encodings are cached, if the encoder changes the
132 * behaivor dynamically and an image is added to a second catalog,
133 * we will likely use the result of the first encoding call.
134 * By returning false from the encoder function, the encoder result
135 * is not used.
136 * Callers might not want to encode small images, as the time spent
137 * encoding and decoding might not be worth the space savings,
138 * if any at all.
139 */
140 void setDCTEncoder(SkPicture::EncodeBitmap encoder) {
141 fEncoder = encoder;
142 }
143
144 // PDF specific methods.
145
146 /** Returns the resource dictionary for this device.
147 */
148 SK_API SkPDFResourceDict* getResourceDict();
149
150 /** Get the fonts used on this device.
151 */
152 SK_API const SkTDArray<SkPDFFont*>& getFontResources() const;
153
154 /** Add our named destinations to the supplied dictionary.
155 * @param dict Dictionary to add destinations to.
156 * @param page The PDF object representing the page for this device.
157 */
158 void appendDestinations(SkPDFDict* dict, SkPDFObject* page);
159
160 /** Returns a copy of the media box for this device. The caller is required
161 * to unref() this when it is finished.
162 */
163 SK_API SkPDFArray* copyMediaBox() const;
164
165 /** Get the annotations from this page, or NULL if there are none.
166 */
167 SK_API SkPDFArray* getAnnotations() const { return fAnnotations; }
168
169 /** Returns a SkStream with the page contents. The caller is responsible
170 for a reference to the returned value.
171 DEPRECATED: use copyContentToData()
172 */
173 SK_API SkStream* content() const;
174
175 /** Returns a SkStream with the page contents. The caller is responsible
176 * for calling data->unref() when it is finished.
177 */
178 SK_API SkData* copyContentToData() const;
179
180 SK_API const SkMatrix& initialTransform() const {
181 return fInitialTransform;
182 }
183
184 /** Returns a SkPDFGlyphSetMap which represents glyph usage of every font
185 * that shows on this device.
186 */
187 const SkPDFGlyphSetMap& getFontGlyphUsage() const {
188 return *(fFontGlyphUsage.get());
189 }
190
191
192 /**
193 * rasterDpi - the DPI at which features without native PDF support
194 * will be rasterized (e.g. draw image with perspective,
195 * draw text with perspective, ...)
196 * A larger DPI would create a PDF that reflects the original
197 * intent with better fidelity, but it can make for larger
198 * PDF files too, which would use more memory while rendering,
199 * and it would be slower to be processed or sent online or
200 * to printer.
201 */
202 void setRasterDpi(SkScalar rasterDpi) {
203 fRasterDpi = rasterDpi;
204 }
205
206 protected:
207 const SkBitmap& onAccessBitmap() SK_OVERRIDE {
208 return fLegacyBitmap;
209 }
210
211 SkSurface* newSurface(const SkImageInfo&, const SkSurfaceProps&) SK_OVERRIDE ;
212
213 private:
214 // TODO(vandebo): push most of SkPDFDevice's state into a core object in
215 // order to get the right access levels without using friend.
216 friend class ScopedContentEntry;
217
218 SkISize fPageSize;
219 SkISize fContentSize;
220 SkMatrix fInitialTransform;
221 SkClipStack fExistingClipStack;
222 SkRegion fExistingClipRegion;
223 SkPDFArray* fAnnotations;
224 SkPDFResourceDict* fResourceDict;
225 SkTDArray<NamedDestination*> fNamedDestinations;
226
227 SkTDArray<SkPDFGraphicState*> fGraphicStateResources;
228 SkTDArray<SkPDFObject*> fXObjectResources;
229 SkTDArray<SkPDFFont*> fFontResources;
230 SkTDArray<SkPDFObject*> fShaderResources;
231
232 SkAutoTDelete<ContentEntry> fContentEntries;
233 ContentEntry* fLastContentEntry;
234 SkAutoTDelete<ContentEntry> fMarginContentEntries;
235 ContentEntry* fLastMarginContentEntry;
236 DrawingArea fDrawingArea;
237
238 const SkClipStack* fClipStack;
239
240 // Accessor and setter functions based on the current DrawingArea.
241 SkAutoTDelete<ContentEntry>* getContentEntries();
242 ContentEntry* getLastContentEntry();
243 void setLastContentEntry(ContentEntry* contentEntry);
244
245 // Glyph ids used for each font on this device.
246 SkAutoTDelete<SkPDFGlyphSetMap> fFontGlyphUsage;
247
248 SkPicture::EncodeBitmap fEncoder;
249 SkScalar fRasterDpi;
250
251 SkBitmap fLegacyBitmap;
252
253 SkPDFDevice(const SkISize& layerSize, const SkClipStack& existingClipStack,
254 const SkRegion& existingClipRegion);
255
256 // override from SkBaseDevice
257 SkBaseDevice* onCreateCompatibleDevice(const CreateInfo&) SK_OVERRIDE;
258
259 void init();
260 void cleanUp(bool clearFontUsage);
261 SkPDFFormXObject* createFormXObjectFromDevice();
262
263 void drawFormXObjectWithMask(int xObjectIndex,
264 SkPDFFormXObject* mask,
265 const SkClipStack* clipStack,
266 const SkRegion& clipRegion,
267 SkXfermode::Mode mode,
268 bool invertClip);
269
270 // If the paint or clip is such that we shouldn't draw anything, this
271 // returns NULL and does not create a content entry.
272 // setUpContentEntry and finishContentEntry can be used directly, but
273 // the preferred method is to use the ScopedContentEntry helper class.
274 ContentEntry* setUpContentEntry(const SkClipStack* clipStack,
275 const SkRegion& clipRegion,
276 const SkMatrix& matrix,
277 const SkPaint& paint,
278 bool hasText,
279 SkPDFFormXObject** dst);
280 void finishContentEntry(SkXfermode::Mode xfermode,
281 SkPDFFormXObject* dst,
282 SkPath* shape);
283 bool isContentEmpty();
284
285 void populateGraphicStateEntryFromPaint(const SkMatrix& matrix,
286 const SkClipStack& clipStack,
287 const SkRegion& clipRegion,
288 const SkPaint& paint,
289 bool hasText,
290 GraphicStateEntry* entry);
291 int addGraphicStateResource(SkPDFGraphicState* gs);
292 int addXObjectResource(SkPDFObject* xObject);
293
294 void updateFont(const SkPaint& paint, uint16_t glyphID,
295 ContentEntry* contentEntry);
296 int getFontResourceIndex(SkTypeface* typeface, uint16_t glyphID);
297
298 void internalDrawPaint(const SkPaint& paint, ContentEntry* contentEntry);
299 void internalDrawBitmap(const SkMatrix& matrix,
300 const SkClipStack* clipStack,
301 const SkRegion& clipRegion,
302 const SkBitmap& bitmap,
303 const SkIRect* srcRect,
304 const SkPaint& paint);
305
306 /** Helper method for copyContentToData. It is responsible for copying the
307 * list of content entries |entry| to |data|.
308 */
309 void copyContentEntriesToData(ContentEntry* entry, SkWStream* data) const;
310
311 #ifdef SK_PDF_USE_PATHOPS
312 bool handleInversePath(const SkDraw& d, const SkPath& origPath,
313 const SkPaint& paint, bool pathIsMutable,
314 const SkMatrix* prePathMatrix = NULL);
315 #endif
316 bool handleRectAnnotation(const SkRect& r, const SkMatrix& matrix,
317 const SkPaint& paint);
318 bool handlePointAnnotation(const SkPoint* points, size_t count,
319 const SkMatrix& matrix, const SkPaint& paint);
320 SkPDFDict* createLinkAnnotation(const SkRect& r, const SkMatrix& matrix);
321 void handleLinkToURL(SkData* urlData, const SkRect& r,
322 const SkMatrix& matrix);
323 void handleLinkToNamedDest(SkData* nameData, const SkRect& r,
324 const SkMatrix& matrix);
325 void defineNamedDestination(SkData* nameData, const SkPoint& point,
326 const SkMatrix& matrix);
327
328 typedef SkBaseDevice INHERITED;
329
330 // TODO(edisonn): Only SkDocument_PDF and SkPDFImageShader should be able to create
331 // an SkPDFDevice
332 //friend class SkDocument_PDF;
333 //friend class SkPDFImageShader;
334 };
335
336 #endif
OLDNEW
« no previous file with comments | « gyp/tools.gyp ('k') | include/pdf/SkPDFDocument.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698