Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(919)

Unified Diff: src/pdf/SkPDFDevice.cpp

Issue 1064013003: SkPDF: SkPDFString is no longer aware of wide strings. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: optimize SkPDFString::FormatString, stop appending everywhere Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/pdf/SkPDFTypes.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/pdf/SkPDFDevice.cpp
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index ced075ebf932fb2713e88ff9254a19f3db0c997b..f624cb49f97b7bce0096ccb127663e091923b9a3 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -1051,6 +1051,41 @@ void SkPDFDevice::drawSprite(const SkDraw& d, const SkBitmap& bitmap,
paint);
}
+// Create a PDF string. Maximum length (in bytes) is 65,535.
+// @param input A string value.
+// @param len The length of the input array.
+// @param wideChars True iff the upper byte in each uint16_t is
+// significant and should be encoded and not
+// discarded. If true, the upper byte is encoded
+// first. Otherwise, we assert the upper byte is
+// zero.
+static SkString format_wide_string(const uint16_t* input,
+ size_t len,
+ bool wideChars) {
+ if (wideChars) {
+ SkASSERT(2 * len < 65535);
+ static const char gHex[] = "0123456789ABCDEF";
+ SkString result(4 * len + 2);
+ result[0] = '<';
+ for (size_t i = 0; i < len; i++) {
+ result[4 * i + 1] = gHex[(input[i] >> 12) & 0xF];
+ result[4 * i + 2] = gHex[(input[i] >> 8) & 0xF];
+ result[4 * i + 3] = gHex[(input[i] >> 4) & 0xF];
+ result[4 * i + 4] = gHex[(input[i] ) & 0xF];
+ }
+ result[4 * len + 1] = '>';
+ return result;
+ } else {
+ SkASSERT(len <= 65535);
+ SkString tmp(len);
+ for (size_t i = 0; i < len; i++) {
+ SkASSERT(0 == input[i] >> 8);
+ tmp[i] = static_cast<uint8_t>(input[i]);
+ }
+ return SkPDFString::FormatString(tmp.c_str(), tmp.size());
+ }
+}
+
void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len,
SkScalar x, SkScalar y, const SkPaint& paint) {
NOT_IMPLEMENTED(paint.getMaskFilter() != NULL, false);
@@ -1090,8 +1125,8 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len,
font, glyphIDsCopy.begin() + consumedGlyphCount,
availableGlyphs);
SkString encodedString =
- SkPDFString::FormatString(glyphIDsCopy.begin() + consumedGlyphCount,
- availableGlyphs, font->multiByteGlyphs());
+ format_wide_string(glyphIDsCopy.begin() + consumedGlyphCount,
+ availableGlyphs, font->multiByteGlyphs());
content.entry()->fContent.writeText(encodedString.c_str());
consumedGlyphCount += availableGlyphs;
content.entry()->fContent.writeText(" Tj\n");
@@ -1144,7 +1179,7 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len,
align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y);
set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fContent);
SkString encodedString =
- SkPDFString::FormatString(&encodedValue, 1, font->multiByteGlyphs());
+ format_wide_string(&encodedValue, 1, font->multiByteGlyphs());
content.entry()->fContent.writeText(encodedString.c_str());
content.entry()->fContent.writeText(" Tj\n");
}
« no previous file with comments | « no previous file | src/pdf/SkPDFTypes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698