Use distance fields for glyphs > 256 pt, before switching to paths.
authorjvanverth <jvanverth@google.com>
Wed, 28 Jan 2015 21:08:40 +0000 (13:08 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 28 Jan 2015 21:08:41 +0000 (13:08 -0800)
BUG=452313

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

src/gpu/GrDistanceFieldTextContext.cpp

index 820223d..41c2844 100755 (executable)
@@ -33,9 +33,9 @@ SK_CONF_DECLARE(bool, c_DumpFontCache, "gpu.dumpFontCache", false,
 
 static const int kSmallDFFontSize = 32;
 static const int kSmallDFFontLimit = 32;
-static const int kMediumDFFontSize = 64;
-static const int kMediumDFFontLimit = 64;
-static const int kLargeDFFontSize = 128;
+static const int kMediumDFFontSize = 78;
+static const int kMediumDFFontLimit = 78;
+static const int kLargeDFFontSize = 192;
 
 static const int kVerticesPerGlyph = 4;
 static const int kIndicesPerGlyph = 6;
@@ -80,7 +80,20 @@ GrDistanceFieldTextContext::~GrDistanceFieldTextContext() {
 }
 
 bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint, const SkMatrix& viewMatrix) {
-    if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP()) {
+    // TODO: support perspective (need getMaxScale replacement)
+    if (viewMatrix.hasPerspective()) {
+        return false;
+    }
+
+    SkScalar maxScale = viewMatrix.getMaxScale();
+    SkScalar scaledTextSize = maxScale*paint.getTextSize();
+    // Scaling up beyond 2x yields undesireable artifacts
+    if (scaledTextSize > 2*kLargeDFFontSize) {
+        return false;
+    }
+
+    if (!fEnableDFRendering && !paint.isDistanceFieldTextTEMP() &&
+        scaledTextSize < kLargeDFFontSize) {
         return false;
     }
 
@@ -96,12 +109,6 @@ bool GrDistanceFieldTextContext::canDraw(const SkPaint& paint, const SkMatrix& v
         return false;
     }
 
-    // TODO: choose an appropriate maximum scale for distance fields and
-    //       enable perspective
-    if (SkDraw::ShouldDrawTextAsPaths(paint, viewMatrix)) {
-        return false;
-    }
-
     return true;
 }