diff options
-rw-r--r-- | gyp/pdf.gyp | 8 | ||||
-rw-r--r-- | src/pdf/SkPDFStream.cpp | 10 | ||||
-rw-r--r-- | src/pdf/SkPDFTypes.cpp | 23 |
3 files changed, 40 insertions, 1 deletions
diff --git a/gyp/pdf.gyp b/gyp/pdf.gyp index 259218338d..4a7ba6ddce 100644 --- a/gyp/pdf.gyp +++ b/gyp/pdf.gyp @@ -17,7 +17,10 @@ 'product_name': 'skia_pdf', 'type': 'static_library', 'standalone_static_library': 1, - 'variables': { 'skia_pdf_use_sfntly%': 1, }, + 'variables': { + 'skia_pdf_use_sfntly%': 1, + 'skia_pdf_less_compression%': 0, # enable for debugging only + }, 'dependencies': [ 'skia_lib.gyp:skia_lib', 'zlib.gyp:zlib', @@ -40,6 +43,9 @@ { 'dependencies': [ 'sfntly.gyp:sfntly' ] } ], [ 'skia_pdf_generate_pdfa', { 'defines': ['SK_PDF_GENERATE_PDFA'] } ], + [ 'skia_pdf_less_compression', + {'defines': ['SK_PDF_LESS_COMPRESSION'] } + ], [ 'skia_android_framework', { # Add SFTNLY support for PDF (which in turns depends on ICU) 'include_dirs': [ diff --git a/src/pdf/SkPDFStream.cpp b/src/pdf/SkPDFStream.cpp index 10fc77b587..bfe33a8465 100644 --- a/src/pdf/SkPDFStream.cpp +++ b/src/pdf/SkPDFStream.cpp @@ -33,11 +33,21 @@ void SkPDFStream::emitObject(SkWStream* stream, stream->writeText("\nendstream"); } + void SkPDFStream::setData(SkStream* 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<SkStreamRewindable> duplicate(stream->duplicate()); + if (duplicate && duplicate->hasLength()) { + this->insertInt("Length", duplicate->getLength()); + fCompressedData.reset(duplicate.release()); + return; + } + #endif + SkDynamicMemoryWStream compressedData; SkDeflateWStream deflateWStream(&compressedData); SkStreamCopy(&deflateWStream, stream); diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp index 5eb5c39c0e..285da38513 100644 --- a/src/pdf/SkPDFTypes.cpp +++ b/src/pdf/SkPDFTypes.cpp @@ -465,6 +465,28 @@ void SkPDFSharedStream::drop() { SkDEBUGCODE(fDumped = true;) } +#ifdef SK_PDF_LESS_COMPRESSION +void SkPDFSharedStream::emitObject( + SkWStream* stream, + const SkPDFObjNumMap& objNumMap, + const SkPDFSubstituteMap& substitutes) const { + SkASSERT(!fDumped); + std::unique_ptr<SkStreamAsset> dup(fAsset->duplicate()); + SkASSERT(dup && dup->hasLength()); + size_t length = dup->getLength(); + stream->writeText("<<"); + fDict->emitAll(stream, objNumMap, substitutes); + stream->writeText("\n"); + SkPDFUnion::Name("Length").emitObject( + stream, objNumMap, substitutes); + stream->writeText(" "); + SkPDFUnion::Int(length).emitObject( + stream, objNumMap, substitutes); + stream->writeText("\n>>stream\n"); + SkStreamCopy(stream, dup.get()); + stream->writeText("\nendstream"); +} +#else void SkPDFSharedStream::emitObject( SkWStream* stream, const SkPDFObjNumMap& objNumMap, @@ -493,6 +515,7 @@ void SkPDFSharedStream::emitObject( buffer.writeToStream(stream); stream->writeText("\nendstream"); } +#endif void SkPDFSharedStream::addResources( SkPDFObjNumMap* catalog, const SkPDFSubstituteMap& substitutes) const { |