34 case Type::kByteStringSkS:
35 case Type::kTextStringSkS:
50 case Type::kDestroyed:
53 case Type::kColorComponent:
60 case Type::kColorComponentF:
65 case Type::kByteString:
66 case Type::kTextString:
70 case Type::kByteStringSkS:
71 case Type::kTextStringSkS:
75 new (&
fObject) PDFObject(std::move(that.fObject));
78 SkDEBUGFAIL(
"SkPDFUnion::SkPDFUnion with bad type");
80 that.fType = Type::kDestroyed;
92 return Type::kName == fType || Type::kNameSkS == fType;
98 static const char kControlChars[] =
"/%()<>[]{}";
100 if (*n <
'!' || *n >
'~' || strchr(kControlChars, *n)) {
111 static const char kToEscape[] =
"#/%()<>[]{}";
112 for (
const uint8_t* n =
reinterpret_cast<const uint8_t*
>(
name); *n; ++n) {
114 if (v <
'!' || v >
'~' || strchr(kToEscape, v)) {
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);
136 if (c ==
'\\' || c ==
'(' || c ==
')') {
139 wStream->
write(&c, 1);
150 for (
size_t i = 0; i < len; i++) {
151 uint8_t c =
static_cast<uint8_t
>(cin[i]);
154 wStream->
write(hexValue, 2);
160 size_t literalExtras) {
161 const size_t hexLength = 2 + 2*len;
162 const size_t literalLength = 2 + len + literalExtras;
163 if (literalLength <= hexLength) {
174 size_t literalExtras = 0;
176 for (
size_t i = 0; i < len; i++) {
177 uint8_t c =
static_cast<uint8_t
>(cin[i]);
178 if (c <
' ' ||
'~' < c) {
180 }
else if (c ==
'\\' || c ==
'(' || c ==
')') {
192 bool inputIsValidUTF8 =
true;
193 bool inputIsPDFDocEncoding =
true;
194 size_t literalExtras = 0;
196 const char* textPtr = cin;
197 const char* textEnd = cin + len;
198 while (textPtr < textEnd) {
201 inputIsValidUTF8 =
false;
206 if ((0x15 < unichar && unichar < 0x20) || 0x7E < unichar) {
207 inputIsPDFDocEncoding =
false;
210 if (unichar <
' ' ||
'~' < unichar) {
212 }
else if (unichar ==
'\\' || unichar ==
'(' || unichar ==
')') {
218 if (!inputIsValidUTF8) {
219 SkDebugf(
"Invalid UTF8: %.*s\n", (
int)len, cin);
224 if (inputIsPDFDocEncoding) {
230 const char* textPtr = cin;
231 const char* textEnd = cin + len;
232 while (textPtr < textEnd) {
251 case Type::kColorComponent:
254 case Type::kColorComponentF:
258 stream->writeText(
fBoolValue ?
"true" :
"false");
264 stream->writeText(
"/");
268 case Type::kByteString:
272 case Type::kTextString:
277 stream->writeText(
"/");
280 case Type::kByteStringSkS:
283 case Type::kTextStringSkS:
292 stream->writeText(
" 0 R");
295 SkDEBUGFAIL(
"SkPDFUnion::emitObject with bad type");
340 return SkPDFUnion(Type::kByteStringSkS, std::move(
s));
344 return SkPDFUnion(Type::kTextStringSkS, std::move(
s));
349 return SkPDFUnion(Type::kObject, std::move(objSp));
360void SkPDFAtom::emitObject(
SkWStream* stream)
const {
361 fValue.emitObject(stream);
378 stream->writeText(
"[");
379 for (
size_t i = 0; i < fValues.size(); i++) {
380 fValues[i].emitObject(stream);
381 if (i + 1 < fValues.size()) {
382 stream->writeText(
" ");
385 stream->writeText(
"]");
389 fValues.emplace_back(std::move(value));
451 stream->writeText(
"<<");
452 for (
size_t i = 0; i < fRecords.size(); ++i) {
453 const std::pair<SkPDFUnion, SkPDFUnion>& record = fRecords[i];
454 record.first.emitObject(stream);
455 stream->writeText(
" ");
456 record.second.emitObject(stream);
457 if (i + 1 < fRecords.size()) {
458 stream->writeText(
"\n");
461 stream->writeText(
">>");
544 SkASSERT(stream && stream->hasLength());
546 std::unique_ptr<SkStreamAsset> tmp;
548 SkPDFDict& dict = origDict ? *origDict : tmpDict;
549 static const size_t kMinimumSavings = strlen(
"/Filter_/FlateDecode_");
552 stream->getLength() > kMinimumSavings)
558 #ifdef SK_PDF_BASE85_BINARY
560 SkPDFUtils::Base85Encode(compressedData.
detachAsStream(), &compressedData);
564 filters->appendName(
"ASCII85Decode");
565 filters->appendName(
"FlateDecode");
569 if (stream->getLength() > compressedData.
bytesWritten() + kMinimumSavings) {
579 dict.
insertInt(
"Length", stream->getLength());
581 [stream](
SkWStream* dst) { dst->writeStream(stream, stream->getLength()); },
586 std::unique_ptr<SkStreamAsset>
content,
596 executor->add([dictPtr, contentPtr, compress, doc, ref]() {
static bool is_valid_name(const SkString &name)
#define SkAssertResult(cond)
#define SkDEBUGFAIL(message)
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static void write_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_name_escaped(SkWStream *o, const char *name)
void SkPDFWriteByteString(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_literal_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)
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)
static std::unique_ptr< SkPDFArray > SkPDFMakeArray(Args... args)
SkPDFSteamCompressionEnabled
bool SkStreamCopy(SkWStream *out, SkStream *input)
constexpr int32_t SkToS32(S x)
constexpr int SkToInt(S x)
constexpr uint8_t SkToU8(S x)
size_t bytesWritten() const override
std::unique_ptr< SkStreamAsset > detachAsStream()
void appendRef(SkPDFIndirectReference)
void appendTextString(const char[])
void appendByteString(const char[])
void appendObject(std::unique_ptr< SkPDFObject > &&)
void appendColorComponent(uint8_t)
void appendName(const char[])
void appendScalar(SkScalar)
void emitObject(SkWStream *stream) const override
void insertName(const char key[], const char nameValue[])
void insertObject(const char key[], std::unique_ptr< SkPDFObject > &&)
void insertColorComponentF(const char key[], SkScalar value)
void insertUnion(const char key[], SkPDFUnion &&)
void insertInt(const char key[], int32_t value)
void insertTextString(const char key[], const char value[])
void insertRef(const char key[], SkPDFIndirectReference)
void insertScalar(const char key[], SkScalar value)
void insertByteString(const char key[], const char value[])
void emitObject(SkWStream *stream) const override
void insertBool(const char key[], bool value)
SkPDFDict(const char type[]=nullptr)
SkExecutor * executor() const
const SkPDF::Metadata & metadata() const
void emitStream(const SkPDFDict &dict, T writeStream, SkPDFIndirectReference ref)
SkPDFIndirectReference reserveRef()
static SkPDFUnion Ref(SkPDFIndirectReference)
static SkPDFUnion ColorComponentF(float)
SkPDFUnion(SkPDFUnion &&)
static SkPDFUnion Bool(bool)
static SkPDFUnion Int(int32_t)
static SkPDFUnion TextString(const char *)
void emitObject(SkWStream *) const
static SkPDFUnion ByteString(const char *)
static SkPDFUnion Object(std::unique_ptr< SkPDFObject >)
SkPDFUnion & operator=(SkPDFUnion &&)
static SkPDFUnion Name(const char *)
const char * fStaticString
static SkPDFUnion Scalar(SkScalar)
static SkPDFUnion ColorComponent(uint8_t)
const char * c_str() const
virtual bool write(const void *buffer, size_t size)=0
bool writeText(const char text[])
static const uint8_t buffer[]
union flutter::testing::@2838::KeyboardChange::@76 content
void AppendColorComponent(uint8_t value, SkWStream *wStream)
void AppendScalar(SkScalar value, SkWStream *stream)
void AppendColorComponentF(float value, SkWStream *wStream)
void WriteUTF16beHex(SkWStream *wStream, SkUnichar utf32)
SK_SPI SkUnichar NextUTF8(const char **ptr, const char *end)