Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
Functions
SkPDFTypes.cpp File Reference
#include "src/pdf/SkPDFTypes.h"
#include "include/core/SkData.h"
#include "include/core/SkExecutor.h"
#include "include/core/SkStream.h"
#include "include/private/base/SkTo.h"
#include "src/core/SkStreamPriv.h"
#include "src/pdf/SkDeflate.h"
#include "src/pdf/SkPDFDocumentPriv.h"
#include "src/pdf/SkPDFUnion.h"
#include "src/pdf/SkPDFUtils.h"
#include <new>

Go to the source code of this file.

Functions

static void write_name_escaped (SkWStream *o, const char *name)
 
static void write_literal_byte_string (SkWStream *wStream, const char *cin, size_t len)
 
static void write_hex_byte_string (SkWStream *wStream, const char *cin, size_t len)
 
static void write_optimized_byte_string (SkWStream *wStream, const char *cin, size_t len, size_t literalExtras)
 
static void write_byte_string (SkWStream *wStream, const char *cin, size_t len)
 
static void write_text_string (SkWStream *wStream, const char *cin, size_t len)
 
void SkPDFWriteTextString (SkWStream *wStream, const char *cin, size_t len)
 
void SkPDFWriteByteString (SkWStream *wStream, const char *cin, size_t len)
 
static void serialize_stream (SkPDFDict *origDict, SkStreamAsset *stream, SkPDFSteamCompressionEnabled compress, SkPDFDocument *doc, SkPDFIndirectReference ref)
 
SkPDFIndirectReference SkPDFStreamOut (std::unique_ptr< SkPDFDict > dict, std::unique_ptr< SkStreamAsset > content, SkPDFDocument *doc, SkPDFSteamCompressionEnabled compress)
 

Function Documentation

◆ serialize_stream()

static void serialize_stream ( SkPDFDict origDict,
SkStreamAsset stream,
SkPDFSteamCompressionEnabled  compress,
SkPDFDocument doc,
SkPDFIndirectReference  ref 
)
static

Definition at line 538 of file SkPDFTypes.cpp.

542 {
543 // Code assumes that the stream starts at the beginning.
544 SkASSERT(stream && stream->hasLength());
545
546 std::unique_ptr<SkStreamAsset> tmp;
547 SkPDFDict tmpDict;
548 SkPDFDict& dict = origDict ? *origDict : tmpDict;
549 static const size_t kMinimumSavings = strlen("/Filter_/FlateDecode_");
552 stream->getLength() > kMinimumSavings)
553 {
554 SkDynamicMemoryWStream compressedData;
555 SkDeflateWStream deflateWStream(&compressedData,SkToInt(doc->metadata().fCompressionLevel));
556 SkStreamCopy(&deflateWStream, stream);
557 deflateWStream.finalize();
558 #ifdef SK_PDF_BASE85_BINARY
559 {
560 SkPDFUtils::Base85Encode(compressedData.detachAsStream(), &compressedData);
561 tmp = compressedData.detachAsStream();
562 stream = tmp.get();
563 auto filters = SkPDFMakeArray();
564 filters->appendName("ASCII85Decode");
565 filters->appendName("FlateDecode");
566 dict.insertObject("Filter", std::move(filters));
567 }
568 #else
569 if (stream->getLength() > compressedData.bytesWritten() + kMinimumSavings) {
570 tmp = compressedData.detachAsStream();
571 stream = tmp.get();
572 dict.insertName("Filter", "FlateDecode");
573 } else {
574 SkAssertResult(stream->rewind());
575 }
576 #endif
577
578 }
579 dict.insertInt("Length", stream->getLength());
580 doc->emitStream(dict,
581 [stream](SkWStream* dst) { dst->writeStream(stream, stream->getLength()); },
582 ref);
583}
#define SkAssertResult(cond)
Definition SkAssert.h:123
#define SkASSERT(cond)
Definition SkAssert.h:116
static std::unique_ptr< SkPDFArray > SkPDFMakeArray(Args... args)
Definition SkPDFTypes.h:135
bool SkStreamCopy(SkWStream *out, SkStream *input)
Definition SkStream.cpp:954
constexpr int SkToInt(S x)
Definition SkTo.h:29
size_t bytesWritten() const override
Definition SkStream.cpp:526
std::unique_ptr< SkStreamAsset > detachAsStream()
Definition SkStream.cpp:876
void insertName(const char key[], const char nameValue[])
void insertObject(const char key[], std::unique_ptr< SkPDFObject > &&)
void insertInt(const char key[], int32_t value)
const SkPDF::Metadata & metadata() const
void emitStream(const SkPDFDict &dict, T writeStream, SkPDFIndirectReference ref)
dst
Definition cp.py:12
enum SkPDF::Metadata::CompressionLevel fCompressionLevel

