Move distance field font code into GrDistanceFieldTextContext.

This avoids the SkDraw path and renders the distance field glyphs directly from
GrDistanceFieldTextContext. It also disables LCD, subpixel and autohinting, and
removes the supporting code when rendering DF fonts.

R=reed@google.com, bsalomon@google.com, robertphillips@google.com

Author: jvanverth@google.com

Review URL: https://codereview.chromium.org/85653004

git-svn-id: http://skia.googlecode.com/svn/trunk@12770 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 71d0ebf..fe036fe 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -1751,9 +1751,6 @@
         fDrawProcs = SkNEW(GrSkDrawProcs);
         fDrawProcs->fD1GProc = SkGPU_Draw1Glyph;
         fDrawProcs->fContext = fContext;
-#if SK_DISTANCEFIELD_FONTS
-        fDrawProcs->fFlags = 0;
-#endif
     }
 
     // init our (and GL's) state
@@ -1767,9 +1764,25 @@
                           const SkPaint& paint) {
     CHECK_SHOULD_DRAW(draw, false);
 
-    if (fContext->getMatrix().hasPerspective()) {
-        // this guy will just call our drawPath()
-        draw.drawText((const char*)text, byteLength, x, y, paint);
+    if (SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix())) {
+        draw.drawText_asPaths((const char*)text, byteLength, x, y, paint);
+#if SK_DISTANCEFIELD_FONTS
+    } else if (!paint.getRasterizer()) {
+        GrPaint grPaint;
+        if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
+            return;
+        }
+
+        SkDEBUGCODE(this->validate();)
+
+        GrDistanceFieldTextContext context(fContext, grPaint, paint);
+
+        SkAutoGlyphCache    autoCache(context.getSkPaint(), &this->fLeakyProperties, NULL);
+        SkGlyphCache*       cache = autoCache.getCache();
+        GrFontScaler*       fontScaler = get_gr_font_scaler(cache);
+
+        context.drawText((const char *)text, byteLength, x, y, cache, fontScaler);
+#endif
     } else {
         SkDraw myDraw(draw);
 
@@ -1777,23 +1790,10 @@
         if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
             return;
         }
-#if SK_DISTANCEFIELD_FONTS
-        if (paint.getRasterizer()) {
-#endif
-            GrBitmapTextContext context(fContext, grPaint, paint.getColor());
-            myDraw.fProcs = this->initDrawForText(&context);
-            this->INHERITED::drawText(myDraw, text, byteLength, x, y, paint);
-#if SK_DISTANCEFIELD_FONTS
-        } else {
-            GrDistanceFieldTextContext context(fContext, grPaint, paint.getColor(),
-                                               paint.getTextSize()/SkDrawProcs::kBaseDFFontSize);
-            myDraw.fProcs = this->initDrawForText(&context);
-            fDrawProcs->fFlags |= SkDrawProcs::kSkipBakedGlyphTransform_Flag;
-            fDrawProcs->fFlags |= SkDrawProcs::kUseScaledGlyphs_Flag;
-            this->INHERITED::drawText(myDraw, text, byteLength, x, y, paint);
-            fDrawProcs->fFlags = 0;
-       }
-#endif
+
+        GrBitmapTextContext context(fContext, grPaint, paint.getColor());
+        myDraw.fProcs = this->initDrawForText(&context);
+        this->INHERITED::drawText(myDraw, text, byteLength, x, y, paint);
     }
 }
 
@@ -1803,10 +1803,28 @@
                              const SkPaint& paint) {
     CHECK_SHOULD_DRAW(draw, false);
 
-    if (fContext->getMatrix().hasPerspective()) {
+    if (SkDraw::ShouldDrawTextAsPaths(paint, fContext->getMatrix())) {
         // this guy will just call our drawPath()
-        draw.drawPosText((const char*)text, byteLength, pos, constY,
+        draw.drawPosText_asPaths((const char*)text, byteLength, pos, constY,
                          scalarsPerPos, paint);
+#if SK_DISTANCEFIELD_FONTS
+    } else if (!paint.getRasterizer()) {
+        GrPaint grPaint;
+        if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
+            return;
+        }
+
+        SkDEBUGCODE(this->validate();)
+
+        GrDistanceFieldTextContext context(fContext, grPaint, paint);
+
+        SkAutoGlyphCache    autoCache(context.getSkPaint(), &this->fLeakyProperties, NULL);
+        SkGlyphCache*       cache = autoCache.getCache();
+        GrFontScaler*       fontScaler = get_gr_font_scaler(cache);
+        
+        context.drawPosText((const char *)text, byteLength, pos, constY, scalarsPerPos,
+                            cache, fontScaler);
+#endif
     } else {
         SkDraw myDraw(draw);
 
@@ -1814,25 +1832,10 @@
         if (!skPaint2GrPaintShader(this, paint, true, &grPaint)) {
             return;
         }
-#if SK_DISTANCEFIELD_FONTS
-        if (paint.getRasterizer()) {
-#endif
-            GrBitmapTextContext context(fContext, grPaint, paint.getColor());
-            myDraw.fProcs = this->initDrawForText(&context);
-            this->INHERITED::drawPosText(myDraw, text, byteLength, pos, constY,
-                                         scalarsPerPos, paint);
-#if SK_DISTANCEFIELD_FONTS
-        } else {
-            GrDistanceFieldTextContext context(fContext, grPaint, paint.getColor(),
-                                               paint.getTextSize()/SkDrawProcs::kBaseDFFontSize);
-            myDraw.fProcs = this->initDrawForText(&context);
-            fDrawProcs->fFlags |= SkDrawProcs::kSkipBakedGlyphTransform_Flag;
-            fDrawProcs->fFlags |= SkDrawProcs::kUseScaledGlyphs_Flag;
-            this->INHERITED::drawPosText(myDraw, text, byteLength, pos, constY,
-                                         scalarsPerPos, paint);
-            fDrawProcs->fFlags = 0;
-        }
-#endif
+        GrBitmapTextContext context(fContext, grPaint, paint.getColor());
+        myDraw.fProcs = this->initDrawForText(&context);
+        this->INHERITED::drawPosText(myDraw, text, byteLength, pos, constY,
+                                        scalarsPerPos, paint);
     }
 }