| Index: src/pdf/SkPDFTypes.cpp
|
| diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp
|
| index 2b2921d3fd6b6df144de4464c6dc689ed3b89c4f..619870a4cc5ffec50b4765f7f946415d7e8e1325 100644
|
| --- a/src/pdf/SkPDFTypes.cpp
|
| +++ b/src/pdf/SkPDFTypes.cpp
|
| @@ -99,35 +99,21 @@ bool is_valid_name(const char* n) {
|
| }
|
| #endif // SK_DEBUG
|
|
|
| -// Given an arbitrary string, convert it to a valid name.
|
| -static SkString escape_name(const char* name, size_t len) {
|
| +// Given an arbitrary string, write it as a valid name (not including
|
| +// leading slash).
|
| +static void write_name_escaped(SkWStream* o, const char* name) {
|
| static const char kToEscape[] = "#/%()<>[]{}";
|
| - int count = 0;
|
| - const char* const end = &name[len];
|
| - for (const char* n = name; n != end; ++n) {
|
| - if (*n < '!' || *n > '~' || strchr(kToEscape, *n)) {
|
| - count += 2;
|
| - }
|
| - ++count;
|
| - }
|
| - SkString result(count);
|
| - char* s = result.writable_str();
|
| static const char kHex[] = "0123456789ABCDEF";
|
| - for (const char* n = name; n != end; ++n) {
|
| + for (const uint8_t* n = reinterpret_cast<const uint8_t*>(name); *n; ++n) {
|
| if (*n < '!' || *n > '~' || strchr(kToEscape, *n)) {
|
| - *s++ = '#';
|
| - *s++ = kHex[(*n >> 4) & 0xF];
|
| - *s++ = kHex[*n & 0xF];
|
| + char buffer[3] = {'#', '\0', '\0'};
|
| + buffer[1] = kHex[(*n >> 4) & 0xF];
|
| + buffer[2] = kHex[*n & 0xF];
|
| + o->write(buffer, sizeof(buffer));
|
| } else {
|
| - *s++ = *n;
|
| + o->write(n, 1);
|
| }
|
| }
|
| - SkASSERT(&result.writable_str()[count] == s); // don't over-write
|
| - return result; // allocated space
|
| -}
|
| -
|
| -static SkString escape_name(const SkString& name) {
|
| - return escape_name(name.c_str(), name.size());
|
| }
|
|
|
| static void write_string(SkWStream* o, const SkString& s) {
|
| @@ -166,7 +152,7 @@ void SkPDFUnion::emitObject(SkWStream* stream,
|
| return;
|
| case Type::kNameSkS:
|
| stream->writeText("/");
|
| - write_string(stream, escape_name(*pun(fSkString)));
|
| + write_name_escaped(stream, pun(fSkString)->c_str());
|
| return;
|
| case Type::kStringSkS:
|
| write_string(stream, format_string(*pun(fSkString)));
|
|
|