◆ SkPDFStreamOut()

SkPDFIndirectReference SkPDFStreamOut ( std::unique_ptr< SkPDFDict dict,
std::unique_ptr< SkStreamAsset content,
SkPDFDocument doc,
SkPDFSteamCompressionEnabled  compress 
)

Definition at line 585 of file SkPDFTypes.cpp.

588 {
590 if (SkExecutor* executor = doc->executor()) {
591 SkPDFDict* dictPtr = dict.release();
592 SkStreamAsset* contentPtr = content.release();
593 // Pass ownership of both pointers into a std::function, which should
594 // only be executed once.
595 doc->incrementJobCount();
596 executor->add([dictPtr, contentPtr, compress, doc, ref]() {
597 serialize_stream(dictPtr, contentPtr, compress, doc, ref);
598 delete dictPtr;
599 delete contentPtr;
600 doc->signalJobComplete();
601 });
602 return ref;
603 }
604 serialize_stream(dict.get(), content.get(), compress, doc, ref);
605 return ref;
606}
static void serialize_stream(SkPDFDict *origDict, SkStreamAsset *stream, SkPDFSteamCompressionEnabled compress, SkPDFDocument *doc, SkPDFIndirectReference ref)
SkExecutor * executor() const
SkPDFIndirectReference reserveRef()
union flutter::testing::@2838::KeyboardChange::@76 content

◆ SkPDFWriteByteString()

void SkPDFWriteByteString ( SkWStream wStream,
const char *  cin,
size_t  len 
)

Definition at line 242 of file SkPDFTypes.cpp.

242 {
243 write_byte_string(wStream, cin, len);
244}
static void write_byte_string(SkWStream *wStream, const char *cin, size_t len)

◆ SkPDFWriteTextString()

void SkPDFWriteTextString ( SkWStream wStream,
const char *  cin,
size_t  len 
)

Definition at line 239 of file SkPDFTypes.cpp.

239 {
240 write_text_string(wStream, cin, len);
241}
static void write_text_string(SkWStream *wStream, const char *cin, size_t len)

◆ write_byte_string()

static void write_byte_string ( SkWStream wStream,
const char *  cin,
size_t  len 
)
static

Definition at line 170 of file SkPDFTypes.cpp.

170 {
171 SkDEBUGCODE(static const size_t kMaxLen = 65535;)
172 SkASSERT(len <= kMaxLen);
173
174 size_t literalExtras = 0;
175 {
176 for (size_t i = 0; i < len; i++) {
177 uint8_t c = static_cast<uint8_t>(cin[i]);
178 if (c < ' ' || '~' < c) {
179 literalExtras += 3;
180 } else if (c == '\\' || c == '(' || c == ')') {
181 ++literalExtras;
182 }
183 }
184 }
185 write_optimized_byte_string(wStream, cin, len, literalExtras);
186}
#define SkDEBUGCODE(...)
Definition SkDebug.h:23
static void write_optimized_byte_string(SkWStream *wStream, const char *cin, size_t len, size_t literalExtras)

◆ write_hex_byte_string()

static void write_hex_byte_string ( SkWStream wStream,
const char *  cin,
size_t  len 
)
static

Definition at line 145 of file SkPDFTypes.cpp.

