Home | History | Annotate | Download | only in pdf
      1 
      2 /*
      3  * Copyright 2010 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 #include "SkData.h"
     11 #include "SkDeflate.h"
     12 #include "SkPDFStream.h"
     13 #include "SkStream.h"
     14 #include "SkStreamPriv.h"
     15 
     16 SkPDFStream::~SkPDFStream() {}
     17 
     18 void SkPDFStream::emitObject(SkWStream* stream,
     19                              const SkPDFObjNumMap& objNumMap,
     20                              const SkPDFSubstituteMap& substitutes) const {
     21     SkASSERT(fCompressedData);
     22     this->INHERITED::emitObject(stream, objNumMap, substitutes);
     23     // duplicate (a cheap operation) preserves const on fCompressedData.
     24     SkAutoTDelete<SkStreamRewindable> dup(fCompressedData->duplicate());
     25     SkASSERT(dup);
     26     SkASSERT(dup->hasLength());
     27     stream->writeText(" stream\n");
     28     stream->writeStream(dup.get(), dup->getLength());
     29     stream->writeText("\nendstream");
     30 }
     31 
     32 void SkPDFStream::setData(SkStream* stream) {
     33     SkASSERT(!fCompressedData);  // Only call this function once.
     34     SkASSERT(stream);
     35     // Code assumes that the stream starts at the beginning.
     36 
     37     SkDynamicMemoryWStream compressedData;
     38     SkDeflateWStream deflateWStream(&compressedData);
     39     SkStreamCopy(&deflateWStream, stream);
     40     deflateWStream.finalize();
     41     size_t length = compressedData.bytesWritten();
     42 
     43     if (stream->hasLength()) {
     44         SkAutoTDelete<SkStreamRewindable> dup(stream->duplicate());
     45         if (dup && dup->hasLength() &&
     46             dup->getLength() <= length + strlen("/Filter_/FlateDecode_")) {
     47             this->insertInt("Length", dup->getLength());
     48             fCompressedData.reset(dup.detach());
     49             return;
     50         }
     51     }
     52     fCompressedData.reset(compressedData.detachAsStream());
     53     this->insertName("Filter", "FlateDecode");
     54     this->insertInt("Length", length);
     55 }
     56