| Index: src/core/SkDraw.cpp | 
| diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp | 
| index df73f7ae3795829c09e40349a8671d805dd19d6c..5c05fca0864946aad7444086b8b921a75eef1dcb 100644 | 
| --- a/src/core/SkDraw.cpp | 
| +++ b/src/core/SkDraw.cpp | 
| @@ -1680,10 +1680,30 @@ void SkDraw::drawText(const char text[], size_t byteLength, | 
|  | 
| SkDrawCacheProc glyphCacheProc = paint.getDrawCacheProc(); | 
|  | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +    const SkMatrix* ctm = fMatrix; | 
| +    const SkPaint* paintRef = &paint; | 
| +    SkPaint paintCopy; | 
| +    uint32_t procFlags = fProcs ? fProcs->fFlags : 0; | 
| +    if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { | 
| +        paintCopy = paint; | 
| +        paintCopy.setTextSize(SkDrawProcs::kBaseDFFontSize); | 
| +        paintCopy.setLCDRenderText(false); | 
| +        paintRef = &paintCopy; | 
| +    } | 
| +    if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { | 
| +        ctm = NULL; | 
| +    } | 
| +    SkAutoGlyphCache    autoCache(*paintRef, &fDevice->fLeakyProperties, ctm); | 
| +#else | 
| SkAutoGlyphCache    autoCache(paint, &fDevice->fLeakyProperties, fMatrix); | 
| +#endif | 
| SkGlyphCache*       cache = autoCache.getCache(); | 
|  | 
| // transform our starting point | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +    if (!(procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag)) | 
| +#endif | 
| { | 
| SkPoint loc; | 
| fMatrix->mapXY(x, y, &loc); | 
| @@ -1742,16 +1762,41 @@ void SkDraw::drawText(const char text[], size_t byteLength, | 
| SkFixed fx = SkScalarToFixed(x) + d1g.fHalfSampleX; | 
| SkFixed fy = SkScalarToFixed(y) + d1g.fHalfSampleY; | 
|  | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +    SkFixed fixedScale; | 
| +    if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { | 
| +        fixedScale = SkScalarToFixed(paint.getTextSize()/(float)SkDrawProcs::kBaseDFFontSize); | 
| +    } | 
| +#endif | 
| while (text < stop) { | 
| const SkGlyph& glyph = glyphCacheProc(cache, &text, fx & fxMask, fy & fyMask); | 
|  | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +        if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { | 
| +            fx += SkFixedMul_portable(autokern.adjust(glyph), fixedScale); | 
| +        } else { | 
| +            fx += autokern.adjust(glyph); | 
| +        } | 
| +#else | 
| fx += autokern.adjust(glyph); | 
| +#endif | 
|  | 
| if (glyph.fWidth) { | 
| proc(d1g, fx, fy, glyph); | 
| } | 
| + | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +        if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { | 
| +            fx += SkFixedMul_portable(glyph.fAdvanceX, fixedScale); | 
| +            fy += SkFixedMul_portable(glyph.fAdvanceY, fixedScale); | 
| +        } else { | 
| +            fx += glyph.fAdvanceX; | 
| +            fy += glyph.fAdvanceY; | 
| +        } | 
| +#else | 
| fx += glyph.fAdvanceX; | 
| fy += glyph.fAdvanceY; | 
| +#endif | 
| } | 
| } | 
|  | 
| @@ -1909,7 +1954,23 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, | 
| } | 
|  | 
| SkDrawCacheProc     glyphCacheProc = paint.getDrawCacheProc(); | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +    const SkMatrix* ctm = fMatrix; | 
| +    const SkPaint* paintRef = &paint; | 
| +    SkPaint paintCopy; | 
| +    uint32_t procFlags = fProcs ? fProcs->fFlags : 0; | 
| +    if (procFlags & SkDrawProcs::kUseScaledGlyphs_Flag) { | 
| +        paintCopy = paint; | 
| +        paintCopy.setTextSize(SkDrawProcs::kBaseDFFontSize); | 
| +        paintRef = &paintCopy; | 
| +    } | 
| +    if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { | 
| +        ctm = NULL; | 
| +    } | 
| +    SkAutoGlyphCache    autoCache(*paintRef, &fDevice->fLeakyProperties, ctm); | 
| +#else | 
| SkAutoGlyphCache    autoCache(paint, &fDevice->fLeakyProperties, fMatrix); | 
| +#endif | 
| SkGlyphCache*       cache = autoCache.getCache(); | 
|  | 
| SkAAClipBlitterWrapper wrapper; | 
| @@ -1951,8 +2012,16 @@ void SkDraw::drawPosText(const char text[], size_t byteLength, | 
|  | 
| if (SkPaint::kLeft_Align == paint.getTextAlign()) { | 
| while (text < stop) { | 
| +#if SK_DISTANCEFIELD_FONTS | 
| +                if (procFlags & SkDrawProcs::kSkipBakedGlyphTransform_Flag) { | 
| +                    tms.fLoc.fX = *pos; | 
| +                    tms.fLoc.fY = *(pos+1); | 
| +                } else { | 
| +                    tmsProc(tms, pos); | 
| +                } | 
| +#else | 
| tmsProc(tms, pos); | 
| - | 
| +#endif | 
| SkFixed fx = SkScalarToFixed(tms.fLoc.fX) + d1g.fHalfSampleX; | 
| SkFixed fy = SkScalarToFixed(tms.fLoc.fY) + d1g.fHalfSampleY; | 
|  | 
|  |