Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 44 const SkPDFSubstituteMap& substitutes) const = 0; | 44 const SkPDFSubstituteMap& substitutes) const = 0; |
| 45 | 45 |
| 46 /** | 46 /** |
| 47 * Adds all transitive dependencies of this object to the | 47 * Adds all transitive dependencies of this object to the |
| 48 * catalog. Implementations should respect the catalog's object | 48 * catalog. Implementations should respect the catalog's object |
| 49 * substitution map. | 49 * substitution map. |
| 50 */ | 50 */ |
| 51 virtual void addResources(SkPDFObjNumMap* catalog, | 51 virtual void addResources(SkPDFObjNumMap* catalog, |
| 52 const SkPDFSubstituteMap& substitutes) const {} | 52 const SkPDFSubstituteMap& substitutes) const {} |
| 53 | 53 |
| 54 /** | |
| 55 * Release all resources associated with this SkPDFObject. It is | |
| 56 * an error to call emitObject() or addResources() after calling | |
| 57 * dump(). | |
| 58 */ | |
| 59 virtual void dump() {} | |
|
mtklein
2016/03/18 14:03:26
We usually use dump() to mean, print this to stdou
tomhudson
2016/03/18 14:11:54
Yes! I was concerned but didn't have a better idea
hal.canary
2016/03/18 21:18:07
done.
I like drop better.
hal.canary
2016/03/18 21:18:07
Done.
| |
| 60 | |
| 54 private: | 61 private: |
| 55 typedef SkRefCnt INHERITED; | 62 typedef SkRefCnt INHERITED; |
| 56 }; | 63 }; |
| 57 | 64 |
| 58 //////////////////////////////////////////////////////////////////////////////// | 65 //////////////////////////////////////////////////////////////////////////////// |
| 59 | 66 |
| 60 /** | 67 /** |
| 61 A SkPDFUnion is a non-virtualized implementation of the | 68 A SkPDFUnion is a non-virtualized implementation of the |
| 62 non-compound, non-specialized PDF Object types: Name, String, | 69 non-compound, non-specialized PDF Object types: Name, String, |
| 63 Number, Boolean. | 70 Number, Boolean. |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 171 #endif // 0 | 178 #endif // 0 |
| 172 | 179 |
| 173 //////////////////////////////////////////////////////////////////////////////// | 180 //////////////////////////////////////////////////////////////////////////////// |
| 174 | 181 |
| 175 /** \class SkPDFArray | 182 /** \class SkPDFArray |
| 176 | 183 |
| 177 An array object in a PDF. | 184 An array object in a PDF. |
| 178 */ | 185 */ |
| 179 class SkPDFArray final : public SkPDFObject { | 186 class SkPDFArray final : public SkPDFObject { |
| 180 public: | 187 public: |
| 181 static const int kMaxLen = 8191; | |
| 182 | |
| 183 /** Create a PDF array. Maximum length is 8191. | 188 /** Create a PDF array. Maximum length is 8191. |
| 184 */ | 189 */ |
| 185 SkPDFArray(); | 190 SkPDFArray(); |
| 186 virtual ~SkPDFArray(); | 191 virtual ~SkPDFArray(); |
| 187 | 192 |
| 188 // The SkPDFObject interface. | 193 // The SkPDFObject interface. |
| 189 void emitObject(SkWStream* stream, | 194 void emitObject(SkWStream* stream, |
| 190 const SkPDFObjNumMap& objNumMap, | 195 const SkPDFObjNumMap& objNumMap, |
| 191 const SkPDFSubstituteMap& substitutes) const override; | 196 const SkPDFSubstituteMap& substitutes) const override; |
| 192 void addResources(SkPDFObjNumMap*, | 197 void addResources(SkPDFObjNumMap*, |
| 193 const SkPDFSubstituteMap&) const override; | 198 const SkPDFSubstituteMap&) const override; |
| 199 void dump() override; | |
| 194 | 200 |
| 195 /** The size of the array. | 201 /** The size of the array. |
| 196 */ | 202 */ |
| 197 int size() const; | 203 int size() const; |
| 198 | 204 |
| 199 /** Preallocate space for the given number of entries. | 205 /** Preallocate space for the given number of entries. |
| 200 * @param length The number of array slots to preallocate. | 206 * @param length The number of array slots to preallocate. |
| 201 */ | 207 */ |
| 202 void reserve(int length); | 208 void reserve(int length); |
| 203 | 209 |
| 204 /** Appends a value to the end of the array. | 210 /** Appends a value to the end of the array. |
| 205 * @param value The value to add to the array. | 211 * @param value The value to add to the array. |
| 206 */ | 212 */ |
| 207 void appendInt(int32_t); | 213 void appendInt(int32_t); |
| 208 void appendBool(bool); | 214 void appendBool(bool); |
| 209 void appendScalar(SkScalar); | 215 void appendScalar(SkScalar); |
| 210 void appendName(const char[]); | 216 void appendName(const char[]); |
| 211 void appendName(const SkString&); | 217 void appendName(const SkString&); |
| 212 void appendString(const char[]); | 218 void appendString(const char[]); |
| 213 void appendString(const SkString&); | 219 void appendString(const SkString&); |
| 214 void appendObject(sk_sp<SkPDFObject>); | 220 void appendObject(sk_sp<SkPDFObject>); |
| 215 void appendObjRef(sk_sp<SkPDFObject>); | 221 void appendObjRef(sk_sp<SkPDFObject>); |
| 216 | 222 |
| 217 private: | 223 private: |
| 218 SkTDArray<SkPDFUnion> fValues; | 224 SkTArray<SkPDFUnion> fValues; |
| 219 void append(SkPDFUnion&& value); | 225 void append(SkPDFUnion&& value); |
| 220 typedef SkPDFObject INHERITED; | 226 SkDEBUGCODE(bool fDumped;) |
| 221 }; | 227 }; |
| 222 | 228 |
| 223 /** \class SkPDFDict | 229 /** \class SkPDFDict |
| 224 | 230 |
| 225 A dictionary object in a PDF. | 231 A dictionary object in a PDF. |
| 226 */ | 232 */ |
| 227 class SkPDFDict : public SkPDFObject { | 233 class SkPDFDict : public SkPDFObject { |
| 228 public: | 234 public: |
| 229 /** Create a PDF dictionary. Maximum number of entries is 4095. | 235 /** Create a PDF dictionary. |
| 236 * @param type The value of the Type entry, nullptr for no type. | |
| 230 */ | 237 */ |
| 231 SkPDFDict(); | 238 explicit SkPDFDict(const char type[] = nullptr); |
| 232 | |
| 233 /** Create a PDF dictionary with a Type entry. | |
| 234 * @param type The value of the Type entry. | |
| 235 */ | |
| 236 explicit SkPDFDict(const char type[]); | |
| 237 | 239 |
| 238 virtual ~SkPDFDict(); | 240 virtual ~SkPDFDict(); |
| 239 | 241 |
| 240 // The SkPDFObject interface. | 242 // The SkPDFObject interface. |
| 241 void emitObject(SkWStream* stream, | 243 void emitObject(SkWStream* stream, |
| 242 const SkPDFObjNumMap& objNumMap, | 244 const SkPDFObjNumMap& objNumMap, |
| 243 const SkPDFSubstituteMap& substitutes) const override; | 245 const SkPDFSubstituteMap& substitutes) const override; |
| 244 void addResources(SkPDFObjNumMap*, | 246 void addResources(SkPDFObjNumMap*, |
| 245 const SkPDFSubstituteMap&) const override; | 247 const SkPDFSubstituteMap&) const override; |
| 248 void dump() override; | |
| 246 | 249 |
| 247 /** The size of the dictionary. | 250 /** The size of the dictionary. |
| 248 */ | 251 */ |
| 249 int size() const; | 252 int size() const; |
| 250 | 253 |
| 251 /** Add the value to the dictionary with the given key. | 254 /** Add the value to the dictionary with the given key. |
| 252 * @param key The text of the key for this dictionary entry. | 255 * @param key The text of the key for this dictionary entry. |
| 253 * @param value The value for this dictionary entry. | 256 * @param value The value for this dictionary entry. |
| 254 */ | 257 */ |
| 255 void insertObject(const char key[], sk_sp<SkPDFObject>); | 258 void insertObject(const char key[], sk_sp<SkPDFObject>); |
| 256 void insertObject(const SkString& key, sk_sp<SkPDFObject>); | 259 void insertObject(const SkString& key, sk_sp<SkPDFObject>); |
| 257 void insertObjRef(const char key[], sk_sp<SkPDFObject>); | 260 void insertObjRef(const char key[], sk_sp<SkPDFObject>); |
| 258 void insertObjRef(const SkString& key, sk_sp<SkPDFObject>); | 261 void insertObjRef(const SkString& key, sk_sp<SkPDFObject>); |
| 259 | 262 |
| 260 /** Add the value to the dictionary with the given key. | 263 /** Add the value to the dictionary with the given key. |
| 261 * @param key The text of the key for this dictionary entry. | 264 * @param key The text of the key for this dictionary entry. |
| 262 * @param value The value for this dictionary entry. | 265 * @param value The value for this dictionary entry. |
| 263 */ | 266 */ |
| 264 void insertBool(const char key[], bool value); | 267 void insertBool(const char key[], bool value); |
| 265 void insertInt(const char key[], int32_t value); | 268 void insertInt(const char key[], int32_t value); |
| 266 void insertInt(const char key[], size_t value); | 269 void insertInt(const char key[], size_t value); |
| 267 void insertScalar(const char key[], SkScalar value); | 270 void insertScalar(const char key[], SkScalar value); |
| 268 void insertName(const char key[], const char nameValue[]); | 271 void insertName(const char key[], const char nameValue[]); |
| 269 void insertName(const char key[], const SkString& nameValue); | 272 void insertName(const char key[], const SkString& nameValue); |
| 270 void insertString(const char key[], const char value[]); | 273 void insertString(const char key[], const char value[]); |
| 271 void insertString(const char key[], const SkString& value); | 274 void insertString(const char key[], const SkString& value); |
| 272 | 275 |
| 273 /** Remove all entries from the dictionary. | |
| 274 */ | |
| 275 void clear(); | |
| 276 | |
| 277 /** Emit the dictionary, without the "<<" and ">>". | 276 /** Emit the dictionary, without the "<<" and ">>". |
| 278 */ | 277 */ |
| 279 void emitAll(SkWStream* stream, | 278 void emitAll(SkWStream* stream, |
| 280 const SkPDFObjNumMap& objNumMap, | 279 const SkPDFObjNumMap& objNumMap, |
| 281 const SkPDFSubstituteMap& substitutes) const; | 280 const SkPDFSubstituteMap& substitutes) const; |
| 282 | 281 |
| 283 private: | 282 private: |
| 284 struct Record { | 283 struct Record { |
| 285 SkPDFUnion fKey; | 284 SkPDFUnion fKey; |
| 286 SkPDFUnion fValue; | 285 SkPDFUnion fValue; |
| 286 Record(SkPDFUnion&&, SkPDFUnion&&); | |
| 287 Record(Record&&); | |
| 288 Record& operator=(Record&&); | |
| 289 Record(const Record&) = delete; | |
| 290 Record& operator=(const Record&) = delete; | |
| 287 }; | 291 }; |
| 288 SkTDArray<Record> fRecords; | 292 SkTArray<Record> fRecords; |
| 289 static const int kMaxLen = 4095; | 293 SkDEBUGCODE(bool fDumped;) |
| 290 | |
| 291 void set(SkPDFUnion&& name, SkPDFUnion&& value); | |
| 292 | |
| 293 typedef SkPDFObject INHERITED; | |
| 294 }; | 294 }; |
| 295 | 295 |
| 296 /** \class SkPDFSharedStream | 296 /** \class SkPDFSharedStream |
| 297 | 297 |
| 298 This class takes an asset and assumes that it is backed by | 298 This class takes an asset and assumes that it is backed by |
| 299 long-lived shared data (for example, an open file | 299 long-lived shared data (for example, an open file |
| 300 descriptor). That is: no memory savings can be made by holding on | 300 descriptor). That is: no memory savings can be made by holding on |
| 301 to a compressed version instead. | 301 to a compressed version instead. |
| 302 */ | 302 */ |
| 303 class SkPDFSharedStream final : public SkPDFObject { | 303 class SkPDFSharedStream final : public SkPDFObject { |
| 304 public: | 304 public: |
| 305 // Takes ownership of asset. | 305 // Takes ownership of asset. |
| 306 SkPDFSharedStream(SkStreamAsset* data) | 306 SkPDFSharedStream(SkStreamAsset* data); |
| 307 : fAsset(data), fDict(new SkPDFDict) { SkASSERT(data); } | 307 ~SkPDFSharedStream(); |
| 308 SkPDFDict* dict() { return fDict.get(); } | 308 SkPDFDict* dict() { return fDict.get(); } |
| 309 void emitObject(SkWStream*, | 309 void emitObject(SkWStream*, |
| 310 const SkPDFObjNumMap&, | 310 const SkPDFObjNumMap&, |
| 311 const SkPDFSubstituteMap&) const override; | 311 const SkPDFSubstituteMap&) const override; |
| 312 void addResources(SkPDFObjNumMap*, | 312 void addResources(SkPDFObjNumMap*, |
| 313 const SkPDFSubstituteMap&) const override; | 313 const SkPDFSubstituteMap&) const override; |
| 314 void dump() override; | |
| 314 | 315 |
| 315 private: | 316 private: |
| 316 SkAutoTDelete<SkStreamAsset> fAsset; | 317 SkAutoTDelete<SkStreamAsset> fAsset; |
| 317 sk_sp<SkPDFDict> fDict; | 318 sk_sp<SkPDFDict> fDict; |
| 319 SkDEBUGCODE(bool fDumped;) | |
| 318 typedef SkPDFObject INHERITED; | 320 typedef SkPDFObject INHERITED; |
| 319 }; | 321 }; |
| 320 | 322 |
| 321 //////////////////////////////////////////////////////////////////////////////// | 323 //////////////////////////////////////////////////////////////////////////////// |
| 322 | 324 |
| 323 /** \class SkPDFObjNumMap | 325 /** \class SkPDFObjNumMap |
| 324 | 326 |
| 325 The PDF Object Number Map manages object numbers. It is used to | 327 The PDF Object Number Map manages object numbers. It is used to |
| 326 create the PDF cross reference table. | 328 create the PDF cross reference table. |
| 327 */ | 329 */ |
| 328 class SkPDFObjNumMap : SkNoncopyable { | 330 class SkPDFObjNumMap : SkNoncopyable { |
| 329 public: | 331 public: |
| 330 /** Add the passed object to the catalog. | 332 /** Add the passed object to the catalog. |
| 331 * @param obj The object to add. | 333 * @param obj The object to add. |
| 332 * @return True iff the object was not already added to the catalog. | 334 * @return True iff the object was not already added to the catalog. |
| 333 */ | 335 */ |
| 334 bool addObject(SkPDFObject* obj); | 336 bool addObject(SkPDFObject* obj); |
| 335 | 337 |
| 336 /** Add the passed object to the catalog, as well as all its dependencies. | 338 /** Add the passed object to the catalog, as well as all its dependencies. |
| 337 * @param obj The object to add. If nullptr, this is a noop. | 339 * @param obj The object to add. If nullptr, this is a noop. |
| 338 * @param subs Will be passed to obj->addResources(). | 340 * @param subs Will be passed to obj->addResources(). |
| 339 */ | 341 */ |
| 340 void addObjectRecursively(SkPDFObject* obj, const SkPDFSubstituteMap& subs); | 342 void addObjectRecursively(SkPDFObject* obj, const SkPDFSubstituteMap& subs); |
| 341 | 343 |
| 342 /** Get the object number for the passed object. | 344 /** Get the object number for the passed object. |
| 343 * @param obj The object of interest. | 345 * @param obj The object of interest. |
| 344 */ | 346 */ |
| 345 int32_t getObjectNumber(SkPDFObject* obj) const; | 347 int32_t getObjectNumber(SkPDFObject* obj) const; |
| 346 | 348 |
| 347 const SkTDArray<SkPDFObject*>& objects() const { return fObjects; } | 349 const SkTArray<sk_sp<SkPDFObject>>& objects() const { return fObjects; } |
| 348 | 350 |
| 349 private: | 351 private: |
| 350 SkTDArray<SkPDFObject*> fObjects; | 352 SkTArray<sk_sp<SkPDFObject>> fObjects; |
| 351 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers; | 353 SkTHashMap<SkPDFObject*, int32_t> fObjectNumbers; |
| 352 }; | 354 }; |
| 353 | 355 |
| 354 //////////////////////////////////////////////////////////////////////////////// | 356 //////////////////////////////////////////////////////////////////////////////// |
| 355 | 357 |
| 356 /** \class SkPDFSubstituteMap | 358 /** \class SkPDFSubstituteMap |
| 357 | 359 |
| 358 The PDF Substitute Map manages substitute objects and owns the | 360 The PDF Substitute Map manages substitute objects and owns the |
| 359 substitutes. | 361 substitutes. |
| 360 */ | 362 */ |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 380 }; | 382 }; |
| 381 | 383 |
| 382 #ifdef SK_PDF_IMAGE_STATS | 384 #ifdef SK_PDF_IMAGE_STATS |
| 383 extern SkAtomic<int> gDrawImageCalls; | 385 extern SkAtomic<int> gDrawImageCalls; |
| 384 extern SkAtomic<int> gJpegImageObjects; | 386 extern SkAtomic<int> gJpegImageObjects; |
| 385 extern SkAtomic<int> gRegularImageObjects; | 387 extern SkAtomic<int> gRegularImageObjects; |
| 386 extern void SkPDFImageDumpStats(); | 388 extern void SkPDFImageDumpStats(); |
| 387 #endif // SK_PDF_IMAGE_STATS | 389 #endif // SK_PDF_IMAGE_STATS |
| 388 | 390 |
| 389 #endif | 391 #endif |
| OLD | NEW |