145 {
146 SkDEBUGCODE(static const size_t kMaxLen = 65535;)
147 SkASSERT(len <= kMaxLen);
148
149 wStream->writeText("<");
150 for (size_t i = 0; i < len; i++) {
151 uint8_t c = static_cast<uint8_t>(cin[i]);
152 char hexValue[2] = { SkHexadecimalDigits::gUpper[c >> 4],
154 wStream->write(hexValue, 2);
155 }
156 wStream->writeText(">");
157}
virtual bool write(const void *buffer, size_t size)=0
bool writeText(const char text[])
Definition SkStream.h:247
const char gUpper[16]
Definition SkUtils.cpp:10

◆ write_literal_byte_string()

static void write_literal_byte_string ( SkWStream wStream,
const char *  cin,
size_t  len 
)
static

Definition at line 125 of file SkPDFTypes.cpp.

125 {
126 wStream->writeText("(");
127 for (size_t i = 0; i < len; i++) {
128 uint8_t c = static_cast<uint8_t>(cin[i]);
129 if (c < ' ' || '~' < c) {
130 uint8_t octal[4] = { '\\',
131 (uint8_t)('0' | ( c >> 6 )),
132 (uint8_t)('0' | ((c >> 3) & 0x07)),
133 (uint8_t)('0' | ( c & 0x07)) };
134 wStream->write(octal, 4);
135 } else {
136 if (c == '\\' || c == '(' || c == ')') {
137 wStream->writeText("\\");
138 }
139 wStream->write(&c, 1);
140 }
141 }
142 wStream->writeText(")");
143}

◆ write_name_escaped()

static void write_name_escaped ( SkWStream o,
const char *  name 
)
static

Definition at line 110 of file SkPDFTypes.cpp.

110 {
111 static const char kToEscape[] = "#/%()<>[]{}";
112 for (const uint8_t* n = reinterpret_cast<const uint8_t*>(name); *n; ++n) {
113 uint8_t v = *n;
114 if (v < '!' || v > '~' || strchr(kToEscape, v)) {
115 char buffer[3] = {'#',
118 o->write(buffer, sizeof(buffer));
119 } else {
120 o->write(n, 1);
121 }
122 }
123}
static const uint8_t buffer[]
const char * name
Definition fuchsia.cc:50

◆ write_optimized_byte_string()

static void write_optimized_byte_string ( SkWStream wStream,
const char *  cin,
size_t  len,
size_t  literalExtras 
)
static

Definition at line 159 of file SkPDFTypes.cpp.

160 {
161 const size_t hexLength = 2 + 2*len;
162 const size_t literalLength = 2 + len + literalExtras;
163 if (literalLength <= hexLength) {
164 write_literal_byte_string(wStream, cin, len);
165 } else {
166 write_hex_byte_string(wStream, cin, len);
167 }
168}
static void write_hex_byte_string(SkWStream *wStream, const char *cin, size_t len)
static void write_literal_byte_string(SkWStream *wStream, const char *cin, size_t len)

◆ write_text_string()

static void write_text_string ( SkWStream wStream,
const char *  cin,
size_t  len 
)
static

Definition at line 188 of file SkPDFTypes.cpp.

188 {
189 SkDEBUGCODE(static const size_t kMaxLen = 65535;)
190 SkASSERT(len <= kMaxLen);
191
192 bool inputIsValidUTF8 = true;
193 bool inputIsPDFDocEncoding = true;
194 size_t literalExtras = 0;
195 {
196 const char* textPtr = cin;
197 const char* textEnd = cin + len;
198 while (textPtr < textEnd) {
199 SkUnichar unichar = SkUTF::NextUTF8(&textPtr, textEnd);
200 if (unichar < 0) {
201 inputIsValidUTF8 = false;
202 break;
203 }
204 // See Table D.2 (PDFDocEncoding Character Set) in the PDF3200_2008 spec.
205 // Could convert from UTF-8 to PDFDocEncoding and, if successful, use that.
206 if ((0x15 < unichar && unichar < 0x20) || 0x7E < unichar) {
207 inputIsPDFDocEncoding = false;
208 break;
209 }
210 if (unichar < ' ' || '~' < unichar) {
211 literalExtras += 3;
212 } else if (unichar == '\\' || unichar == '(' || unichar == ')') {
213 ++literalExtras;
214 }
215 }
216 }
217
218 if (!inputIsValidUTF8) {
219 SkDebugf("Invalid UTF8: %.*s\n", (int)len, cin);
220 wStream->writeText("<>");
221 return;
222 }
223
224 if (inputIsPDFDocEncoding) {
225 write_optimized_byte_string(wStream, cin, len, literalExtras);
226 return;
227 }
228
229 wStream->writeText("<FEFF");
230 const char* textPtr = cin;
231 const char* textEnd = cin + len;
232 while (textPtr < textEnd) {
233 SkUnichar unichar = SkUTF::NextUTF8(&textPtr, textEnd);
234 SkPDFUtils::WriteUTF16beHex(wStream, unichar);
235 }
236 wStream->writeText(">");
237}
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
int32_t SkUnichar
Definition SkTypes.h:175
void WriteUTF16beHex(SkWStream *wStream, SkUnichar utf32)
Definition SkPDFUtils.h:107
SK_SPI SkUnichar NextUTF8(const char **ptr, const char *end)
Definition SkUTF.cpp:118