Index: src/pdf/SkPDFDevice.cpp |
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp |
index 6972f8b01f46e255f2ed5bc995948462bbdd04cb..92f190732f748a3cfaf3dc49bef18e1e9fd3e65f 100644 |
--- a/src/pdf/SkPDFDevice.cpp |
+++ b/src/pdf/SkPDFDevice.cpp |
@@ -78,38 +78,21 @@ static SkPaint calculate_text_paint(const SkPaint& paint) { |
} |
// Stolen from measure_text in SkDraw.cpp and then tweaked. |
-static void align_text(SkPaint::GlyphCacheProc glyphCacheProc, const SkPaint& paint, |
+static void align_text(const SkPaint& paint, |
const uint16_t* glyphs, size_t len, |
SkScalar* x, SkScalar* y) { |
if (paint.getTextAlign() == SkPaint::kLeft_Align) { |
return; |
} |
- |
- SkMatrix ident; |
- ident.reset(); |
- SkAutoGlyphCache autoCache(paint, nullptr, &ident); |
- SkGlyphCache* cache = autoCache.getCache(); |
- |
- const char* start = reinterpret_cast<const char*>(glyphs); |
- const char* stop = reinterpret_cast<const char*>(glyphs + len); |
- SkScalar xAdv = 0, yAdv = 0; |
- |
- // TODO(vandebo): This probably needs to take kerning into account. |
- while (start < stop) { |
- const SkGlyph& glyph = glyphCacheProc(cache, &start); |
- xAdv += SkFloatToScalar(glyph.fAdvanceX); |
- yAdv += SkFloatToScalar(glyph.fAdvanceY); |
- }; |
- if (paint.getTextAlign() == SkPaint::kLeft_Align) { |
- return; |
- } |
- |
+ SkScalar advance = paint.measureText(glyphs, len * sizeof(uint16_t)); |
if (paint.getTextAlign() == SkPaint::kCenter_Align) { |
- xAdv = SkScalarHalf(xAdv); |
- yAdv = SkScalarHalf(yAdv); |
+ advance *= 0.5f; |
+ } |
+ if (paint.isVerticalText()) { |
+ *y -= advance; |
+ } else { |
+ *x -= advance; |
} |
- *x = *x - xAdv; |
- *y = *y - yAdv; |
} |
static int max_glyphid_for_typeface(SkTypeface* typeface) { |
@@ -1214,10 +1197,7 @@ void SkPDFDevice::drawText(const SkDraw& d, const void* text, size_t len, |
int numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs); |
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
- SkPaint::GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(textPaint.getTextEncoding(), |
- textPaint.isDevKernText(), |
- true); |
- align_text(glyphCacheProc, textPaint, glyphIDs, numGlyphs, &x, &y); |
+ align_text(textPaint, glyphIDs, numGlyphs, &x, &y); |
content.entry()->fContent.writeText("BT\n"); |
set_text_transform(x, y, textPaint.getTextSkewX(), |
&content.entry()->fContent); |
@@ -1293,9 +1273,6 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
size_t numGlyphs = force_glyph_encoding(paint, text, len, &storage, &glyphIDs); |
textPaint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); |
- SkPaint::GlyphCacheProc glyphCacheProc = SkPaint::GetGlyphCacheProc(textPaint.getTextEncoding(), |
- textPaint.isDevKernText(), |
- true); |
content.entry()->fContent.writeText("BT\n"); |
this->updateFont(textPaint, glyphIDs[0], content.entry()); |
GlyphPositioner glyphPositioner(&content.entry()->fContent, |
@@ -1321,7 +1298,7 @@ void SkPDFDevice::drawPosText(const SkDraw& d, const void* text, size_t len, |
fontGlyphUsage->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); |
+ align_text(textPaint, glyphIDs + i, 1, &x, &y); |
SkScalar advanceWidth = textPaint.measureText(&encodedValue, sizeof(uint16_t)); |
glyphPositioner.writeGlyph(x, y, advanceWidth, encodedValue); |