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

Side by Side Diff: src/pdf/SkPDFTypes.h

Issue 2253283004: SkPDF: in-place font subsetting (Closed) Base URL: https://skia.googlesource.com/skia.git@SkPdfCacheMetrics
Patch Set: 2016-08-18 (Thursday) 16:02:16 EDT Created 4 years, 4 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 | « src/pdf/SkPDFMetadata.cpp ('k') | src/pdf/SkPDFTypes.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2010 The Android Open Source Project 2 * Copyright 2010 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #ifndef SkPDFTypes_DEFINED 9 #ifndef SkPDFTypes_DEFINED
10 #define SkPDFTypes_DEFINED 10 #define SkPDFTypes_DEFINED
11 11
12 #include "SkRefCnt.h" 12 #include "SkRefCnt.h"
13 #include "SkScalar.h" 13 #include "SkScalar.h"
14 #include "SkTHash.h" 14 #include "SkTHash.h"
15 #include "SkTypes.h" 15 #include "SkTypes.h"
16 16
17 class SkData; 17 class SkData;
18 class SkPDFObjNumMap; 18 class SkPDFObjNumMap;
19 class SkPDFObject; 19 class SkPDFObject;
20 class SkPDFSubstituteMap;
21 class SkStreamAsset; 20 class SkStreamAsset;
22 class SkString; 21 class SkString;
23 class SkWStream; 22 class SkWStream;
24 23
25 #ifdef SK_PDF_IMAGE_STATS 24 #ifdef SK_PDF_IMAGE_STATS
26 #include "SkAtomics.h" 25 #include "SkAtomics.h"
27 #endif 26 #endif
28 27
29 /** \class SkPDFObject 28 /** \class SkPDFObject
30 29
31 A PDF Object is the base class for primitive elements in a PDF file. A 30 A PDF Object is the base class for primitive elements in a PDF file. A
32 common subtype is used to ease the use of indirect object references, 31 common subtype is used to ease the use of indirect object references,
33 which are common in the PDF format. 32 which are common in the PDF format.
34 33
35 */ 34 */
36 class SkPDFObject : public SkRefCnt { 35 class SkPDFObject : public SkRefCnt {
37 public: 36 public:
38 /** Subclasses must implement this method to print the object to the 37 /** Subclasses must implement this method to print the object to the
39 * PDF file. 38 * PDF file.
40 * @param catalog The object catalog to use. 39 * @param catalog The object catalog to use.
41 * @param stream The writable output stream to send the output to. 40 * @param stream The writable output stream to send the output to.
42 */ 41 */
43 virtual void emitObject(SkWStream* stream, 42 virtual void emitObject(SkWStream* stream,
44 const SkPDFObjNumMap& objNumMap, 43 const SkPDFObjNumMap& objNumMap) const = 0;
45 const SkPDFSubstituteMap& substitutes) const = 0;
46 44
47 /** 45 /**
48 * Adds all transitive dependencies of this object to the 46 * Adds all transitive dependencies of this object to the
49 * catalog. Implementations should respect the catalog's object 47 * catalog. Implementations should respect the catalog's object
50 * substitution map. 48 * substitution map.
51 */ 49 */
52 virtual void addResources(SkPDFObjNumMap* catalog, 50 virtual void addResources(SkPDFObjNumMap* catalog) const {}
53 const SkPDFSubstituteMap& substitutes) const {}
54 51
55 /** 52 /**
56 * Release all resources associated with this SkPDFObject. It is 53 * Release all resources associated with this SkPDFObject. It is
57 * an error to call emitObject() or addResources() after calling 54 * an error to call emitObject() or addResources() after calling
58 * drop(). 55 * drop().
59 */ 56 */
60 virtual void drop() {} 57 virtual void drop() {}
61 58
62 virtual ~SkPDFObject() {} 59 virtual ~SkPDFObject() {}
63 private: 60 private:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 static SkPDFUnion Name(const SkString&); 111 static SkPDFUnion Name(const SkString&);
115 112
116 /** SkPDFUnion::String will encode the passed string. */ 113 /** SkPDFUnion::String will encode the passed string. */
117 static SkPDFUnion String(const SkString&); 114 static SkPDFUnion String(const SkString&);
118 115
119 static SkPDFUnion Object(sk_sp<SkPDFObject>); 116 static SkPDFUnion Object(sk_sp<SkPDFObject>);
120 static SkPDFUnion ObjRef(sk_sp<SkPDFObject>); 117 static SkPDFUnion ObjRef(sk_sp<SkPDFObject>);
121 118
122 /** These two non-virtual methods mirror SkPDFObject's 119 /** These two non-virtual methods mirror SkPDFObject's
123 corresponding virtuals. */ 120 corresponding virtuals. */
124 void emitObject(SkWStream*, 121 void emitObject(SkWStream*, const SkPDFObjNumMap&) const;
125 const SkPDFObjNumMap&, 122 void addResources(SkPDFObjNumMap*) const;
126 const SkPDFSubstituteMap&) const;
127 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const;
128 123
129 bool isName() const; 124 bool isName() const;
130 125
131 private: 126 private:
132 union { 127 union {
133 int32_t fIntValue; 128 int32_t fIntValue;
134 bool fBoolValue; 129 bool fBoolValue;
135 SkScalar fScalarValue; 130 SkScalar fScalarValue;
136 const char* fStaticString; 131 const char* fStaticString;
137 char fSkString[sizeof(SkString)]; 132 char fSkString[sizeof(SkString)];
(...skipping 26 matching lines...) Expand all
164 159
165 //////////////////////////////////////////////////////////////////////////////// 160 ////////////////////////////////////////////////////////////////////////////////
166 161
167 #if 0 // Enable if needed. 162 #if 0 // Enable if needed.
168 /** This class is a SkPDFUnion with SkPDFObject virtuals attached. 163 /** This class is a SkPDFUnion with SkPDFObject virtuals attached.
169 The only use case of this is when a non-compound PDF object is 164 The only use case of this is when a non-compound PDF object is
170 referenced indirectly. */ 165 referenced indirectly. */
171 class SkPDFAtom final : public SkPDFObject { 166 class SkPDFAtom final : public SkPDFObject {
172 public: 167 public:
173 void emitObject(SkWStream* stream, 168 void emitObject(SkWStream* stream,
174 const SkPDFObjNumMap& objNumMap, 169 const SkPDFObjNumMap& objNumMap) final;
175 const SkPDFSubstituteMap& substitutes) final; 170 void addResources(SkPDFObjNumMap* const final;
176 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const final;
177 SkPDFAtom(SkPDFUnion&& v) : fValue(std::move(v) {} 171 SkPDFAtom(SkPDFUnion&& v) : fValue(std::move(v) {}
178 172
179 private: 173 private:
180 const SkPDFUnion fValue; 174 const SkPDFUnion fValue;
181 typedef SkPDFObject INHERITED; 175 typedef SkPDFObject INHERITED;
182 }; 176 };
183 #endif // 0 177 #endif // 0
184 178
185 //////////////////////////////////////////////////////////////////////////////// 179 ////////////////////////////////////////////////////////////////////////////////
186 180
187 /** \class SkPDFArray 181 /** \class SkPDFArray
188 182
189 An array object in a PDF. 183 An array object in a PDF.
190 */ 184 */
191 class SkPDFArray final : public SkPDFObject { 185 class SkPDFArray final : public SkPDFObject {
192 public: 186 public:
193 /** Create a PDF array. Maximum length is 8191. 187 /** Create a PDF array. Maximum length is 8191.
194 */ 188 */
195 SkPDFArray(); 189 SkPDFArray();
196 virtual ~SkPDFArray(); 190 virtual ~SkPDFArray();
197 191
198 // The SkPDFObject interface. 192 // The SkPDFObject interface.
199 void emitObject(SkWStream* stream, 193 void emitObject(SkWStream* stream,
200 const SkPDFObjNumMap& objNumMap, 194 const SkPDFObjNumMap& objNumMap) const override;
201 const SkPDFSubstituteMap& substitutes) const override; 195 void addResources(SkPDFObjNumMap*) const override;
202 void addResources(SkPDFObjNumMap*,
203 const SkPDFSubstituteMap&) const override;
204 void drop() override; 196 void drop() override;
205 197
206 /** The size of the array. 198 /** The size of the array.
207 */ 199 */
208 int size() const; 200 int size() const;
209 201
210 /** Preallocate space for the given number of entries. 202 /** Preallocate space for the given number of entries.
211 * @param length The number of array slots to preallocate. 203 * @param length The number of array slots to preallocate.
212 */ 204 */
213 void reserve(int length); 205 void reserve(int length);
(...skipping 26 matching lines...) Expand all
240 public: 232 public:
241 /** Create a PDF dictionary. 233 /** Create a PDF dictionary.
242 * @param type The value of the Type entry, nullptr for no type. 234 * @param type The value of the Type entry, nullptr for no type.
243 */ 235 */
244 explicit SkPDFDict(const char type[] = nullptr); 236 explicit SkPDFDict(const char type[] = nullptr);
245 237
246 virtual ~SkPDFDict(); 238 virtual ~SkPDFDict();
247 239
248 // The SkPDFObject interface. 240 // The SkPDFObject interface.
249 void emitObject(SkWStream* stream, 241 void emitObject(SkWStream* stream,
250 const SkPDFObjNumMap& objNumMap, 242 const SkPDFObjNumMap& objNumMap) const override;
251 const SkPDFSubstituteMap& substitutes) const override; 243 void addResources(SkPDFObjNumMap*) const override;
252 void addResources(SkPDFObjNumMap*,
253 const SkPDFSubstituteMap&) const override;
254 void drop() override; 244 void drop() override;
255 245
256 /** The size of the dictionary. 246 /** The size of the dictionary.
257 */ 247 */
258 int size() const; 248 int size() const;
259 249
260 /** Add the value to the dictionary with the given key. 250 /** Add the value to the dictionary with the given key.
261 * @param key The text of the key for this dictionary entry. 251 * @param key The text of the key for this dictionary entry.
262 * @param value The value for this dictionary entry. 252 * @param value The value for this dictionary entry.
263 */ 253 */
(...skipping 11 matching lines...) Expand all
275 void insertInt(const char key[], size_t value); 265 void insertInt(const char key[], size_t value);
276 void insertScalar(const char key[], SkScalar value); 266 void insertScalar(const char key[], SkScalar value);
277 void insertName(const char key[], const char nameValue[]); 267 void insertName(const char key[], const char nameValue[]);
278 void insertName(const char key[], const SkString& nameValue); 268 void insertName(const char key[], const SkString& nameValue);
279 void insertString(const char key[], const char value[]); 269 void insertString(const char key[], const char value[]);
280 void insertString(const char key[], const SkString& value); 270 void insertString(const char key[], const SkString& value);
281 271
282 /** Emit the dictionary, without the "<<" and ">>". 272 /** Emit the dictionary, without the "<<" and ">>".
283 */ 273 */
284 void emitAll(SkWStream* stream, 274 void emitAll(SkWStream* stream,
285 const SkPDFObjNumMap& objNumMap, 275 const SkPDFObjNumMap& objNumMap) const;
286 const SkPDFSubstituteMap& substitutes) const;
287 276
288 private: 277 private:
289 struct Record { 278 struct Record {
290 SkPDFUnion fKey; 279 SkPDFUnion fKey;
291 SkPDFUnion fValue; 280 SkPDFUnion fValue;
292 Record(SkPDFUnion&&, SkPDFUnion&&); 281 Record(SkPDFUnion&&, SkPDFUnion&&);
293 Record(Record&&) = default; 282 Record(Record&&) = default;
294 Record& operator=(Record&&) = default; 283 Record& operator=(Record&&) = default;
295 Record(const Record&) = delete; 284 Record(const Record&) = delete;
296 Record& operator=(const Record&) = delete; 285 Record& operator=(const Record&) = delete;
297 }; 286 };
298 SkTArray<Record> fRecords; 287 SkTArray<Record> fRecords;
299 SkDEBUGCODE(bool fDumped;) 288 SkDEBUGCODE(bool fDumped;)
300 }; 289 };
301 290
302 /** \class SkPDFSharedStream 291 /** \class SkPDFSharedStream
303 292
304 This class takes an asset and assumes that it is backed by 293 This class takes an asset and assumes that it is backed by
305 long-lived shared data (for example, an open file 294 long-lived shared data (for example, an open file
306 descriptor). That is: no memory savings can be made by holding on 295 descriptor). That is: no memory savings can be made by holding on
307 to a compressed version instead. 296 to a compressed version instead.
308 */ 297 */
309 class SkPDFSharedStream final : public SkPDFObject { 298 class SkPDFSharedStream final : public SkPDFObject {
310 public: 299 public:
311 SkPDFSharedStream(std::unique_ptr<SkStreamAsset> data); 300 SkPDFSharedStream(std::unique_ptr<SkStreamAsset> data);
312 ~SkPDFSharedStream(); 301 ~SkPDFSharedStream();
313 SkPDFDict* dict() { return &fDict; } 302 SkPDFDict* dict() { return &fDict; }
314 void emitObject(SkWStream*, 303 void emitObject(SkWStream*,
315 const SkPDFObjNumMap&, 304 const SkPDFObjNumMap&) const override;
316 const SkPDFSubstituteMap&) const override; 305 void addResources(SkPDFObjNumMap*) const override;
317 void addResources(SkPDFObjNumMap*,
318 const SkPDFSubstituteMap&) const override;
319 void drop() override; 306 void drop() override;
320 307
321 private: 308 private:
322 std::unique_ptr<SkStreamAsset> fAsset; 309 std::unique_ptr<SkStreamAsset> fAsset;
323 SkPDFDict fDict; 310 SkPDFDict fDict;
324 typedef SkPDFObject INHERITED; 311 typedef SkPDFObject INHERITED;
325 }; 312 };
326 313
327 /** \class SkPDFStream 314 /** \class SkPDFStream
328 315
(...skipping 10 matching lines...) Expand all
339 * @param data The data part of the stream. 326 * @param data The data part of the stream.
340 * @param stream The data part of the stream. */ 327 * @param stream The data part of the stream. */
341 explicit SkPDFStream(sk_sp<SkData> data); 328 explicit SkPDFStream(sk_sp<SkData> data);
342 explicit SkPDFStream(std::unique_ptr<SkStreamAsset> stream); 329 explicit SkPDFStream(std::unique_ptr<SkStreamAsset> stream);
343 virtual ~SkPDFStream(); 330 virtual ~SkPDFStream();
344 331
345 SkPDFDict* dict() { return &fDict; } 332 SkPDFDict* dict() { return &fDict; }
346 333
347 // The SkPDFObject interface. 334 // The SkPDFObject interface.
348 void emitObject(SkWStream* stream, 335 void emitObject(SkWStream* stream,
349 const SkPDFObjNumMap& objNumMap, 336 const SkPDFObjNumMap& objNumMap) const override;
350 const SkPDFSubstituteMap& substitutes) const override; 337 void addResources(SkPDFObjNumMap*) const final;
351 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const final;
352 void drop() override; 338 void drop() override;
353 339
354 protected: 340 protected:
355 /* Create a PDF stream with no data. The setData method must be called to 341 /* Create a PDF stream with no data. The setData method must be called to
356 * set the data. */ 342 * set the data. */
357 SkPDFStream(); 343 SkPDFStream();
358 344
359 /** Only call this function once. */ 345 /** Only call this function once. */
360 void setData(std::unique_ptr<SkStreamAsset> stream); 346 void setData(std::unique_ptr<SkStreamAsset> stream);
361 347
(...skipping 14 matching lines...) Expand all
376 class SkPDFObjNumMap : SkNoncopyable { 362 class SkPDFObjNumMap : SkNoncopyable {
377 public: 363 public:
378 /** Add the passed object to the catalog. 364 /** Add the passed object to the catalog.
379 * @param obj The object to add. 365 * @param obj The object to add.
380 * @return True iff the object was not already added to the catalog. 366 * @return True iff the object was not already added to the catalog.
381 */ 367 */
382 bool addObject(SkPDFObject* obj); 368 bool addObject(SkPDFObject* obj);
383 369
384 /** Add the passed object to the catalog, as well as all its dependencies. 370 /** Add the passed object to the catalog, as well as all its dependencies.
385 * @param obj The object to add. If nullptr, this is a noop. 371 * @param obj The object to add. If nullptr, this is a noop.
386 * @param subs Will be passed to obj->addResources().
387 */ 372 */
388 void addObjectRecursively(SkPDFObject* obj, const SkPDFSubstituteMap& subs); 373 void addObjectRecursively(SkPDFObject* obj);
389 374
390 /** Get the object number for the passed object. 375 /** Get the object number for the passed object.
391 * @param obj The object of interest. 376 * @param obj The object of interest.
392 */ 377 */
393 int32_t getObjectNumber(SkPDFObject* obj) const; 378 int32_t getObjectNumber(SkPDFObject* obj) const;
394 379
395 const SkTArray<sk_sp<SkPDFObject>>& objects() const { return fObjects; } 380 const SkTArray<sk_sp<SkPDFObject>>& objects() const { return fObjects; }
396 381
397 private: 382 private:
398 SkTArray<sk_sp<SkPDFObject>> fObjects; 383 SkTArray<sk_sp<SkPDFObject>> fObjects;
399 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers; 384 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers;
400 }; 385 };
401 386
402 //////////////////////////////////////////////////////////////////////////////// 387 ////////////////////////////////////////////////////////////////////////////////
403 388
404 /** \class SkPDFSubstituteMap
405
406 The PDF Substitute Map manages substitute objects and owns the
407 substitutes.
408 */
409 class SkPDFSubstituteMap : SkNoncopyable {
410 public:
411 ~SkPDFSubstituteMap();
412 /** Set substitute object for the passed object.
413 Refs substitute.
414 */
415 void setSubstitute(SkPDFObject* original, SkPDFObject* substitute);
416
417 /** Find and return any substitute object set for the passed object. If
418 * there is none, return the passed object.
419 */
420 SkPDFObject* getSubstitute(SkPDFObject* object) const;
421
422 SkPDFObject* operator()(SkPDFObject* o) const {
423 return this->getSubstitute(o);
424 }
425
426 private:
427 SkTHashMap<SkPDFObject*, SkPDFObject*> fSubstituteMap;
428 };
429
430 #ifdef SK_PDF_IMAGE_STATS 389 #ifdef SK_PDF_IMAGE_STATS
431 extern SkAtomic<int> gDrawImageCalls; 390 extern SkAtomic<int> gDrawImageCalls;
432 extern SkAtomic<int> gJpegImageObjects; 391 extern SkAtomic<int> gJpegImageObjects;
433 extern SkAtomic<int> gRegularImageObjects; 392 extern SkAtomic<int> gRegularImageObjects;
434 extern void SkPDFImageDumpStats(); 393 extern void SkPDFImageDumpStats();
435 #endif // SK_PDF_IMAGE_STATS 394 #endif // SK_PDF_IMAGE_STATS
436 395
437 #endif 396 #endif
OLDNEW
« no previous file with comments | « src/pdf/SkPDFMetadata.cpp ('k') | src/pdf/SkPDFTypes.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698