• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "SkFlate.h"
18 #include "SkPDFCatalog.h"
19 #include "SkPDFStream.h"
20 #include "SkStream.h"
21 
SkPDFStream(SkStream * stream)22 SkPDFStream::SkPDFStream(SkStream* stream) {
23     if (SkFlate::HaveFlate())
24         SkAssertResult(SkFlate::Deflate(stream, &fCompressedData));
25 
26     if (SkFlate::HaveFlate() &&
27             fCompressedData.getOffset() < stream->getLength()) {
28         fLength = fCompressedData.getOffset();
29         insert("Filter", new SkPDFName("FlateDecode"))->unref();
30     } else {
31         fCompressedData.reset();
32         fPlainData = stream;
33         fLength = fPlainData->getLength();
34     }
35     insert("Length", new SkPDFInt(fLength))->unref();
36 }
37 
~SkPDFStream()38 SkPDFStream::~SkPDFStream() {
39 }
40 
emitObject(SkWStream * stream,SkPDFCatalog * catalog,bool indirect)41 void SkPDFStream::emitObject(SkWStream* stream, SkPDFCatalog* catalog,
42                              bool indirect) {
43     if (indirect)
44         return emitIndirectObject(stream, catalog);
45 
46     this->INHERITED::emitObject(stream, catalog, false);
47     stream->writeText(" stream\n");
48     if (fPlainData.get())
49         stream->write(fPlainData->getMemoryBase(), fLength);
50     else
51         stream->write(fCompressedData.getStream(), fLength);
52     stream->writeText("\nendstream");
53 }
54 
getOutputSize(SkPDFCatalog * catalog,bool indirect)55 size_t SkPDFStream::getOutputSize(SkPDFCatalog* catalog, bool indirect) {
56     if (indirect)
57         return getIndirectOutputSize(catalog);
58 
59     return this->INHERITED::getOutputSize(catalog, false) +
60         strlen(" stream\n\nendstream") + fLength;
61 }
62