Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(88)

Side by Side Diff: src/pdf/SkPDFStream.cpp

Issue 340783013: Switch SkPDFStream's internal storage from SkStream to SkData (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: images/SkStreamHelpers -> core/SkStreamPriv Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pdf/SkPDFStream.h ('k') | src/ports/SkImageDecoder_CG.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2010 Google Inc. 3 * Copyright 2010 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "SkData.h" 10 #include "SkData.h"
11 #include "SkFlate.h" 11 #include "SkFlate.h"
12 #include "SkPDFCatalog.h" 12 #include "SkPDFCatalog.h"
13 #include "SkPDFStream.h" 13 #include "SkPDFStream.h"
14 #include "SkStream.h" 14 #include "SkStream.h"
15 #include "SkStreamPriv.h"
15 16
16 static bool skip_compression(SkPDFCatalog* catalog) { 17 static bool skip_compression(SkPDFCatalog* catalog) {
17 return SkToBool(catalog->getDocumentFlags() & 18 return SkToBool(catalog->getDocumentFlags() &
18 SkPDFDocument::kFavorSpeedOverSize_Flags); 19 SkPDFDocument::kFavorSpeedOverSize_Flags);
19 } 20 }
20 21
21 SkPDFStream::SkPDFStream(SkStream* stream) : fState(kUnused_State) { 22 SkPDFStream::SkPDFStream(SkStream* stream) : fState(kUnused_State) {
22 setData(stream); 23 this->setData(stream);
23 } 24 }
24 25
25 SkPDFStream::SkPDFStream(SkData* data) : fState(kUnused_State) { 26 SkPDFStream::SkPDFStream(SkData* data) : fState(kUnused_State) {
26 setData(data); 27 this->setData(data);
27 } 28 }
28 29
29 SkPDFStream::SkPDFStream(const SkPDFStream& pdfStream) 30 SkPDFStream::SkPDFStream(const SkPDFStream& pdfStream)
30 : SkPDFDict(), 31 : SkPDFDict(),
31 fState(kUnused_State) { 32 fState(kUnused_State) {
32 setData(pdfStream.fData.get()); 33 this->setData(pdfStream.fData.get());
33 bool removeLength = true; 34 bool removeLength = true;
34 // Don't uncompress an already compressed stream, but we could. 35 // Don't uncompress an already compressed stream, but we could.
35 if (pdfStream.fState == kCompressed_State) { 36 if (pdfStream.fState == kCompressed_State) {
36 fState = kCompressed_State; 37 fState = kCompressed_State;
37 removeLength = false; 38 removeLength = false;
38 } 39 }
39 SkPDFDict::Iter dict(pdfStream); 40 SkPDFDict::Iter dict(pdfStream);
40 SkPDFName* key; 41 SkPDFName* key;
41 SkPDFObject* value; 42 SkPDFObject* value;
42 SkPDFName lengthName("Length"); 43 SkPDFName lengthName("Length");
43 for (key = dict.next(&value); key != NULL; key = dict.next(&value)) { 44 for (key = dict.next(&value); key != NULL; key = dict.next(&value)) {
44 if (removeLength && *key == lengthName) { 45 if (removeLength && *key == lengthName) {
45 continue; 46 continue;
46 } 47 }
47 this->insert(key, value); 48 this->insert(key, value);
48 } 49 }
49 } 50 }
50 51
51 SkPDFStream::~SkPDFStream() {} 52 SkPDFStream::~SkPDFStream() {}
52 53
53 void SkPDFStream::emitObject(SkWStream* stream, SkPDFCatalog* catalog, 54 void SkPDFStream::emitObject(SkWStream* stream, SkPDFCatalog* catalog,
54 bool indirect) { 55 bool indirect) {
55 if (indirect) { 56 if (indirect) {
56 return emitIndirectObject(stream, catalog); 57 return emitIndirectObject(stream, catalog);
57 } 58 }
59 SkAutoMutexAcquire lock(fMutex); // multiple threads could be calling emit
58 if (!this->populate(catalog)) { 60 if (!this->populate(catalog)) {
59 return fSubstitute->emitObject(stream, catalog, indirect); 61 return fSubstitute->emitObject(stream, catalog, indirect);
60 } 62 }
61 63
62 this->INHERITED::emitObject(stream, catalog, false); 64 this->INHERITED::emitObject(stream, catalog, false);
63 stream->writeText(" stream\n"); 65 stream->writeText(" stream\n");
64 stream->writeStream(fData.get(), fData->getLength()); 66 if (fData.get()) {
65 fData->rewind(); 67 stream->write(fData->data(), fData->size());
68 }
66 stream->writeText("\nendstream"); 69 stream->writeText("\nendstream");
67 } 70 }
68 71
69 size_t SkPDFStream::getOutputSize(SkPDFCatalog* catalog, bool indirect) { 72 size_t SkPDFStream::getOutputSize(SkPDFCatalog* catalog, bool indirect) {
70 if (indirect) { 73 if (indirect) {
71 return getIndirectOutputSize(catalog); 74 return getIndirectOutputSize(catalog);
72 } 75 }
76 SkAutoMutexAcquire lock(fMutex); // multiple threads could be calling emit
73 if (!this->populate(catalog)) { 77 if (!this->populate(catalog)) {
74 return fSubstitute->getOutputSize(catalog, indirect); 78 return fSubstitute->getOutputSize(catalog, indirect);
75 } 79 }
76 80
77 return this->INHERITED::getOutputSize(catalog, false) + 81 return this->INHERITED::getOutputSize(catalog, false) +
78 strlen(" stream\n\nendstream") + fData->getLength(); 82 strlen(" stream\n\nendstream") + this->dataSize();
79 } 83 }
80 84
81 SkPDFStream::SkPDFStream() : fState(kUnused_State) {} 85 SkPDFStream::SkPDFStream() : fState(kUnused_State) {}
82 86
83 void SkPDFStream::setData(SkData* data) { 87 void SkPDFStream::setData(SkData* data) {
84 SkMemoryStream* stream = new SkMemoryStream; 88 fData.reset(SkSafeRef(data));
85 stream->setData(data);
86 fData.reset(stream); // Transfer ownership.
87 } 89 }
88 90
89 void SkPDFStream::setData(SkStream* stream) { 91 void SkPDFStream::setData(SkStream* stream) {
90 // Code assumes that the stream starts at the beginning and is rewindable. 92 // Code assumes that the stream starts at the beginning and is rewindable.
91 if (stream) { 93 if (stream) {
92 SkASSERT(stream->getPosition() == 0); 94 SkASSERT(stream->getPosition() == 0);
93 SkASSERT(stream->rewind()); 95 fData.reset(SkCopyStreamToData(stream));
96 SkAssertResult(stream->rewind());
mtklein 2014/06/27 13:57:30 Is change this intentional?
97 } else {
98 fData.reset(NULL);
94 } 99 }
95 fData.reset(stream); 100 }
96 SkSafeRef(stream); 101
102 size_t SkPDFStream::dataSize() const {
103 return fData.get() ? fData->size() : 0;
97 } 104 }
98 105
99 bool SkPDFStream::populate(SkPDFCatalog* catalog) { 106 bool SkPDFStream::populate(SkPDFCatalog* catalog) {
100 if (fState == kUnused_State) { 107 if (fState == kUnused_State) {
101 if (!skip_compression(catalog) && SkFlate::HaveFlate()) { 108 if (!skip_compression(catalog) && SkFlate::HaveFlate()) {
102 SkDynamicMemoryWStream compressedData; 109 SkDynamicMemoryWStream compressedData;
103 110
104 SkAssertResult(SkFlate::Deflate(fData.get(), &compressedData)); 111 SkAssertResult(SkFlate::Deflate(fData.get(), &compressedData));
105 if (compressedData.getOffset() < fData->getLength()) { 112 if (compressedData.getOffset() < this->dataSize()) {
106 SkMemoryStream* stream = new SkMemoryStream; 113 fData.reset(compressedData.copyToData());
107 stream->setData(compressedData.copyToData())->unref();
108 fData.reset(stream); // Transfer ownership.
109 insertName("Filter", "FlateDecode"); 114 insertName("Filter", "FlateDecode");
110 } 115 }
111 fState = kCompressed_State; 116 fState = kCompressed_State;
112 } else { 117 } else {
113 fState = kNoCompression_State; 118 fState = kNoCompression_State;
114 } 119 }
115 insertInt("Length", fData->getLength()); 120 insertInt("Length", this->dataSize());
116 } else if (fState == kNoCompression_State && !skip_compression(catalog) && 121 } else if (fState == kNoCompression_State && !skip_compression(catalog) &&
117 SkFlate::HaveFlate()) { 122 SkFlate::HaveFlate()) {
118 if (!fSubstitute.get()) { 123 if (!fSubstitute.get()) {
119 fSubstitute.reset(new SkPDFStream(*this)); 124 fSubstitute.reset(new SkPDFStream(*this));
120 catalog->setSubstitute(this, fSubstitute.get()); 125 catalog->setSubstitute(this, fSubstitute.get());
121 } 126 }
122 return false; 127 return false;
123 } 128 }
124 return true; 129 return true;
125 } 130 }
OLDNEW
« no previous file with comments | « src/pdf/SkPDFStream.h ('k') | src/ports/SkImageDecoder_CG.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698