From 29ed2ae2daa843c8ef955df34b26e672c67b14f3 Mon Sep 17 00:00:00 2001 From: halcanary Date: Wed, 29 Jun 2016 06:31:32 -0700 Subject: [PATCH] SkPDF: SkPDFStream takes only SkStreamAsset This is possible since https://crrev.com/869763002. Later, I'll clean up the logic and class constructors. For now, I assert everywhere I expect a SkStreamAsset to be well-behaved (duplcate, hasLength). GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2098393002 Review-Url: https://codereview.chromium.org/2098393002 --- src/pdf/SkPDFFont.cpp | 2 +- src/pdf/SkPDFFormXObject.cpp | 2 +- src/pdf/SkPDFFormXObject.h | 2 +- src/pdf/SkPDFShader.cpp | 6 +++--- src/pdf/SkPDFStream.cpp | 13 +++++++++---- src/pdf/SkPDFStream.h | 6 +++--- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp index b213594d4a..bdde6d62af 100644 --- a/src/pdf/SkPDFFont.cpp +++ b/src/pdf/SkPDFFont.cpp @@ -591,7 +591,7 @@ static size_t get_subset_font_stream(const char* fontName, const SkTDArray& subset, SkPDFStream** fontStream) { int ttcIndex; - std::unique_ptr fontData(typeface->openStream(&ttcIndex)); + std::unique_ptr fontData(typeface->openStream(&ttcIndex)); SkASSERT(fontData); if (!fontData) { return 0; diff --git a/src/pdf/SkPDFFormXObject.cpp b/src/pdf/SkPDFFormXObject.cpp index 99617e9c01..25c37807e0 100644 --- a/src/pdf/SkPDFFormXObject.cpp +++ b/src/pdf/SkPDFFormXObject.cpp @@ -43,7 +43,7 @@ SkPDFFormXObject::SkPDFFormXObject(SkPDFDevice* device) { /** * Creates a FormXObject from a content stream and associated resources. */ -SkPDFFormXObject::SkPDFFormXObject(SkStream* content, SkRect bbox, +SkPDFFormXObject::SkPDFFormXObject(SkStreamAsset* content, SkRect bbox, SkPDFDict* resourceDict) { setData(content); diff --git a/src/pdf/SkPDFFormXObject.h b/src/pdf/SkPDFFormXObject.h index f6d708ebe9..f739a36d20 100644 --- a/src/pdf/SkPDFFormXObject.h +++ b/src/pdf/SkPDFFormXObject.h @@ -37,7 +37,7 @@ public: * Create a PDF form XObject from a raw content stream and associated * resources. */ - explicit SkPDFFormXObject(SkStream* content, + explicit SkPDFFormXObject(SkStreamAsset* content, SkRect bbox, SkPDFDict* resourceDict); virtual ~SkPDFFormXObject(); diff --git a/src/pdf/SkPDFShader.cpp b/src/pdf/SkPDFShader.cpp index 9a2e4a9103..942fe65d26 100644 --- a/src/pdf/SkPDFShader.cpp +++ b/src/pdf/SkPDFShader.cpp @@ -672,7 +672,7 @@ static void populate_tiling_pattern_dict(SkPDFDict* pattern, * @param gsIndex A graphics state resource index to apply, or <0 if no * graphics state to apply. */ -static SkStream* create_pattern_fill_content(int gsIndex, SkRect& bounds) { +static SkStreamAsset* create_pattern_fill_content(int gsIndex, SkRect& bounds) { SkDynamicMemoryWStream content; if (gsIndex >= 0) { SkPDFUtils::ApplyGraphicState(gsIndex, &content); @@ -699,7 +699,7 @@ static sk_sp create_smask_graphic_state( sk_sp luminosityShader( get_pdf_shader_by_state(doc, dpi, &alphaToLuminosityState)); - std::unique_ptr alphaStream(create_pattern_fill_content(-1, bbox)); + std::unique_ptr alphaStream(create_pattern_fill_content(-1, bbox)); auto resources = get_gradient_resource_dict(luminosityShader.get(), nullptr); @@ -738,7 +738,7 @@ SkPDFAlphaFunctionShader* SkPDFAlphaFunctionShader::Create( auto resourceDict = get_gradient_resource_dict(colorShader.get(), alphaGs.get()); - std::unique_ptr colorStream( + std::unique_ptr colorStream( create_pattern_fill_content(0, bbox)); alphaFunctionShader->setData(colorStream.get()); diff --git a/src/pdf/SkPDFStream.cpp b/src/pdf/SkPDFStream.cpp index d15f48a2ee..50735efa6c 100644 --- a/src/pdf/SkPDFStream.cpp +++ b/src/pdf/SkPDFStream.cpp @@ -24,7 +24,7 @@ void SkPDFStream::emitObject(SkWStream* stream, SkASSERT(fCompressedData); this->INHERITED::emitObject(stream, objNumMap, substitutes); // duplicate (a cheap operation) preserves const on fCompressedData. - std::unique_ptr dup(fCompressedData->duplicate()); + std::unique_ptr dup(fCompressedData->duplicate()); SkASSERT(dup); SkASSERT(dup->hasLength()); stream->writeText(" stream\n"); @@ -33,13 +33,14 @@ void SkPDFStream::emitObject(SkWStream* stream, } -void SkPDFStream::setData(SkStream* stream) { +void SkPDFStream::setData(SkStreamAsset* stream) { SkASSERT(!fCompressedData); // Only call this function once. SkASSERT(stream); // Code assumes that the stream starts at the beginning. #ifdef SK_PDF_LESS_COMPRESSION - std::unique_ptr duplicate(stream->duplicate()); + std::unique_ptr duplicate(stream->duplicate()); + SkASSERT(duplicate && duplicate->hasLength()); if (duplicate && duplicate->hasLength()) { this->insertInt("Length", duplicate->getLength()); fCompressedData.reset(duplicate.release()); @@ -53,8 +54,12 @@ void SkPDFStream::setData(SkStream* stream) { deflateWStream.finalize(); size_t length = compressedData.bytesWritten(); + SkASSERT(stream->hasLength()); if (stream->hasLength()) { - std::unique_ptr dup(stream->duplicate()); + std::unique_ptr dup(stream->duplicate()); + SkASSERT(stream->hasLength()); + SkASSERT(stream->getLength() == dup->getLength()); + SkASSERT(dup && dup->hasLength()); if (dup && dup->hasLength() && dup->getLength() <= length + strlen("/Filter_/FlateDecode_")) { this->insertInt("Length", dup->getLength()); diff --git a/src/pdf/SkPDFStream.h b/src/pdf/SkPDFStream.h index 11a0c9769e..f487dd296e 100644 --- a/src/pdf/SkPDFStream.h +++ b/src/pdf/SkPDFStream.h @@ -30,7 +30,7 @@ public: * stream dictionary. * @param stream The data part of the stream. Will not take ownership. */ - explicit SkPDFStream(SkStream* stream) { this->setData(stream); } + explicit SkPDFStream(SkStreamAsset* stream) { this->setData(stream); } virtual ~SkPDFStream(); @@ -47,14 +47,14 @@ protected: SkPDFStream() {} /** Only call this function once. */ - void setData(SkStream* stream); + void setData(SkStreamAsset* stream); void setData(SkData* data) { SkMemoryStream memoryStream(data); this->setData(&memoryStream); } private: - std::unique_ptr fCompressedData; + std::unique_ptr fCompressedData; typedef SkPDFDict INHERITED; }; -- 2.34.1