Index: src/pdf/SkPDFDevice.cpp |
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
index bd9b1d7f7e79ae93ca1f6d66fda0053a15e7b27d..564fdc212393b82b6a5700ce9c3622abb7ca157b 100644 |
--- a/src/pdf/SkPDFDevice.cpp |
+++ b/src/pdf/SkPDFDevice.cpp |
@@ -118,7 +118,7 @@ typedef SkAutoSTMalloc<128, uint16_t> SkGlyphStorage; |
static int force_glyph_encoding(const SkPaint& paint, const void* text, |
size_t len, SkGlyphStorage* storage, |
- uint16_t** glyphIDs) { |
+ const uint16_t** glyphIDs) { |
// Make sure we have a glyph id encoding. |
if (paint.getTextEncoding() != SkPaint::kGlyphID_TextEncoding) { |
int numGlyphs = paint.textToGlyphs(text, len, NULL); |
@@ -131,8 +131,7 @@ static int force_glyph_encoding(const SkPaint& paint, const void* text, |
// For user supplied glyph ids we need to validate them. |
SkASSERT((len & 1) == 0); |
int numGlyphs = SkToInt(len / 2); |
- const uint16_t* input = |
- reinterpret_cast<uint16_t*>(const_cast<void*>((text))); |
+ const uint16_t* input = static_cast<const uint16_t*>(text); |
int maxGlyphID = max_glyphid_for_typeface(paint.getTypeface()); |
int validated; |
@@ -142,7 +141,7 @@ static int force_glyph_encoding(const SkPaint& paint, const void* text, |
} |
} |
if (validated >= numGlyphs) { |
- *glyphIDs = reinterpret_cast<uint16_t*>(const_cast<void*>((text))); |
+ *glyphIDs = static_cast<const uint16_t*>(text); |
return numGlyphs; |
} |
@@ -1115,7 +1114,7 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
} |
SkGlyphStorage storage(0); |
- uint16_t* glyphIDs = NULL; |
+ const uint16_t* glyphIDs = NULL; |
int numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs); |
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
@@ -1128,8 +1127,9 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
while (numGlyphs > consumedGlyphCount) { |
updateFont(textPaint, glyphIDs[consumedGlyphCount], content.entry()); |
SkPDFFont* font = content.entry()->fState.fFont; |
+ //TODO: the const_cast here is a bug if the encoding started out as glyph encoding. |
int availableGlyphs = |
- font->glyphsToPDFFontEncoding(glyphIDs + consumedGlyphCount, |
+ font->glyphsToPDFFontEncoding(const_cast<uint16_t*>(glyphIDs) + consumedGlyphCount, |
numGlyphs - consumedGlyphCount); |
fFontGlyphUsage->noteGlyphUsage(font, glyphIDs + consumedGlyphCount, |
availableGlyphs); |
@@ -1160,9 +1160,8 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
} |
SkGlyphStorage storage(0); |
- uint16_t* glyphIDs = NULL; |
- size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage, |
- &glyphIDs); |
+ const uint16_t* glyphIDs = NULL; |
+ size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs); |
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
SkDrawCacheProc glyphCacheProc = textPaint.getDrawCacheProc(); |
@@ -1172,20 +1171,24 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
SkPDFFont* font = content.entry()->fState.fFont; |
uint16_t encodedValue = glyphIDs[i]; |
if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) { |
+ // The current pdf font cannot encode the current glyph. |
+ // Try to get a pdf font which can encode the current glyph. |
updateFont(textPaint, glyphIDs[i], content.entry()); |
- i--; |
- continue; |
+ font = content.entry()->fState.fFont; |
+ if (font->glyphsToPDFFontEncoding(&encodedValue, 1) != 1) { |
+ SkDEBUGFAIL("PDF could not encode glyph."); |
+ continue; |
+ } |
} |
+ |
fFontGlyphUsage->noteGlyphUsage(font, &encodedValue, 1); |
SkScalar x = offset.x() + pos[i * scalarsPerPos]; |
SkScalar y = offset.y() + (2 == scalarsPerPos ? pos[i * scalarsPerPos + 1] : 0); |
align_text(glyphCacheProc, textPaint, glyphIDs + i, 1, &x, &y); |
- set_text_transform(x, y, textPaint.getTextSkewX(), |
- &content.entry()->fContent); |
+ set_text_transform(x, y, textPaint.getTextSkewX(), &content.entry()->fContent); |
SkString encodedString = |
- SkPDFString::FormatString(&encodedValue, 1, |
- font->multiByteGlyphs()); |
+ SkPDFString::FormatString(&encodedValue, 1, font->multiByteGlyphs()); |
content.entry()->fContent.writeText(encodedString.c_str()); |
content.entry()->fContent.writeText(" Tj\n"); |
} |