| 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 21 matching lines...) Expand all Loading... |
| 32 which are common in the PDF format. | 32 which are common in the PDF format. |
| 33 | 33 |
| 34 */ | 34 */ |
| 35 class SkPDFObject : public SkRefCnt { | 35 class SkPDFObject : public SkRefCnt { |
| 36 public: | 36 public: |
| 37 /** Subclasses must implement this method to print the object to the | 37 /** Subclasses must implement this method to print the object to the |
| 38 * PDF file. | 38 * PDF file. |
| 39 * @param catalog The object catalog to use. | 39 * @param catalog The object catalog to use. |
| 40 * @param stream The writable output stream to send the output to. | 40 * @param stream The writable output stream to send the output to. |
| 41 */ | 41 */ |
| 42 // TODO(halcanary): make this method const |
| 42 virtual void emitObject(SkWStream* stream, | 43 virtual void emitObject(SkWStream* stream, |
| 43 const SkPDFObjNumMap& objNumMap, | 44 const SkPDFObjNumMap& objNumMap, |
| 44 const SkPDFSubstituteMap& substitutes) const = 0; | 45 const SkPDFSubstituteMap& substitutes) const = 0; |
| 45 | 46 |
| 46 /** | 47 /** |
| 47 * Adds all transitive dependencies of this object to the | 48 * Adds all transitive dependencies of this object to the |
| 48 * catalog. Implementations should respect the catalog's object | 49 * catalog. Implementations should respect the catalog's object |
| 49 * substitution map. | 50 * substitution map. |
| 50 */ | 51 */ |
| 51 virtual void addResources(SkPDFObjNumMap* catalog, | 52 virtual void addResources(SkPDFObjNumMap* catalog, |
| 52 const SkPDFSubstituteMap& substitutes) const {} | 53 const SkPDFSubstituteMap& substitutes) const {} |
| 53 | 54 |
| 54 private: | 55 private: |
| 55 typedef SkRefCnt INHERITED; | 56 typedef SkRefCnt INHERITED; |
| 56 }; | 57 }; |
| 57 | 58 |
| 58 //////////////////////////////////////////////////////////////////////////////// | 59 //////////////////////////////////////////////////////////////////////////////// |
| 59 | 60 |
| 60 /** | 61 /** |
| 61 A SkPDFUnion is a non-virtualized implementation of the | 62 A SkPDFUnion is a non-virtualized implementation of the |
| 62 non-compound, non-specialized PDF Object types: Name, String, | 63 non-compound, non-specialized PDF Object types: Name, String, |
| 63 Number, Boolean. | 64 Number, Boolean. |
| 64 */ | 65 */ |
| 65 class SkPDFUnion { | 66 class SkPDFUnion { |
| 66 public: | 67 public: |
| 68 // u.move() is analogous to std::move(u). It returns an rvalue. |
| 69 SkPDFUnion move() { return static_cast<SkPDFUnion&&>(*this); } |
| 67 // Move contstructor and assignemnt operator destroy the argument | 70 // Move contstructor and assignemnt operator destroy the argument |
| 68 // and steal their references (if needed). | 71 // and steal their references (if needed). |
| 69 SkPDFUnion(SkPDFUnion&& other); | 72 SkPDFUnion(SkPDFUnion&& other); |
| 70 SkPDFUnion& operator=(SkPDFUnion&& other); | 73 SkPDFUnion& operator=(SkPDFUnion&& other); |
| 71 | 74 |
| 72 ~SkPDFUnion(); | 75 ~SkPDFUnion(); |
| 73 | 76 |
| 74 /** The following nine functions are the standard way of creating | 77 /** The following nine functions are the standard way of creating |
| 75 SkPDFUnion objects. */ | 78 SkPDFUnion objects. */ |
| 76 | 79 |
| 77 static SkPDFUnion Int(int32_t); | 80 static SkPDFUnion Int(int32_t); |
| 78 | 81 |
| 79 static SkPDFUnion Int(size_t v) { return SkPDFUnion::Int(SkToS32(v)); } | 82 static SkPDFUnion Int(size_t v) { return SkPDFUnion::Int(SkToS32(v)); } |
| 80 | 83 |
| 81 static SkPDFUnion Bool(bool); | 84 static SkPDFUnion Bool(bool); |
| 82 | 85 |
| 83 static SkPDFUnion Scalar(SkScalar); | 86 static SkPDFUnion Scalar(SkScalar); |
| 84 | 87 |
| 85 /** These two functions do NOT take ownership of char*, and do NOT | 88 /** These two functions do NOT take ownership of ptr, and do NOT |
| 86 copy the string. Suitable for passing in static const | 89 copy the string. Suitable for passing in static const |
| 87 strings. For example: | 90 strings. For example: |
| 88 SkPDFUnion n = SkPDFUnion::Name("Length"); | 91 SkPDFUnion n = SkPDFUnion::Name("Length"); |
| 89 SkPDFUnion u = SkPDFUnion::String("Identity"); */ | 92 SkPDFUnion u = SkPDFUnion::String("Identity"); */ |
| 90 | 93 |
| 91 /** SkPDFUnion::Name(const char*) assumes that the passed string | 94 /** SkPDFUnion::Name(const char*) assumes that the passed string |
| 92 is already a valid name (that is: it has no control or | 95 is already a valid name (that is: it has no control or |
| 93 whitespace characters). This will not copy the name. */ | 96 whitespace characters). This will not copy the name. */ |
| 94 static SkPDFUnion Name(const char*); | 97 static SkPDFUnion Name(const char*); |
| 95 | 98 |
| 96 /** SkPDFUnion::String will encode the passed string. This will | 99 /** SkPDFUnion::String will encode the passed string. This will |
| 97 not copy the name. */ | 100 not copy the name. */ |
| 98 static SkPDFUnion String(const char*); | 101 static SkPDFUnion String(const char*); |
| 99 | 102 |
| 100 /** SkPDFUnion::Name(const SkString&) does not assume that the | 103 /** SkPDFUnion::Name(const SkString&) does not assume that the |
| 101 passed string is already a valid name and it will escape the | 104 passed string is already a valid name and it will escape the |
| 102 string. */ | 105 string. */ |
| 103 static SkPDFUnion Name(const SkString&); | 106 static SkPDFUnion Name(const SkString&); |
| 104 | 107 |
| 105 /** SkPDFUnion::String will encode the passed string. */ | 108 /** SkPDFUnion::String will encode the passed string. */ |
| 106 static SkPDFUnion String(const SkString&); | 109 static SkPDFUnion String(const SkString&); |
| 107 | 110 |
| 108 static SkPDFUnion Object(sk_sp<SkPDFObject>); | 111 /** This function DOES take ownership of the object. E.g. |
| 109 static SkPDFUnion ObjRef(sk_sp<SkPDFObject>); | 112 auto dict = sk_make_sp<SkPDFDict>(); |
| 113 dict->insert(.....); |
| 114 SkPDFUnion u = SkPDFUnion::Object(dict.detach()) */ |
| 115 static SkPDFUnion Object(SkPDFObject*); |
| 116 |
| 117 /** This function DOES take ownership of the object. E.g. |
| 118 sk_sp<SkPDFBitmap> image( |
| 119 SkPDFBitmap::Create(fCanon, bitmap)); |
| 120 SkPDFUnion u = SkPDFUnion::ObjRef(image.detach()) */ |
| 121 static SkPDFUnion ObjRef(SkPDFObject*); |
| 110 | 122 |
| 111 /** These two non-virtual methods mirror SkPDFObject's | 123 /** These two non-virtual methods mirror SkPDFObject's |
| 112 corresponding virtuals. */ | 124 corresponding virtuals. */ |
| 113 void emitObject(SkWStream*, | 125 void emitObject(SkWStream*, |
| 114 const SkPDFObjNumMap&, | 126 const SkPDFObjNumMap&, |
| 115 const SkPDFSubstituteMap&) const; | 127 const SkPDFSubstituteMap&) const; |
| 116 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const; | 128 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const; |
| 117 | 129 |
| 118 bool isName() const; | 130 bool isName() const; |
| 119 | 131 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 #if 0 // Enable if needed. | 167 #if 0 // Enable if needed. |
| 156 /** This class is a SkPDFUnion with SkPDFObject virtuals attached. | 168 /** This class is a SkPDFUnion with SkPDFObject virtuals attached. |
| 157 The only use case of this is when a non-compound PDF object is | 169 The only use case of this is when a non-compound PDF object is |
| 158 referenced indirectly. */ | 170 referenced indirectly. */ |
| 159 class SkPDFAtom final : public SkPDFObject { | 171 class SkPDFAtom final : public SkPDFObject { |
| 160 public: | 172 public: |
| 161 void emitObject(SkWStream* stream, | 173 void emitObject(SkWStream* stream, |
| 162 const SkPDFObjNumMap& objNumMap, | 174 const SkPDFObjNumMap& objNumMap, |
| 163 const SkPDFSubstituteMap& substitutes) final; | 175 const SkPDFSubstituteMap& substitutes) final; |
| 164 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const final; | 176 void addResources(SkPDFObjNumMap*, const SkPDFSubstituteMap&) const final; |
| 165 SkPDFAtom(SkPDFUnion&& v) : fValue(std::move(v) {} | 177 SkPDFAtom(SkPDFUnion&& v) : fValue(v.move()) {} |
| 166 | 178 |
| 167 private: | 179 private: |
| 168 const SkPDFUnion fValue; | 180 const SkPDFUnion fValue; |
| 169 typedef SkPDFObject INHERITED; | 181 typedef SkPDFObject INHERITED; |
| 170 }; | 182 }; |
| 171 #endif // 0 | 183 #endif // 0 |
| 172 | 184 |
| 173 //////////////////////////////////////////////////////////////////////////////// | 185 //////////////////////////////////////////////////////////////////////////////// |
| 174 | 186 |
| 175 /** \class SkPDFArray | 187 /** \class SkPDFArray |
| (...skipping 28 matching lines...) Expand all Loading... |
| 204 /** Appends a value to the end of the array. | 216 /** Appends a value to the end of the array. |
| 205 * @param value The value to add to the array. | 217 * @param value The value to add to the array. |
| 206 */ | 218 */ |
| 207 void appendInt(int32_t); | 219 void appendInt(int32_t); |
| 208 void appendBool(bool); | 220 void appendBool(bool); |
| 209 void appendScalar(SkScalar); | 221 void appendScalar(SkScalar); |
| 210 void appendName(const char[]); | 222 void appendName(const char[]); |
| 211 void appendName(const SkString&); | 223 void appendName(const SkString&); |
| 212 void appendString(const char[]); | 224 void appendString(const char[]); |
| 213 void appendString(const SkString&); | 225 void appendString(const SkString&); |
| 214 void appendObject(sk_sp<SkPDFObject>); | 226 /** appendObject and appendObjRef take ownership of the passed object */ |
| 215 void appendObjRef(sk_sp<SkPDFObject>); | 227 void appendObject(SkPDFObject*); |
| 228 void appendObjRef(SkPDFObject*); |
| 216 | 229 |
| 217 private: | 230 private: |
| 218 SkTDArray<SkPDFUnion> fValues; | 231 SkTDArray<SkPDFUnion> fValues; |
| 219 void append(SkPDFUnion&& value); | 232 void append(SkPDFUnion&& value); |
| 220 typedef SkPDFObject INHERITED; | 233 typedef SkPDFObject INHERITED; |
| 221 }; | 234 }; |
| 222 | 235 |
| 223 /** \class SkPDFDict | 236 /** \class SkPDFDict |
| 224 | 237 |
| 225 A dictionary object in a PDF. | 238 A dictionary object in a PDF. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 241 void emitObject(SkWStream* stream, | 254 void emitObject(SkWStream* stream, |
| 242 const SkPDFObjNumMap& objNumMap, | 255 const SkPDFObjNumMap& objNumMap, |
| 243 const SkPDFSubstituteMap& substitutes) const override; | 256 const SkPDFSubstituteMap& substitutes) const override; |
| 244 void addResources(SkPDFObjNumMap*, | 257 void addResources(SkPDFObjNumMap*, |
| 245 const SkPDFSubstituteMap&) const override; | 258 const SkPDFSubstituteMap&) const override; |
| 246 | 259 |
| 247 /** The size of the dictionary. | 260 /** The size of the dictionary. |
| 248 */ | 261 */ |
| 249 int size() const; | 262 int size() const; |
| 250 | 263 |
| 251 /** Add the value to the dictionary with the given key. | 264 /** Add the value to the dictionary with the given key. Takes |
| 265 * ownership of the object. |
| 252 * @param key The text of the key for this dictionary entry. | 266 * @param key The text of the key for this dictionary entry. |
| 253 * @param value The value for this dictionary entry. | 267 * @param value The value for this dictionary entry. |
| 254 */ | 268 */ |
| 255 void insertObject(const char key[], sk_sp<SkPDFObject>); | 269 void insertObject(const char key[], SkPDFObject* value); |
| 256 void insertObject(const SkString& key, sk_sp<SkPDFObject>); | 270 void insertObject(const SkString& key, SkPDFObject* value); |
| 257 void insertObjRef(const char key[], sk_sp<SkPDFObject>); | 271 void insertObjRef(const char key[], SkPDFObject* value); |
| 258 void insertObjRef(const SkString& key, sk_sp<SkPDFObject>); | 272 void insertObjRef(const SkString& key, SkPDFObject* value); |
| 259 | 273 |
| 260 /** Add the value to the dictionary with the given key. | 274 /** Add the value to the dictionary with the given key. |
| 261 * @param key The text of the key for this dictionary entry. | 275 * @param key The text of the key for this dictionary entry. |
| 262 * @param value The value for this dictionary entry. | 276 * @param value The value for this dictionary entry. |
| 263 */ | 277 */ |
| 264 void insertBool(const char key[], bool value); | 278 void insertBool(const char key[], bool value); |
| 265 void insertInt(const char key[], int32_t value); | 279 void insertInt(const char key[], int32_t value); |
| 266 void insertInt(const char key[], size_t value); | 280 void insertInt(const char key[], size_t value); |
| 267 void insertScalar(const char key[], SkScalar value); | 281 void insertScalar(const char key[], SkScalar value); |
| 268 void insertName(const char key[], const char nameValue[]); | 282 void insertName(const char key[], const char nameValue[]); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 296 /** \class SkPDFSharedStream | 310 /** \class SkPDFSharedStream |
| 297 | 311 |
| 298 This class takes an asset and assumes that it is backed by | 312 This class takes an asset and assumes that it is backed by |
| 299 long-lived shared data (for example, an open file | 313 long-lived shared data (for example, an open file |
| 300 descriptor). That is: no memory savings can be made by holding on | 314 descriptor). That is: no memory savings can be made by holding on |
| 301 to a compressed version instead. | 315 to a compressed version instead. |
| 302 */ | 316 */ |
| 303 class SkPDFSharedStream final : public SkPDFObject { | 317 class SkPDFSharedStream final : public SkPDFObject { |
| 304 public: | 318 public: |
| 305 // Takes ownership of asset. | 319 // Takes ownership of asset. |
| 306 SkPDFSharedStream(SkStreamAsset* data) | 320 SkPDFSharedStream(SkStreamAsset* data) : fAsset(data), fDict(new SkPDFDict)
{ SkASSERT(data); } |
| 307 : fAsset(data), fDict(new SkPDFDict) { SkASSERT(data); } | |
| 308 SkPDFDict* dict() { return fDict.get(); } | 321 SkPDFDict* dict() { return fDict.get(); } |
| 309 void emitObject(SkWStream*, | 322 void emitObject(SkWStream*, |
| 310 const SkPDFObjNumMap&, | 323 const SkPDFObjNumMap&, |
| 311 const SkPDFSubstituteMap&) const override; | 324 const SkPDFSubstituteMap&) const override; |
| 312 void addResources(SkPDFObjNumMap*, | 325 void addResources(SkPDFObjNumMap*, |
| 313 const SkPDFSubstituteMap&) const override; | 326 const SkPDFSubstituteMap&) const override; |
| 314 | 327 |
| 315 private: | 328 private: |
| 316 SkAutoTDelete<SkStreamAsset> fAsset; | 329 SkAutoTDelete<SkStreamAsset> fAsset; |
| 317 sk_sp<SkPDFDict> fDict; | 330 sk_sp<SkPDFDict> fDict; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 }; | 393 }; |
| 381 | 394 |
| 382 #ifdef SK_PDF_IMAGE_STATS | 395 #ifdef SK_PDF_IMAGE_STATS |
| 383 extern SkAtomic<int> gDrawImageCalls; | 396 extern SkAtomic<int> gDrawImageCalls; |
| 384 extern SkAtomic<int> gJpegImageObjects; | 397 extern SkAtomic<int> gJpegImageObjects; |
| 385 extern SkAtomic<int> gRegularImageObjects; | 398 extern SkAtomic<int> gRegularImageObjects; |
| 386 extern void SkPDFImageDumpStats(); | 399 extern void SkPDFImageDumpStats(); |
| 387 #endif // SK_PDF_IMAGE_STATS | 400 #endif // SK_PDF_IMAGE_STATS |
| 388 | 401 |
| 389 #endif | 402 #endif |
| OLD | NEW |