[PDF] Fix broken encoding conversion code for non-multibyte fonts.
Review URL: http://codereview.appspot.com/4245044
git-svn-id: http://skia.googlecode.com/svn/trunk@863 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index cf6a68e..d0f32ac 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -314,24 +314,21 @@
SkPaint textPaint = calculateTextPaint(paint);
updateGSFromPaint(textPaint, true);
- // Make sure we have a glyph id encoding.
- SkAutoFree glyphStorage;
- uint16_t* glyphIDs;
- size_t numGlyphs;
+ // We want the text in glyph id encoding and a writable buffer, so we end
+ // up making a copy either way.
+ size_t numGlyphs = paint.textToGlyphs(text, len, NULL);
+ uint16_t* glyphIDs =
+ (uint16_t*)sk_malloc_flags(numGlyphs * 2,
+ SK_MALLOC_TEMP | SK_MALLOC_THROW);
+ SkAutoFree autoFreeGlyphIDs(glyphIDs);
if (paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding) {
- numGlyphs = paint.textToGlyphs(text, len, NULL);
- glyphIDs = (uint16_t*)sk_malloc_flags(numGlyphs * 2,
- SK_MALLOC_TEMP | SK_MALLOC_THROW);
- glyphStorage.set(glyphIDs);
paint.textToGlyphs(text, len, glyphIDs);
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
} else {
SkASSERT((len & 1) == 0);
- numGlyphs = len / 2;
- glyphIDs = (uint16_t*)text;
+ SkASSERT(len / 2 == numGlyphs);
+ memcpy(glyphIDs, text, len);
}
- SkAutoFree encodedStorage(
- sk_malloc_flags(numGlyphs * 2, SK_MALLOC_TEMP | SK_MALLOC_THROW));
SkScalar width;
SkScalar* widthPtr = NULL;
@@ -346,16 +343,13 @@
while (numGlyphs > consumedGlyphCount) {
updateFont(textPaint, glyphIDs[consumedGlyphCount]);
SkPDFFont* font = fGraphicStack[fGraphicStackIndex].fFont;
- size_t encodedLength = numGlyphs * 2;
- consumedGlyphCount += font->glyphsToPDFFontEncoding(
- glyphIDs + consumedGlyphCount, numGlyphs - consumedGlyphCount,
- encodedStorage.get(), &encodedLength);
- if (font->multiByteGlyphs())
- encodedLength /= 2;
- fContent.append(
- SkPDFString::formatString((const uint16_t*)encodedStorage.get(),
- encodedLength,
- font->multiByteGlyphs()));
+ size_t availableGlyphs =
+ font->glyphsToPDFFontEncoding(glyphIDs + consumedGlyphCount,
+ numGlyphs - consumedGlyphCount);
+ fContent.append(SkPDFString::formatString(glyphIDs + consumedGlyphCount,
+ availableGlyphs,
+ font->multiByteGlyphs()));
+ consumedGlyphCount += availableGlyphs;
fContent.append(" Tj\n");
}
fContent.append("ET\n");
@@ -410,10 +404,8 @@
updateFont(textPaint, glyphIDs[0]);
for (size_t i = 0; i < numGlyphs; i++) {
SkPDFFont* font = fGraphicStack[fGraphicStackIndex].fFont;
- uint16_t encodedValue;
- size_t encodedLength = 2;
- if (font->glyphsToPDFFontEncoding(glyphIDs + i, 1, &encodedValue,
- &encodedLength) == 0) {
+ uint16_t encodedValue = glyphIDs[i];
+ if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) {
updateFont(textPaint, glyphIDs[i]);
i--;
continue;