OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2010 The Android Open Source Project | 3 * Copyright 2010 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #ifndef SkPDFCatalog_DEFINED | 10 #ifndef SkPDFCatalog_DEFINED |
11 #define SkPDFCatalog_DEFINED | 11 #define SkPDFCatalog_DEFINED |
12 | 12 |
13 #include <sys/types.h> | |
14 | |
15 #include "SkPDFTypes.h" | 13 #include "SkPDFTypes.h" |
16 #include "SkTDArray.h" | 14 #include "SkTDArray.h" |
| 15 #include "SkTHash.h" |
17 | 16 |
18 /** \class SkPDFCatalog | 17 /** \class SkPDFCatalog |
19 | 18 |
20 The PDF catalog manages object numbers and file offsets. It is used | 19 The PDF catalog manages object numbers. It is used |
21 to create the PDF cross reference table. | 20 to create the PDF cross reference table. |
22 */ | 21 */ |
23 class SkPDFCatalog { | 22 class SkPDFCatalog { |
24 public: | 23 public: |
25 /** Create a PDF catalog. | |
26 */ | |
27 SkPDFCatalog(); | 24 SkPDFCatalog(); |
28 ~SkPDFCatalog(); | 25 ~SkPDFCatalog(); |
29 | 26 |
30 /** Add the passed object to the catalog. Refs obj. | 27 /** Add the passed object to the catalog. |
31 * @param obj The object to add. | 28 * @param obj The object to add. |
32 * @param onFirstPage Is the object on the first page. | 29 * @return True iff the object was not already added to the catalog. |
33 * @return The obj argument is returned. | |
34 */ | 30 */ |
35 SkPDFObject* addObject(SkPDFObject* obj, bool onFirstPage); | 31 bool addObject(SkPDFObject* obj); |
36 | |
37 /** Inform the catalog of the object's position in the final stream. | |
38 * The object should already have been added to the catalog. | |
39 * @param obj The object to add. | |
40 * @param offset The byte offset in the output stream of this object. | |
41 */ | |
42 void setFileOffset(SkPDFObject* obj, off_t offset); | |
43 | 32 |
44 /** Get the object number for the passed object. | 33 /** Get the object number for the passed object. |
45 * @param obj The object of interest. | 34 * @param obj The object of interest. |
46 */ | 35 */ |
47 int32_t getObjectNumber(SkPDFObject* obj); | 36 int32_t getObjectNumber(SkPDFObject* obj) const; |
48 | |
49 /** Output the cross reference table for objects in the catalog. | |
50 * Returns the total number of objects. | |
51 * @param stream The writable output stream to send the output to. | |
52 * @param firstPage If true, include first page objects only, otherwise | |
53 * include all objects not on the first page. | |
54 */ | |
55 int32_t emitXrefTable(SkWStream* stream, bool firstPage); | |
56 | 37 |
57 /** Set substitute object for the passed object. | 38 /** Set substitute object for the passed object. |
| 39 Refs substitute. |
58 */ | 40 */ |
59 void setSubstitute(SkPDFObject* original, SkPDFObject* substitute); | 41 void setSubstitute(SkPDFObject* original, SkPDFObject* substitute); |
60 | 42 |
61 /** Find and return any substitute object set for the passed object. If | 43 /** Find and return any substitute object set for the passed object. If |
62 * there is none, return the passed object. | 44 * there is none, return the passed object. |
63 */ | 45 */ |
64 SkPDFObject* getSubstituteObject(SkPDFObject* object); | 46 SkPDFObject* getSubstituteObject(SkPDFObject* object) const; |
65 | 47 |
66 private: | 48 private: |
67 struct Rec { | 49 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers; |
68 Rec(SkPDFObject* object, bool onFirstPage) | 50 SkTHashMap<SkPDFObject*, SkPDFObject*> fSubstituteMap; |
69 : fObject(object), | |
70 fFileOffset(0), | |
71 fObjNumAssigned(false), | |
72 fOnFirstPage(onFirstPage) { | |
73 } | |
74 SkPDFObject* fObject; | |
75 off_t fFileOffset; | |
76 bool fObjNumAssigned; | |
77 bool fOnFirstPage; | |
78 }; | |
79 | |
80 struct SubstituteMapping { | |
81 SubstituteMapping(SkPDFObject* original, SkPDFObject* substitute) | |
82 : fOriginal(original), fSubstitute(substitute) { | |
83 } | |
84 SkPDFObject* fOriginal; | |
85 SkPDFObject* fSubstitute; | |
86 }; | |
87 | |
88 // TODO(vandebo): Make this a hash if it's a performance problem. | |
89 SkTDArray<Rec> fCatalog; | |
90 | |
91 // TODO(arthurhsu): Make this a hash if it's a performance problem. | |
92 SkTDArray<SubstituteMapping> fSubstituteMap; | |
93 SkTSet<SkPDFObject*> fSubstituteResourcesFirstPage; | |
94 SkTSet<SkPDFObject*> fSubstituteResourcesRemaining; | |
95 | |
96 // Number of objects on the first page. | |
97 uint32_t fFirstPageCount; | |
98 // Next object number to assign (on page > 1). | |
99 uint32_t fNextObjNum; | |
100 // Next object number to assign on the first page. | |
101 uint32_t fNextFirstPageObjNum; | |
102 | |
103 int findObjectIndex(SkPDFObject* obj); | |
104 | |
105 int assignObjNum(SkPDFObject* obj); | |
106 }; | 51 }; |
107 | 52 |
108 #endif | 53 #endif |
OLD | NEW |