aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pdf/SkPDFTypes.cpp
diff options
context:
space:
mode:
authorGravatar halcanary <halcanary@google.com>2015-04-07 10:40:03 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-04-07 10:40:03 -0700
commitbb264b775004be3df72f0bb5ee613761a328a6c3 (patch)
treecbd19d5f55df51c934e3fd6b867e414a52161fec /src/pdf/SkPDFTypes.cpp
parent3cf9863bb658d637416c4edbf278b0311dba7478 (diff)
SkPDF: SkPDFString is no longer aware of wide strings.
Since wide strings are only used in SkPDFDevice, I have moved the function that manages them to that directory. Motivation: The SkPDFString will be refactored later along with the other SkPFObject heirarchy. BUG=skia:3585 Review URL: https://codereview.chromium.org/1064013003
Diffstat (limited to 'src/pdf/SkPDFTypes.cpp')
-rw-r--r--src/pdf/SkPDFTypes.cpp67
1 files changed, 21 insertions, 46 deletions
diff --git a/src/pdf/SkPDFTypes.cpp b/src/pdf/SkPDFTypes.cpp
index e80d1186c3..89d6a0bc48 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;
}