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

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

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

Powered by Google App Engine
This is Rietveld 408576698