Add deflate support to SkPDFStream.
Review URL: http://codereview.appspot.com/3326043
git-svn-id: http://skia.googlecode.com/svn/trunk@627 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFStream.cpp b/src/pdf/SkPDFStream.cpp
index 8be4f11..6947ae4 100644
--- a/src/pdf/SkPDFStream.cpp
+++ b/src/pdf/SkPDFStream.cpp
@@ -14,12 +14,25 @@
* limitations under the License.
*/
+#include "SkFlate.h"
#include "SkPDFCatalog.h"
#include "SkPDFStream.h"
#include "SkStream.h"
-SkPDFStream::SkPDFStream(SkStream* stream) : fData(stream) {
- SkRefPtr<SkPDFInt> lenValue = new SkPDFInt(fData->read(NULL, 0));
+SkPDFStream::SkPDFStream(SkStream* stream) {
+ if (SkFlate::HaveFlate()) {
+ SkAssertResult(SkFlate::Deflate(stream, &fCompressedData));
+ fLength = fCompressedData.getOffset();
+
+ SkRefPtr<SkPDFName> flateFilter = new SkPDFName("FlateDecode");
+ flateFilter->unref(); // SkRefPtr and new both took a reference.
+ fDict.insert("Filter", flateFilter.get());
+ } else {
+ fPlainData = stream;
+ fLength = fPlainData->getLength();
+ }
+
+ SkRefPtr<SkPDFInt> lenValue = new SkPDFInt(fLength);
lenValue->unref(); // SkRefPtr and new both took a reference.
fDict.insert("Length", lenValue.get());
}
@@ -34,7 +47,10 @@
fDict.emitObject(stream, catalog, false);
stream->writeText(" stream\n");
- stream->write(fData->getMemoryBase(), fData->read(NULL, 0));
+ if (fPlainData.get())
+ stream->write(fPlainData->getMemoryBase(), fLength);
+ else
+ stream->write(fCompressedData.getStream(), fLength);
stream->writeText("\nendstream");
}
@@ -43,7 +59,7 @@
return getIndirectOutputSize(catalog);
return fDict.getOutputSize(catalog, false) +
- strlen(" stream\n\nendstream") + fData->read(NULL, 0);
+ strlen(" stream\n\nendstream") + fLength;
}
void SkPDFStream::insert(SkPDFName* key, SkPDFObject* value) {