blob: f77c85fc94f5f8f792c88de7709ff1ec2b431288 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2010 Google Inc.
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
reed@google.com8a85d0c2011-06-24 19:12:12 +000010#include "SkData.h"
vandebo@chromium.orga09ef972010-12-01 22:17:20 +000011#include "SkFlate.h"
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000012#include "SkPDFStream.h"
13#include "SkStream.h"
halcanary67ec1f82014-06-27 11:36:20 -070014#include "SkStreamPriv.h"
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000015
vandebo@chromium.org26e14492013-08-26 22:52:09 +000016SkPDFStream::SkPDFStream(SkStream* stream) : fState(kUnused_State) {
halcanary67ec1f82014-06-27 11:36:20 -070017 this->setData(stream);
vandebo@chromium.org421d6442011-07-20 17:39:01 +000018}
19
20SkPDFStream::SkPDFStream(SkData* data) : fState(kUnused_State) {
halcanary67ec1f82014-06-27 11:36:20 -070021 this->setData(data);
vandebo@chromium.org421d6442011-07-20 17:39:01 +000022}
23
vandebo@chromium.org421d6442011-07-20 17:39:01 +000024SkPDFStream::~SkPDFStream() {}
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000025
halcanary37c46ca2015-03-31 12:30:20 -070026void SkPDFStream::emitObject(SkWStream* stream,
27 const SkPDFObjNumMap& objNumMap,
28 const SkPDFSubstituteMap& substitutes) {
29 if (fState == kUnused_State) {
30 fState = kNoCompression_State;
31 SkDynamicMemoryWStream compressedData;
32
33 SkAssertResult(
34 SkFlate::Deflate(fDataStream.get(), &compressedData));
35 SkAssertResult(fDataStream->rewind());
36 if (compressedData.getOffset() < this->dataSize()) {
37 SkAutoTDelete<SkStream> compressed(
38 compressedData.detachAsStream());
39 this->setData(compressed.get());
halcanary7b6db092015-03-31 12:44:47 -070040 this->insertName("Filter", "FlateDecode");
halcanary37c46ca2015-03-31 12:30:20 -070041 }
42 fState = kCompressed_State;
halcanary7b6db092015-03-31 12:44:47 -070043 this->insertInt("Length", this->dataSize());
halcanary37c46ca2015-03-31 12:30:20 -070044 }
45 this->INHERITED::emitObject(stream, objNumMap, substitutes);
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000046 stream->writeText(" stream\n");
halcanarye3224822014-07-14 09:12:12 -070047 stream->writeStream(fDataStream.get(), fDataStream->getLength());
48 SkAssertResult(fDataStream->rewind());
vandebo@chromium.org9b49dc02010-10-20 22:23:29 +000049 stream->writeText("\nendstream");
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000050}
51
vandebo@chromium.org421d6442011-07-20 17:39:01 +000052SkPDFStream::SkPDFStream() : fState(kUnused_State) {}
53
commit-bot@chromium.orgd8d976e2013-07-08 23:17:57 +000054void SkPDFStream::setData(SkData* data) {
scroggoa1193e42015-01-21 12:09:53 -080055 // FIXME: Don't swap if the data is the same.
56 fDataStream.reset(SkNEW_ARGS(SkMemoryStream, (data)));
commit-bot@chromium.orgd8d976e2013-07-08 23:17:57 +000057}
58
vandebo@chromium.org421d6442011-07-20 17:39:01 +000059void SkPDFStream::setData(SkStream* stream) {
halcanaryaf9c85d2015-03-31 08:22:01 -070060 SkASSERT(stream);
vandebo@chromium.org26e14492013-08-26 22:52:09 +000061 // Code assumes that the stream starts at the beginning and is rewindable.
halcanaryaf9c85d2015-03-31 08:22:01 -070062 // SkStreamRewindableFromSkStream will try stream->duplicate().
63 fDataStream.reset(SkStreamRewindableFromSkStream(stream));
64 SkASSERT(fDataStream.get());
halcanary67ec1f82014-06-27 11:36:20 -070065}
66
67size_t SkPDFStream::dataSize() const {
halcanarye3224822014-07-14 09:12:12 -070068 SkASSERT(fDataStream->hasLength());
69 return fDataStream->getLength();
vandebo@chromium.org421d6442011-07-20 17:39:01 +000070}