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 SkPDFTypes_DEFINED | 10 #ifndef SkPDFTypes_DEFINED |
(...skipping 11 matching lines...) Expand all Loading... |
22 /** \class SkPDFObject | 22 /** \class SkPDFObject |
23 | 23 |
24 A PDF Object is the base class for primitive elements in a PDF file. A | 24 A PDF Object is the base class for primitive elements in a PDF file. A |
25 common subtype is used to ease the use of indirect object references, | 25 common subtype is used to ease the use of indirect object references, |
26 which are common in the PDF format. | 26 which are common in the PDF format. |
27 */ | 27 */ |
28 class SkPDFObject : public SkRefCnt { | 28 class SkPDFObject : public SkRefCnt { |
29 public: | 29 public: |
30 SK_DECLARE_INST_COUNT(SkPDFObject) | 30 SK_DECLARE_INST_COUNT(SkPDFObject) |
31 | 31 |
| 32 virtual ~SkPDFObject() { }; |
| 33 |
32 /** Return the size (number of bytes) of this object in the final output | 34 /** Return the size (number of bytes) of this object in the final output |
33 * file. Compound objects or objects that are computationally intensive | 35 * file. Compound objects or objects that are computationally intensive |
34 * to output should override this method. | 36 * to output should override this method. |
35 * @param catalog The object catalog to use. | 37 * @param catalog The object catalog to use. |
36 * @param indirect If true, output an object identifier with the object. | 38 * @param indirect If true, output an object identifier with the object. |
37 */ | 39 */ |
38 virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); | 40 virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); |
39 | 41 |
40 /** For non-primitive objects (i.e. objects defined outside this file), | 42 /** For non-primitive objects (i.e. objects defined outside this file), |
41 * this method will add to resourceList any objects that this method | 43 * this method will add to resourceList any objects that this method |
(...skipping 30 matching lines...) Expand all Loading... |
72 SkTDArray<SkPDFObject*>* list); | 74 SkTDArray<SkPDFObject*>* list); |
73 | 75 |
74 /** Static helper function to copy and reference the resources (and all | 76 /** Static helper function to copy and reference the resources (and all |
75 * their subresources) into a new list. | 77 * their subresources) into a new list. |
76 * @param resources The resource list. | 78 * @param resources The resource list. |
77 * @param result The list to add to. | 79 * @param result The list to add to. |
78 */ | 80 */ |
79 static void GetResourcesHelper(SkTDArray<SkPDFObject*>* resources, | 81 static void GetResourcesHelper(SkTDArray<SkPDFObject*>* resources, |
80 SkTDArray<SkPDFObject*>* result); | 82 SkTDArray<SkPDFObject*>* result); |
81 | 83 |
| 84 /** Destroys safely an array of SkPDFObjects. |
| 85 * The stack won't be used much, and stack overflow will be avoided. |
| 86 */ |
| 87 static void safeUnref(SkTDArray<SkPDFObject*>* list) { |
| 88 while (list->count() > 0) { |
| 89 SkPDFObject* obj = NULL; |
| 90 list->pop(&obj); |
| 91 if (obj) { |
| 92 // Releases all refs to be owned by list, unref will call destru
ctor! |
| 93 if (obj->getRefCnt() == 1) { |
| 94 obj->transferPDFObjectsOwnership(list); |
| 95 } |
| 96 // If unref calls destructor, it won't call recursively |
| 97 // other ~SkPDFObjects(). |
| 98 obj->unref(); |
| 99 } |
| 100 } |
| 101 } |
| 102 |
82 protected: | 103 protected: |
83 /** Subclasses must implement this method to print the object to the | 104 /** Subclasses must implement this method to print the object to the |
84 * PDF file. | 105 * PDF file. |
85 * @param catalog The object catalog to use. | 106 * @param catalog The object catalog to use. |
86 * @param indirect If true, output an object identifier with the object. | 107 * @param indirect If true, output an object identifier with the object. |
87 * @param stream The writable output stream to send the output to. | 108 * @param stream The writable output stream to send the output to. |
88 */ | 109 */ |
89 virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, | 110 virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, |
90 bool indirect) = 0; | 111 bool indirect) = 0; |
91 | 112 |
| 113 /** Dumps all the SkPDFObject members in the list. When the destructor is |
| 114 * called, the stack won't be used much. |
| 115 * This method will destroy the state of the object. Should be called only |
| 116 * during destructor calls. |
| 117 */ |
| 118 virtual void transferPDFObjectsOwnership(SkTDArray<SkPDFObject*>* list) {} |
| 119 |
92 typedef SkRefCnt INHERITED; | 120 typedef SkRefCnt INHERITED; |
93 }; | 121 }; |
94 | 122 |
95 /** \class SkPDFObjRef | 123 /** \class SkPDFObjRef |
96 | 124 |
97 An indirect reference to a PDF object. | 125 An indirect reference to a PDF object. |
98 */ | 126 */ |
99 class SkPDFObjRef : public SkPDFObject { | 127 class SkPDFObjRef : public SkPDFObject { |
100 public: | 128 public: |
101 SK_DECLARE_INST_COUNT(SkPDFObjRef) | 129 SK_DECLARE_INST_COUNT(SkPDFObjRef) |
102 | 130 |
103 /** Create a reference to an existing SkPDFObject. | 131 /** Create a reference to an existing SkPDFObject. |
104 * @param obj The object to reference. | 132 * @param obj The object to reference. |
105 */ | 133 */ |
106 explicit SkPDFObjRef(SkPDFObject* obj); | 134 explicit SkPDFObjRef(SkPDFObject* obj); |
107 virtual ~SkPDFObjRef(); | 135 virtual ~SkPDFObjRef(); |
108 | 136 |
109 // The SkPDFObject interface. | 137 // The SkPDFObject interface. |
110 virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, | 138 virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, |
111 bool indirect); | 139 bool indirect); |
112 virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); | 140 virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); |
113 | 141 |
| 142 protected: |
| 143 virtual void transferPDFObjectsOwnership(SkTDArray<SkPDFObject*>* list) { |
| 144 list->push(fObj.detach()); |
| 145 |
| 146 INHERITED::transferPDFObjectsOwnership(list); |
| 147 } |
| 148 |
114 private: | 149 private: |
115 SkAutoTUnref<SkPDFObject> fObj; | 150 SkAutoTUnref<SkPDFObject> fObj; |
116 | 151 |
117 typedef SkPDFObject INHERITED; | 152 typedef SkPDFObject INHERITED; |
118 }; | 153 }; |
119 | 154 |
120 /** \class SkPDFInt | 155 /** \class SkPDFInt |
121 | 156 |
122 An integer object in a PDF. | 157 An integer object in a PDF. |
123 */ | 158 */ |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 * @param name The name for this dictionary entry. | 434 * @param name The name for this dictionary entry. |
400 */ | 435 */ |
401 void insertName(const char key[], const SkString& name) { | 436 void insertName(const char key[], const SkString& name) { |
402 this->insertName(key, name.c_str()); | 437 this->insertName(key, name.c_str()); |
403 } | 438 } |
404 | 439 |
405 /** Remove all entries from the dictionary. | 440 /** Remove all entries from the dictionary. |
406 */ | 441 */ |
407 void clear(); | 442 void clear(); |
408 | 443 |
| 444 virtual void transferPDFObjectsOwnership(SkTDArray<SkPDFObject*>* list) { |
| 445 for (int i = 0; i < fValue.count(); i++) { |
| 446 list->push(fValue[i].key); |
| 447 fValue[i].key = NULL; |
| 448 list->push(fValue[i].value); |
| 449 fValue[i].value = NULL; |
| 450 } |
| 451 fValue.reset(); |
| 452 |
| 453 INHERITED::transferPDFObjectsOwnership(list); |
| 454 } |
| 455 |
409 private: | 456 private: |
410 struct Rec { | 457 struct Rec { |
411 SkPDFName* key; | 458 SkPDFName* key; |
412 SkPDFObject* value; | 459 SkPDFObject* value; |
413 }; | 460 }; |
414 | 461 |
415 public: | 462 public: |
416 class Iter { | 463 class Iter { |
417 public: | 464 public: |
418 explicit Iter(const SkPDFDict& dict); | 465 explicit Iter(const SkPDFDict& dict); |
419 SkPDFName* next(SkPDFObject** value); | 466 SkPDFName* next(SkPDFObject** value); |
420 | 467 |
421 private: | 468 private: |
422 const Rec* fIter; | 469 const Rec* fIter; |
423 const Rec* fStop; | 470 const Rec* fStop; |
424 }; | 471 }; |
425 | 472 |
426 private: | 473 private: |
427 static const int kMaxLen = 4095; | 474 static const int kMaxLen = 4095; |
428 | 475 |
429 SkTDArray<struct Rec> fValue; | 476 SkTDArray<struct Rec> fValue; |
430 | 477 |
431 typedef SkPDFObject INHERITED; | 478 typedef SkPDFObject INHERITED; |
432 }; | 479 }; |
433 | 480 |
434 #endif | 481 #endif |
OLD | NEW |