| 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 | 
|---|