| Index: src/core/SkDraw.cpp | 
| diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp | 
| index 4be510c2c7c207394a11918c3f765b1cd7a6731b..ca84e629eeaf81a5d06e564f501180acb13bd55d 100644 | 
| --- a/src/core/SkDraw.cpp | 
| +++ b/src/core/SkDraw.cpp | 
| @@ -34,7 +34,6 @@ | 
| #include "SkUtils.h" | 
| #include "SkVertState.h" | 
|  | 
| -#include "SkAutoKern.h" | 
| #include "SkBitmapProcShader.h" | 
| #include "SkDrawProcs.h" | 
| #include "SkMatrixUtils.h" | 
| @@ -53,7 +52,7 @@ public: | 
| const SkPaint& paint, bool drawCoverage = false) { | 
| fBlitter = SkBlitter::Choose(dst, matrix, paint, &fAllocator, drawCoverage); | 
| } | 
| - | 
| + | 
| SkBlitter*  operator->() { return fBlitter; } | 
| SkBlitter*  get() const { return fBlitter; } | 
|  | 
| @@ -1374,26 +1373,6 @@ void SkDraw::drawSprite(const SkBitmap& bitmap, int x, int y, const SkPaint& ori | 
| #include "SkTextToPathIter.h" | 
| #include "SkUtils.h" | 
|  | 
| -static void measure_text(SkGlyphCache* cache, SkDrawCacheProc glyphCacheProc, | 
| -                const char text[], size_t byteLength, SkVector* stopVector) { | 
| -    SkFixed     x = 0, y = 0; | 
| -    const char* stop = text + byteLength; | 
| - | 
| -    SkAutoKern  autokern; | 
| - | 
| -    while (text < stop) { | 
| -        // don't need x, y here, since all subpixel variants will have the | 
| -        // same advance | 
| -        const SkGlyph& glyph = glyphCacheProc(cache, &text, 0, 0); | 
| - | 
| -        x += autokern.adjust(glyph) + glyph.fAdvanceX; | 
| -        y += glyph.fAdvanceY; | 
| -    } | 
| -    stopVector->set(SkFixedToScalar(x), SkFixedToScalar(y)); | 
| - | 
| -    SkASSERT(text == stop); | 
| -} | 
| - | 
| bool SkDraw::ShouldDrawTextAsPaths(const SkPaint& paint, const SkMatrix& ctm) { | 
| // hairline glyphs are fast enough so we don't need to cache them | 
| if (SkPaint::kStroke_Style == paint.getStyle() && 0 == paint.getStrokeWidth()) { | 
| @@ -1601,38 +1580,10 @@ void SkDraw::drawText(const char text[], size_t byteLength, | 
| return; | 
| } | 
|  | 
| -    SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); | 
| - | 
| +    SkDrawCacheProc     glyphCacheProc = paint.getDrawCacheProc(); | 
| SkAutoGlyphCache    autoCache(paint, &fDevice->surfaceProps(), fMatrix); | 
| SkGlyphCache*       cache = autoCache.getCache(); | 
|  | 
| -    // transform our starting point | 
| -    { | 
| -        SkPoint loc; | 
| -        fMatrix->mapXY(x, y, &loc); | 
| -        x = loc.fX; | 
| -        y = loc.fY; | 
| -    } | 
| - | 
| -    // need to measure first | 
| -    if (paint.getTextAlign() != SkPaint::kLeft_Align) { | 
| -        SkVector    stop; | 
| - | 
| -        measure_text(cache, glyphCacheProc, text, byteLength, &stop); | 
| - | 
| -        SkScalar    stopX = stop.fX; | 
| -        SkScalar    stopY = stop.fY; | 
| - | 
| -        if (paint.getTextAlign() == SkPaint::kCenter_Align) { | 
| -            stopX = SkScalarHalf(stopX); | 
| -            stopY = SkScalarHalf(stopY); | 
| -        } | 
| -        x -= stopX; | 
| -        y -= stopY; | 
| -    } | 
| - | 
| -    const char* stop = text + byteLength; | 
| - | 
| SkAAClipBlitter     aaBlitter; | 
| SkAutoBlitterChoose blitterChooser; | 
| SkBlitter*          blitter = nullptr; | 
| @@ -1645,38 +1596,16 @@ void SkDraw::drawText(const char text[], size_t byteLength, | 
| } | 
| } | 
|  | 
| -    SkAutoKern          autokern; | 
| SkDraw1Glyph        d1g; | 
| SkDraw1Glyph::Proc  proc = d1g.init(this, blitter, cache, paint); | 
|  | 
| -    SkFixed fxMask = ~0; | 
| -    SkFixed fyMask = ~0; | 
| -    if (cache->isSubpixel()) { | 
| -        SkAxisAlignment baseline = SkComputeAxisAlignmentForHText(*fMatrix); | 
| -        if (kX_SkAxisAlignment == baseline) { | 
| -            fyMask = 0; | 
| -            d1g.fHalfSampleY = SK_ScalarHalf; | 
| -        } else if (kY_SkAxisAlignment == baseline) { | 
| -            fxMask = 0; | 
| -            d1g.fHalfSampleX = SK_ScalarHalf; | 
| -        } | 
| -    } | 
| - | 
| -    Sk48Dot16 fx = SkScalarTo48Dot16(x + d1g.fHalfSampleX); | 
| -    Sk48Dot16 fy = SkScalarTo48Dot16(y + d1g.fHalfSampleY); | 
| - | 
| -    while (text < stop) { | 
| -        const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fyMask); | 
| - | 
| -        fx += autokern.adjust(glyph); | 
| - | 
| -        if (glyph.fWidth) { | 
| -            proc(d1g, fx, fy, glyph); | 
| +    SkFindAndPlaceGlyph::ProcessText( | 
| +        text, byteLength, {x, y}, *fMatrix, paint.getTextAlign(), glyphCacheProc, cache, | 
| +        [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) { | 
| +            position += rounding; | 
| +            proc(d1g, SkScalarTo48Dot16(position.fX), SkScalarTo48Dot16(position.fY), glyph); | 
| } | 
| - | 
| -        fx += glyph.fAdvanceX; | 
| -        fy += glyph.fAdvanceY; | 
| -    } | 
| +    ); | 
| } | 
|  | 
| ////////////////////////////////////////////////////////////////////////////// | 
| @@ -1773,7 +1702,7 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, | 
| textAlignment, glyphCacheProc, cache, | 
| [&](const SkGlyph& glyph, SkPoint position, SkPoint rounding) { | 
| position += rounding; | 
| -            proc(d1g, SkScalarToFixed(position.fX), SkScalarToFixed(position.fY), glyph); | 
| +            proc(d1g, SkScalarTo48Dot16(position.fX), SkScalarTo48Dot16(position.fY), glyph); | 
| } | 
| ); | 
| } | 
|  |