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

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

Issue 1069103003: SkPDF: Refactor SkPDFObject heiararchy. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: 2015-04-25 (Saturday) 09:40:48 EDT Created 5 years, 8 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/SkPDFResourceDict.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
2 /* 1 /*
3 * Copyright 2010 The Android Open Source Project 2 * Copyright 2010 The Android Open Source Project
4 * 3 *
5 * 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
6 * found in the LICENSE file. 5 * found in the LICENSE file.
7 */ 6 */
8 7
9 8
10 #ifndef SkPDFTypes_DEFINED 9 #ifndef SkPDFTypes_DEFINED
11 #define SkPDFTypes_DEFINED 10 #define SkPDFTypes_DEFINED
12 11
13 #include "SkPDFTypes.h"
14 #include "SkRefCnt.h" 12 #include "SkRefCnt.h"
15 #include "SkScalar.h" 13 #include "SkScalar.h"
16 #include "SkString.h" 14 #include "SkString.h"
17 #include "SkTDArray.h" 15 #include "SkTDArray.h"
18 #include "SkTHash.h" 16 #include "SkTHash.h"
19 #include "SkTypes.h" 17 #include "SkTypes.h"
20 18
21 class SkPDFObjNumMap; 19 class SkPDFObjNumMap;
22 class SkPDFObject; 20 class SkPDFObject;
23 class SkPDFSubstituteMap; 21 class SkPDFSubstituteMap;
24 class SkWStream; 22 class SkWStream;
25 23
26 /** \class SkPDFObject 24 /** \class SkPDFObject
27 25
28 A PDF Object is the base class for primitive elements in a PDF file. A 26 A PDF Object is the base class for primitive elements in a PDF file. A
29 common subtype is used to ease the use of indirect object references, 27 common subtype is used to ease the use of indirect object references,
30 which are common in the PDF format. 28 which are common in the PDF format.
29
31 */ 30 */
32 class SkPDFObject : public SkRefCnt { 31 class SkPDFObject : public SkRefCnt {
33 public: 32 public:
34 SK_DECLARE_INST_COUNT(SkPDFObject) 33 SK_DECLARE_INST_COUNT(SkPDFObject);
35 34
36 /** Subclasses must implement this method to print the object to the 35 /** Subclasses must implement this method to print the object to the
37 * PDF file. 36 * PDF file.
38 * @param catalog The object catalog to use. 37 * @param catalog The object catalog to use.
39 * @param stream The writable output stream to send the output to. 38 * @param stream The writable output stream to send the output to.
40 */ 39 */
41 // TODO(halcanary): make this method const 40 // TODO(halcanary): make this method const
42 virtual void emitObject(SkWStream* stream, 41 virtual void emitObject(SkWStream* stream,
43 const SkPDFObjNumMap& objNumMap, 42 const SkPDFObjNumMap& objNumMap,
44 const SkPDFSubstituteMap& substitutes) = 0; 43 const SkPDFSubstituteMap& substitutes) = 0;
45 44
46 /** 45 /**
47 * Adds all transitive dependencies of this object to the 46 * Adds all transitive dependencies of this object to the
48 * catalog. Implementations should respect the catalog's object 47 * catalog. Implementations should respect the catalog's object
49 * substitution map. 48 * substitution map.
50 */ 49 */
51 virtual void addResources(SkPDFObjNumMap* catalog, 50 virtual void addResources(SkPDFObjNumMap* catalog,
52 const SkPDFSubstituteMap& substitutes) const {} 51 const SkPDFSubstituteMap& substitutes) const {}
53 52
54 private: 53 private:
55 typedef SkRefCnt INHERITED; 54 typedef SkRefCnt INHERITED;
56 }; 55 };
57 56
58 /** \class SkPDFObjRef 57 ////////////////////////////////////////////////////////////////////////////////
59 58
60 An indirect reference to a PDF object. 59 /**
61 */ 60 A SkPDFUnion is a non-virtualized implementation of the
62 class SkPDFObjRef : public SkPDFObject { 61 non-compound, non-specialized PDF Object types: Name, String,
62 Number, Boolean.
63 */
64 class SkPDFUnion {
63 public: 65 public:
64 SK_DECLARE_INST_COUNT(SkPDFObjRef) 66 // u.move() is analogous to std::move(u). It returns an rvalue.
67 SkPDFUnion move() { return static_cast<SkPDFUnion&&>(*this); }
68 // Move contstructor and assignemnt operator destroy the argument
69 // and steal their references (if needed).
70 SkPDFUnion(SkPDFUnion&& other);
71 SkPDFUnion& operator=(SkPDFUnion&& other);
65 72
66 /** Create a reference to an existing SkPDFObject. 73 ~SkPDFUnion();
67 * @param obj The object to reference.
68 */
69 explicit SkPDFObjRef(SkPDFObject* obj);
70 virtual ~SkPDFObjRef();
71 74
72 // The SkPDFObject interface. 75 /** The following nine functions are the standard way of creating
73 virtual void emitObject(SkWStream* stream, 76 SkPDFUnion objects. */
74 const SkPDFObjNumMap& objNumMap, 77
75 const SkPDFSubstituteMap& substitutes) override; 78 static SkPDFUnion Int(int32_t);
76 virtual void addResources(SkPDFObjNumMap*, 79
77 const SkPDFSubstituteMap&) const override; 80 static SkPDFUnion Bool(bool);
81
82 static SkPDFUnion Scalar(SkScalar);
83
84 /** These two functions do NOT take ownership of ptr, and do NOT
85 copy the string. Suitable for passing in static const
86 strings. For example:
87 SkPDFUnion n = SkPDFUnion::Name("Length");
88 SkPDFUnion u = SkPDFUnion::String("Identity"); */
89
90 /** SkPDFUnion::Name(const char*) assumes that the passed string
91 is already a valid name (that is: it has no control or
92 whitespace characters). This will not copy the name. */
93 static SkPDFUnion Name(const char*);
94
95 /** SkPDFUnion::String will encode the passed string. This will
96 not copy the name. */
97 static SkPDFUnion String(const char*);
98
99 /** SkPDFUnion::Name(const SkString&) does not assume that the
100 passed string is already a valid name and it will escape the
101 string. */
102 static SkPDFUnion Name(const SkString&);
103
104 /** SkPDFUnion::String will encode the passed string. */
105 static SkPDFUnion String(const SkString&);
106
107 /** This function DOES take ownership of the object. E.g.
108 SkAutoTUnref<SkPDFDict> dict(new SkPDFDict);
109 dict->insert(.....);
110 SkPDFUnion u = SkPDFUnion::Object(dict.detach()) */
111 static SkPDFUnion Object(SkPDFObject*);
112
113 /** This function DOES take ownership of the object. E.g.
114 SkAutoTUnref<SkPDFBitmap> image(
115 SkPDFBitmap::Create(fCanon, bitmap));
116 SkPDFUnion u = SkPDFUnion::ObjRef(image.detach()) */
117 static SkPDFUnion ObjRef(SkPDFObject*);
118
119 /** These two non-virtual methods mirror SkPDFObject's
120 corresponding virtuals. */
121 void emitObject(SkWStream*,
122 const SkPDFObjNumMap&,
123 const SkPDFSubstituteMap&) const;
124 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const;
125
126 bool isName() const;
78 127
79 private: 128 private:
80 SkAutoTUnref<SkPDFObject> fObj; 129 union {
130 int32_t fIntValue;
131 bool fBoolValue;
132 SkScalar fScalarValue;
133 const char* fStaticString;
134 char fSkString[sizeof(SkString)];
135 SkPDFObject* fObject;
136 };
137 enum class Type : char {
138 /** It is an error to call emitObject() or addResources() on an
139 kDestroyed object. */
140 kDestroyed = 0,
141 kInt,
142 kBool,
143 kScalar,
144 kName,
145 kString,
146 kNameSkS,
147 kStringSkS,
148 kObjRef,
149 kObject,
150 };
151 Type fType;
81 152
153 SkPDFUnion(Type);
154 // We do not now need copy constructor and copy assignment, so we
155 // will disable this functionality.
156 SkPDFUnion& operator=(const SkPDFUnion&) = delete;
157 SkPDFUnion(const SkPDFUnion&) = delete;
158 };
159 SK_COMPILE_ASSERT(sizeof(SkString) == sizeof(void*), SkString_size);
160
161 ////////////////////////////////////////////////////////////////////////////////
162
163 /** This class is a SkPDFUnion with SkPDFObject virtuals attached. */
164 // TODO(halcanary): 99% of the uses of this class should be
165 // transitioned to using a bare SkPDFUnion inside an array or dict.
166 class SkPDFAtom : public SkPDFObject {
167 public:
168 void emitObject(SkWStream* stream,
169 const SkPDFObjNumMap& objNumMap,
170 const SkPDFSubstituteMap& substitutes) final;
171 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const final;
172
173 protected:
174 SkPDFAtom(SkPDFUnion&& v) : fValue(v.move()) {}
175
176 private:
177 const SkPDFUnion fValue;
82 typedef SkPDFObject INHERITED; 178 typedef SkPDFObject INHERITED;
83 }; 179 };
84 180
85 /** \class SkPDFInt 181 /** The following six classes exist only to ease transition to SkPDFUnion. */
182 class SkPDFObjRef : public SkPDFAtom {
183 public:
184 SK_DECLARE_INST_COUNT(SkPDFObjRef);
185 explicit SkPDFObjRef(SkPDFObject* obj)
186 : INHERITED(SkPDFUnion::ObjRef(SkRef(obj))) {}
187 typedef SkPDFAtom INHERITED;
188 };
86 189
87 An integer object in a PDF. 190 class SkPDFInt : public SkPDFAtom {
88 */
89 class SkPDFInt : public SkPDFObject {
90 public: 191 public:
91 SK_DECLARE_INST_COUNT(SkPDFInt) 192 SK_DECLARE_INST_COUNT(SkPDFInt);
193 explicit SkPDFInt(int32_t value) : INHERITED(SkPDFUnion::Int(value)) {}
194 typedef SkPDFAtom INHERITED;
195 };
92 196
93 /** Create a PDF integer (usually for indirect reference purposes). 197 class SkPDFBool : public SkPDFAtom {
94 * @param value An integer value between 2^31 - 1 and -2^31. 198 public:
95 */ 199 SK_DECLARE_INST_COUNT(SkPDFBool);
96 explicit SkPDFInt(int32_t value); 200 explicit SkPDFBool(bool value) : INHERITED(SkPDFUnion::Bool(value)) {}
97 virtual ~SkPDFInt(); 201 typedef SkPDFAtom INHERITED;
202 };
98 203
99 // The SkPDFObject interface. 204 class SkPDFScalar : public SkPDFAtom {
100 virtual void emitObject(SkWStream* stream, 205 public:
101 const SkPDFObjNumMap& objNumMap, 206 SK_DECLARE_INST_COUNT(SkPDFScalar);
102 const SkPDFSubstituteMap& substitutes) override; 207 explicit SkPDFScalar(SkScalar value)
208 : INHERITED(SkPDFUnion::Scalar(value)) {}
209 static void Append(SkScalar value, SkWStream* stream);
210 typedef SkPDFAtom INHERITED;
211 };
212
213 class SkPDFString : public SkPDFAtom {
214 public:
215 SK_DECLARE_INST_COUNT(SkPDFString);
216 explicit SkPDFString(const char value[])
217 : INHERITED(SkPDFUnion::String(value)) {}
218 explicit SkPDFString(const SkString& value)
219 : INHERITED(SkPDFUnion::String(value)) {}
220
221 static SkString FormatString(const char* input, size_t len);
222
223 static const size_t kMaxLen = 65535;
103 224
104 private: 225 private:
105 int32_t fValue; 226 typedef SkPDFAtom INHERITED;
106
107 typedef SkPDFObject INHERITED;
108 }; 227 };
109 228
110 /** \class SkPDFBool 229 class SkPDFName : public SkPDFAtom {
230 public:
231 SK_DECLARE_INST_COUNT(SkPDFName);
232 /** Create a PDF name object. Maximum length is 127 bytes. */
233 explicit SkPDFName(const char name[])
234 : INHERITED(SkPDFUnion::Name(SkString(name))) {}
235 explicit SkPDFName(const SkString& name)
236 : INHERITED(SkPDFUnion::Name(name)) {}
111 237
112 An boolean value in a PDF. 238 static const size_t kMaxLen = 127;
113 */
114 class SkPDFBool : public SkPDFObject {
115 public:
116 SK_DECLARE_INST_COUNT(SkPDFBool)
117
118 /** Create a PDF boolean.
119 * @param value true or false.
120 */
121 explicit SkPDFBool(bool value);
122 virtual ~SkPDFBool();
123
124 // The SkPDFObject interface.
125 virtual void emitObject(SkWStream* stream,
126 const SkPDFObjNumMap& objNumMap,
127 const SkPDFSubstituteMap& substitutes) override;
128 239
129 private: 240 private:
130 bool fValue; 241 typedef SkPDFAtom INHERITED;
131
132 typedef SkPDFObject INHERITED;
133 };
134
135 /** \class SkPDFScalar
136
137 A real number object in a PDF.
138 */
139 class SkPDFScalar : public SkPDFObject {
140 public:
141 SK_DECLARE_INST_COUNT(SkPDFScalar)
142
143 /** Create a PDF real number.
144 * @param value A real value.
145 */
146 explicit SkPDFScalar(SkScalar value);
147 virtual ~SkPDFScalar();
148
149 static void Append(SkScalar value, SkWStream* stream);
150
151 // The SkPDFObject interface.
152 virtual void emitObject(SkWStream* stream,
153 const SkPDFObjNumMap& objNumMap,
154 const SkPDFSubstituteMap& substitutes) override;
155
156 private:
157 SkScalar fValue;
158
159 typedef SkPDFObject INHERITED;
160 };
161
162 /** \class SkPDFString
163
164 A string object in a PDF.
165 */
166 class SkPDFString : public SkPDFObject {
167 public:
168 SK_DECLARE_INST_COUNT(SkPDFString)
169
170 /** Create a PDF string. Maximum length (in bytes) is 65,535.
171 * @param value A string value.
172 */
173 explicit SkPDFString(const char value[]);
174 explicit SkPDFString(const SkString& value);
175
176 virtual ~SkPDFString();
177
178 // The SkPDFObject interface.
179 virtual void emitObject(SkWStream* stream,
180 const SkPDFObjNumMap& objNumMap,
181 const SkPDFSubstituteMap& substitutes) override;
182
183 static SkString FormatString(const char* input, size_t len);
184 private:
185 static const size_t kMaxLen = 65535;
186
187 const SkString fValue;
188
189 typedef SkPDFObject INHERITED;
190 };
191
192 /** \class SkPDFName
193
194 A name object in a PDF.
195 */
196 class SkPDFName : public SkPDFObject {
197 public:
198 SK_DECLARE_INST_COUNT(SkPDFName)
199
200 /** Create a PDF name object. Maximum length is 127 bytes.
201 * @param value The name.
202 */
203 explicit SkPDFName(const char name[]);
204 explicit SkPDFName(const SkString& name);
205 virtual ~SkPDFName();
206
207 bool operator==(const SkPDFName& b) const;
208
209 // The SkPDFObject interface.
210 virtual void emitObject(SkWStream* stream,
211 const SkPDFObjNumMap& objNumMap,
212 const SkPDFSubstituteMap& substitutes) override;
213
214 private:
215 static const size_t kMaxLen = 127;
216
217 const SkString fValue;
218
219 static SkString FormatName(const SkString& input);
220
221 typedef SkPDFObject INHERITED;
222 }; 242 };
223 243
224 /** \class SkPDFArray 244 /** \class SkPDFArray
225 245
226 An array object in a PDF. 246 An array object in a PDF.
227 */ 247 */
228 class SkPDFArray : public SkPDFObject { 248 class SkPDFArray : public SkPDFObject {
229 public: 249 public:
230 SK_DECLARE_INST_COUNT(SkPDFArray) 250 SK_DECLARE_INST_COUNT(SkPDFArray)
231 251
252 static const int kMaxLen = 8191;
253
232 /** Create a PDF array. Maximum length is 8191. 254 /** Create a PDF array. Maximum length is 8191.
233 */ 255 */
234 SkPDFArray(); 256 SkPDFArray();
235 virtual ~SkPDFArray(); 257 virtual ~SkPDFArray();
236 258
237 // The SkPDFObject interface. 259 // The SkPDFObject interface.
238 virtual void emitObject(SkWStream* stream, 260 virtual void emitObject(SkWStream* stream,
239 const SkPDFObjNumMap& objNumMap, 261 const SkPDFObjNumMap& objNumMap,
240 const SkPDFSubstituteMap& substitutes) override; 262 const SkPDFSubstituteMap& substitutes) override;
241 virtual void addResources(SkPDFObjNumMap*, 263 virtual void addResources(SkPDFObjNumMap*,
242 const SkPDFSubstituteMap&) const override; 264 const SkPDFSubstituteMap&) const override;
243 265
244 /** The size of the array. 266 /** The size of the array.
245 */ 267 */
246 int size() { return fValue.count(); } 268 int size() const;
247 269
248 /** Preallocate space for the given number of entries. 270 /** Preallocate space for the given number of entries.
249 * @param length The number of array slots to preallocate. 271 * @param length The number of array slots to preallocate.
250 */ 272 */
251 void reserve(int length); 273 void reserve(int length);
252 274
253 /** Append the object to the end of the array and increments its ref count. 275 /** Append the object to the end of the array and increments its ref count.
254 * @param value The value to add to the array. 276 * @param value The value to add to the array.
255 * @return The value argument is returned. 277 * @return The value argument is returned.
256 */ 278 */
279 // DEPRECATED
257 SkPDFObject* append(SkPDFObject* value); 280 SkPDFObject* append(SkPDFObject* value);
258 281
259 /** Creates a SkPDFInt object and appends it to the array. 282 /** Appends a value to the end of the array.
260 * @param value The value to add to the array. 283 * @param value The value to add to the array.
261 */ 284 */
262 void appendInt(int32_t value); 285 void appendInt(int32_t);
263 286 void appendBool(bool);
264 /** Creates a SkPDFScalar object and appends it to the array. 287 void appendScalar(SkScalar);
265 * @param value The value to add to the array. 288 void appendName(const char[]);
266 */ 289 void appendName(const SkString&);
267 void appendScalar(SkScalar value); 290 void appendString(const char[]);
268 291 void appendString(const SkString&);
269 /** Creates a SkPDFName object and appends it to the array. 292 /** appendObject and appendObjRef take ownership of the passed object */
270 * @param value The value to add to the array. 293 void appendObject(SkPDFObject*);
271 */ 294 void appendObjRef(SkPDFObject*);
272 void appendName(const char name[]);
273 295
274 private: 296 private:
275 static const int kMaxLen = 8191; 297 SkTDArray<SkPDFUnion> fValues;
276 SkTDArray<SkPDFObject*> fValue; 298 void append(SkPDFUnion&& value);
277
278 typedef SkPDFObject INHERITED; 299 typedef SkPDFObject INHERITED;
279 }; 300 };
280 301
281 /** \class SkPDFDict 302 /** \class SkPDFDict
282 303
283 A dictionary object in a PDF. 304 A dictionary object in a PDF.
284 */ 305 */
285 class SkPDFDict : public SkPDFObject { 306 class SkPDFDict : public SkPDFObject {
286 public: 307 public:
287 SK_DECLARE_INST_COUNT(SkPDFDict) 308 SK_DECLARE_INST_COUNT(SkPDFDict)
(...skipping 18 matching lines...) Expand all
306 327
307 /** The size of the dictionary. 328 /** The size of the dictionary.
308 */ 329 */
309 int size() const; 330 int size() const;
310 331
311 /** Add the value to the dictionary with the given key. Refs value. 332 /** Add the value to the dictionary with the given key. Refs value.
312 * @param key The key for this dictionary entry. 333 * @param key The key for this dictionary entry.
313 * @param value The value for this dictionary entry. 334 * @param value The value for this dictionary entry.
314 * @return The value argument is returned. 335 * @return The value argument is returned.
315 */ 336 */
337 // DEPRECATED
316 SkPDFObject* insert(SkPDFName* key, SkPDFObject* value); 338 SkPDFObject* insert(SkPDFName* key, SkPDFObject* value);
339 // DEPRECATED
340 SkPDFObject* insert(const char key[], SkPDFObject* value);
317 341
318 /** Add the value to the dictionary with the given key. Refs value. The 342 /** Add the value to the dictionary with the given key. Takes
319 * method will create the SkPDFName object. 343 * ownership of the object.
320 * @param key The text of the key for this dictionary entry. 344 * @param key The text of the key for this dictionary entry.
321 * @param value The value for this dictionary entry. 345 * @param value The value for this dictionary entry.
322 * @return The value argument is returned.
323 */ 346 */
324 SkPDFObject* insert(const char key[], SkPDFObject* value); 347 void insertObject(const char key[], SkPDFObject* value);
348 void insertObject(const SkString& key, SkPDFObject* value);
349 void insertObjRef(const char key[], SkPDFObject* value);
350 void insertObjRef(const SkString& key, SkPDFObject* value);
325 351
326 /** Add the int to the dictionary with the given key. 352 /** Add the value to the dictionary with the given key.
327 * @param key The text of the key for this dictionary entry. 353 * @param key The text of the key for this dictionary entry.
328 * @param value The int value for this dictionary entry. 354 * @param value The value for this dictionary entry.
329 */ 355 */
330 void insertInt(const char key[], int32_t value); 356 void insertInt(const char key[], int32_t value);
331 357 void insertInt(const char key[], size_t value);
332 /**
333 * Calls insertInt() but asserts in debug builds that the value can be repr esented
334 * by an int32_t.
335 */
336 void insertInt(const char key[], size_t value) {
337 this->insertInt(key, SkToS32(value));
338 }
339
340 /** Add the scalar to the dictionary with the given key.
341 * @param key The text of the key for this dictionary entry.
342 * @param value The scalar value for this dictionary entry.
343 */
344 void insertScalar(const char key[], SkScalar value); 358 void insertScalar(const char key[], SkScalar value);
345 359 void insertName(const char key[], const char nameValue[]);
346 /** Add the name to the dictionary with the given key. 360 void insertName(const char key[], const SkString& nameValue);
347 * @param key The text of the key for this dictionary entry. 361 void insertString(const char key[], const char value[]);
348 * @param name The name for this dictionary entry. 362 void insertString(const char key[], const SkString& value);
349 */
350 void insertName(const char key[], const char name[]);
351
352 /** Add the name to the dictionary with the given key.
353 * @param key The text of the key for this dictionary entry.
354 * @param name The name for this dictionary entry.
355 */
356 void insertName(const char key[], const SkString& name) {
357 this->insertName(key, name.c_str());
358 }
359 363
360 /** Remove all entries from the dictionary. 364 /** Remove all entries from the dictionary.
361 */ 365 */
362 void clear(); 366 void clear();
363 367
364 protected:
365 /** Use to remove a single key from the dictionary.
366 */
367 void remove(const char key[]);
368
369 /** Insert references to all of the key-value pairs from the other
370 * dictionary into this one.
371 */
372 void mergeFrom(const SkPDFDict& other);
373
374 private: 368 private:
375 struct Rec { 369 struct Record {
376 SkPDFName* key; 370 SkPDFUnion fKey;
377 SkPDFObject* value; 371 SkPDFUnion fValue;
378 Rec(SkPDFName* k, SkPDFObject* v) : key(k), value(v) {}
379 }; 372 };
380 373 SkTDArray<Record> fRecords;
381 static const int kMaxLen = 4095; 374 static const int kMaxLen = 4095;
382 375
383 SkTDArray<struct Rec> fValue; 376 void set(const SkPDFUnion& name, const SkPDFUnion& value);
384 377 void set(SkPDFUnion&& name, SkPDFUnion&& value);
385 SkPDFObject* append(SkPDFName* key, SkPDFObject* value);
386 378
387 typedef SkPDFObject INHERITED; 379 typedef SkPDFObject INHERITED;
388 }; 380 };
389 381
390 //////////////////////////////////////////////////////////////////////////////// 382 ////////////////////////////////////////////////////////////////////////////////
391 383
392 /** \class SkPDFSubstituteMap
393
394 The PDF Substitute Map manages substitute objects and owns the
395 substitutes.
396 */
397 class SkPDFSubstituteMap : SkNoncopyable {
398 public:
399 ~SkPDFSubstituteMap();
400 /** Set substitute object for the passed object.
401 Refs substitute.
402 */
403 void setSubstitute(SkPDFObject* original, SkPDFObject* substitute);
404
405 /** Find and return any substitute object set for the passed object. If
406 * there is none, return the passed object.
407 */
408 SkPDFObject* getSubstitute(SkPDFObject* object) const;
409
410 private:
411 SkTHashMap<SkPDFObject*, SkPDFObject*> fSubstituteMap;
412 };
413
414 /** \class SkPDFObjNumMap 384 /** \class SkPDFObjNumMap
415 385
416 The PDF Object Number Map manages object numbers. It is used to 386 The PDF Object Number Map manages object numbers. It is used to
417 create the PDF cross reference table. 387 create the PDF cross reference table.
418 */ 388 */
419 class SkPDFObjNumMap : SkNoncopyable { 389 class SkPDFObjNumMap : SkNoncopyable {
420 public: 390 public:
421 /** Add the passed object to the catalog. 391 /** Add the passed object to the catalog.
422 * @param obj The object to add. 392 * @param obj The object to add.
423 * @return True iff the object was not already added to the catalog. 393 * @return True iff the object was not already added to the catalog.
424 */ 394 */
425 bool addObject(SkPDFObject* obj); 395 bool addObject(SkPDFObject* obj);
426 396
427 /** Get the object number for the passed object. 397 /** Get the object number for the passed object.
428 * @param obj The object of interest. 398 * @param obj The object of interest.
429 */ 399 */
430 int32_t getObjectNumber(SkPDFObject* obj) const; 400 int32_t getObjectNumber(SkPDFObject* obj) const;
431 401
432 const SkTDArray<SkPDFObject*>& objects() const { return fObjects; } 402 const SkTDArray<SkPDFObject*>& objects() const { return fObjects; }
433 403
434 private: 404 private:
435 SkTDArray<SkPDFObject*> fObjects; 405 SkTDArray<SkPDFObject*> fObjects;
436 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers; 406 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers;
437 }; 407 };
438 408
409 ////////////////////////////////////////////////////////////////////////////////
410
411 /** \class SkPDFSubstituteMap
412
413 The PDF Substitute Map manages substitute objects and owns the
414 substitutes.
415 */
416 class SkPDFSubstituteMap : SkNoncopyable {
417 public:
418 ~SkPDFSubstituteMap();
419 /** Set substitute object for the passed object.
420 Refs substitute.
421 */
422 void setSubstitute(SkPDFObject* original, SkPDFObject* substitute);
423
424 /** Find and return any substitute object set for the passed object. If
425 * there is none, return the passed object.
426 */
427 SkPDFObject* getSubstitute(SkPDFObject* object) const;
428
429 SkPDFObject* operator()(SkPDFObject* o) const {
430 return this->getSubstitute(o);
431 }
432
433 private:
434 SkTHashMap<SkPDFObject*, SkPDFObject*> fSubstituteMap;
435 };
436
439 #endif 437 #endif
OLDNEW
« no previous file with comments | « src/pdf/SkPDFResourceDict.cpp ('k') | src/pdf/SkPDFTypes.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698