diff options
author | halcanary <halcanary@google.com> | 2016-03-21 10:05:23 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 10:05:23 -0700 |
commit | bae235eb07cdfeb6dd92efa2b2143fa9e91d9d04 (patch) | |
tree | 050cd0a1e4bb6bcc8c57872bccd5efbfae7e8b65 /src/pdf/SkPDFBitmap.cpp | |
parent | f8f90e4a85638faa18e7b4133cfe4d1ff5b1b23e (diff) |
SkPDF: add drop() virtual to release resources early.
Call drop() after calling emitObject() on top-level objects. In Debug
mode, assert that each object is emited exactly once by asserting that
emitObject is never called after drop(). Same for addResources().
To make sure that top level objects don't get deleted prematurely,
SkPDFObjNumMap takes a reference.
Motivation: save RAM. Allow even earlier serialization with later
changes.
Also: Switch some SkTDArrays to SkTArrays.
BUG=skia:5087
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1790023003
Review URL: https://codereview.chromium.org/1790023003
Diffstat (limited to 'src/pdf/SkPDFBitmap.cpp')
-rw-r--r-- | src/pdf/SkPDFBitmap.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/pdf/SkPDFBitmap.cpp b/src/pdf/SkPDFBitmap.cpp index fdc33032a9..5e617decf4 100644 --- a/src/pdf/SkPDFBitmap.cpp +++ b/src/pdf/SkPDFBitmap.cpp @@ -382,13 +382,14 @@ namespace { // This SkPDFObject only outputs the alpha layer of the given bitmap. class PDFAlphaBitmap final : public SkPDFObject { public: - PDFAlphaBitmap(const SkImage* image) : fImage(SkRef(image)) {} - ~PDFAlphaBitmap() {} + PDFAlphaBitmap(const SkImage* image) : fImage(SkRef(image)) { SkASSERT(image); } void emitObject(SkWStream* stream, const SkPDFObjNumMap& objNumMap, const SkPDFSubstituteMap& subs) const override { + SkASSERT(fImage); emit_image_xobject(stream, fImage.get(), true, nullptr, objNumMap, subs); } + void drop() override { fImage = nullptr; } private: sk_sp<const SkImage> fImage; @@ -404,22 +405,25 @@ public: void emitObject(SkWStream* stream, const SkPDFObjNumMap& objNumMap, const SkPDFSubstituteMap& subs) const override { + SkASSERT(fImage); emit_image_xobject(stream, fImage.get(), false, fSMask, objNumMap, subs); } void addResources(SkPDFObjNumMap* catalog, const SkPDFSubstituteMap& subs) const override { + SkASSERT(fImage); if (fSMask.get()) { SkPDFObject* obj = subs.getSubstitute(fSMask.get()); SkASSERT(obj); catalog->addObjectRecursively(obj, subs); } } + void drop() override { fImage = nullptr; fSMask = nullptr; } PDFDefaultBitmap(const SkImage* image, SkPDFObject* smask) - : fImage(SkRef(image)), fSMask(smask) {} + : fImage(SkRef(image)), fSMask(smask) { SkASSERT(fImage); } private: sk_sp<const SkImage> fImage; - const sk_sp<SkPDFObject> fSMask; + sk_sp<SkPDFObject> fSMask; }; } // namespace @@ -437,15 +441,17 @@ public: sk_sp<SkData> fData; bool fIsYUV; PDFJpegBitmap(SkISize size, SkData* data, bool isYUV) - : fSize(size), fData(SkRef(data)), fIsYUV(isYUV) {} + : fSize(size), fData(SkRef(data)), fIsYUV(isYUV) { SkASSERT(data); } void emitObject(SkWStream*, const SkPDFObjNumMap&, const SkPDFSubstituteMap&) const override; + void drop() override { fData = nullptr; } }; void PDFJpegBitmap::emitObject(SkWStream* stream, const SkPDFObjNumMap& objNumMap, const SkPDFSubstituteMap& substituteMap) const { + SkASSERT(fData); SkPDFDict pdfDict("XObject"); pdfDict.insertName("Subtype", "Image"); pdfDict.insertInt("Width", fSize.width()); |