| Index: src/pdf/SkPDFTypes.cpp
|
| diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp
|
| index e80d1186c38dc3e507604dd239e8570eec3653b0..89d6a0bc48dd7674ff3d3ed7fe11bc83db7b8099 100644
|
| --- a/src/pdf/SkPDFTypes.cpp
|
| +++ b/src/pdf/SkPDFTypes.cpp
|
| @@ -133,10 +133,6 @@ SkPDFString::SkPDFString(const SkString& value)
|
| : fValue(FormatString(value.c_str(), value.size())) {
|
| }
|
|
|
| -SkPDFString::SkPDFString(const uint16_t* value, size_t len, bool wideChars)
|
| - : fValue(FormatString(value, len, wideChars)) {
|
| -}
|
| -
|
| SkPDFString::~SkPDFString() {}
|
|
|
| void SkPDFString::emitObject(SkWStream* stream,
|
| @@ -146,67 +142,46 @@ void SkPDFString::emitObject(SkWStream* stream,
|
| }
|
|
|
| // static
|
| -SkString SkPDFString::FormatString(const char* input, size_t len) {
|
| - return DoFormatString(input, len, false, false);
|
| -}
|
| -
|
| -SkString SkPDFString::FormatString(const uint16_t* input, size_t len,
|
| - bool wideChars) {
|
| - return DoFormatString(input, len, true, wideChars);
|
| -}
|
| -
|
| -// static
|
| -SkString SkPDFString::DoFormatString(const void* input, size_t len,
|
| - bool wideInput, bool wideOutput) {
|
| +SkString SkPDFString::FormatString(const char* cin, size_t len) {
|
| SkASSERT(len <= kMaxLen);
|
| - const uint16_t* win = (const uint16_t*) input;
|
| - const char* cin = (const char*) input;
|
| -
|
| - if (wideOutput) {
|
| - SkASSERT(wideInput);
|
| - SkString result;
|
| - result.append("<");
|
| - for (size_t i = 0; i < len; i++) {
|
| - result.appendHex(win[i], 4);
|
| - }
|
| - result.append(">");
|
| - return result;
|
| - }
|
|
|
| // 7-bit clean is a heuristic to decide what string format to use;
|
| // a 7-bit clean string should require little escaping.
|
| bool sevenBitClean = true;
|
| + size_t characterCount = 2 + len;
|
| for (size_t i = 0; i < len; i++) {
|
| - SkASSERT(!wideInput || !(win[i] & ~0xFF));
|
| - char val = wideInput ? win[i] : cin[i];
|
| - if (val > '~' || val < ' ') {
|
| + if (cin[i] > '~' || cin[i] < ' ') {
|
| sevenBitClean = false;
|
| break;
|
| }
|
| + if (cin[i] == '\\' || cin[i] == '(' || cin[i] == ')') {
|
| + ++characterCount;
|
| + }
|
| }
|
| -
|
| SkString result;
|
| if (sevenBitClean) {
|
| - result.append("(");
|
| + result.resize(characterCount);
|
| + char* str = result.writable_str();
|
| + *str++ = '(';
|
| for (size_t i = 0; i < len; i++) {
|
| - SkASSERT(!wideInput || !(win[i] & ~0xFF));
|
| - char val = wideInput ? win[i] : cin[i];
|
| - if (val == '\\' || val == '(' || val == ')') {
|
| - result.append("\\");
|
| + if (cin[i] == '\\' || cin[i] == '(' || cin[i] == ')') {
|
| + *str++ = '\\';
|
| }
|
| - result.append(&val, 1);
|
| + *str++ = cin[i];
|
| }
|
| - result.append(")");
|
| + *str++ = ')';
|
| } else {
|
| - result.append("<");
|
| + result.resize(2 * len + 2);
|
| + char* str = result.writable_str();
|
| + *str++ = '<';
|
| for (size_t i = 0; i < len; i++) {
|
| - SkASSERT(!wideInput || !(win[i] & ~0xFF));
|
| - unsigned char val = wideInput ? win[i] : cin[i];
|
| - result.appendHex(val, 2);
|
| + uint8_t c = static_cast<uint8_t>(cin[i]);
|
| + static const char gHex[] = "0123456789ABCDEF";
|
| + *str++ = gHex[(c >> 4) & 0xF];
|
| + *str++ = gHex[(c ) & 0xF];
|
| }
|
| - result.append(">");
|
| + *str++ = '>';
|
| }
|
| -
|
| return result;
|
| }
|
|
|
|
|