Improve quality of distance field rendering
authorjvanverth <jvanverth@google.com>
Mon, 3 Nov 2014 22:00:24 +0000 (14:00 -0800)
committerCommit bot <commit-bot@chromium.org>
Mon, 3 Nov 2014 22:00:24 +0000 (14:00 -0800)
- Update spacing of LODs to get better results scaling up to 256
- Remove unnecessary "bolding" from dftext
- Add debug colors for dftext LODs

BUG=skia:2933,skia:2935

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

expectations/gm/ignored-tests.txt
src/gpu/GrAADistanceFieldPathRenderer.cpp
src/gpu/GrDistanceFieldTextContext.cpp
src/gpu/effects/GrDistanceFieldTextureEffect.cpp

index c28566e..7e8077f 100644 (file)
@@ -66,3 +66,13 @@ multipicturedraw_sierpinski_tiled
 
 #joshualitt
 texture_domain_effect
+
+#jvanverth https://codereview.chromium.org/703463002
+dftext
+nested_aa
+path-reverse
+pathfill
+polygons
+pathopsinverse
+rects
+
index fdd0f68..cb0c892 100755 (executable)
@@ -37,8 +37,8 @@ static int g_NumFreedPaths = 0;
 
 // mip levels
 static const int kSmallMIP = 32;
-static const int kMediumMIP = 64;
-static const int kLargeMIP = 128;
+static const int kMediumMIP = 78;
+static const int kLargeMIP = 192;
 
 ////////////////////////////////////////////////////////////////////////////////
 GrAADistanceFieldPathRenderer::GrAADistanceFieldPathRenderer(GrContext* context)
index 6ffa3c3..5c9019b 100755 (executable)
@@ -34,9 +34,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;
 
 namespace {
 // position + texture coord
@@ -153,12 +153,24 @@ inline void GrDistanceFieldTextContext::init(const GrPaint& paint, const SkPaint
     if (scaledTextSize <= kSmallDFFontLimit) {
         fTextRatio = textSize / kSmallDFFontSize;
         fSkPaint.setTextSize(SkIntToScalar(kSmallDFFontSize));
+#if DEBUG_TEXT_SIZE
+        fSkPaint.setColor(SkColorSetARGB(0xFF, 0x00, 0x00, 0xFF));
+        fPaint.setColor(GrColorPackRGBA(0x00, 0x00, 0xFF, 0xFF));
+#endif
     } else if (scaledTextSize <= kMediumDFFontLimit) {
         fTextRatio = textSize / kMediumDFFontSize;
         fSkPaint.setTextSize(SkIntToScalar(kMediumDFFontSize));
+#if DEBUG_TEXT_SIZE
+        fSkPaint.setColor(SkColorSetARGB(0xFF, 0x00, 0xFF, 0x00));
+        fPaint.setColor(GrColorPackRGBA(0x00, 0xFF, 0x00, 0xFF));
+#endif
     } else {
         fTextRatio = textSize / kLargeDFFontSize;
         fSkPaint.setTextSize(SkIntToScalar(kLargeDFFontSize));
+#if DEBUG_TEXT_SIZE
+        fSkPaint.setColor(SkColorSetARGB(0xFF, 0xFF, 0x00, 0x00));
+        fPaint.setColor(GrColorPackRGBA(0xFF, 0x00, 0x00, 0xFF));
+#endif
     }
 
     fUseLCDText = fSkPaint.isLCDRenderText();
index e90ebfb..b977698 100755 (executable)
 
 #include "SkDistanceFieldGen.h"
 
-// To get optical sizes people don't complain about when we blit correctly,
-// we need to slightly bold each glyph. On the Mac, we need a larger bold value.
-#if defined(SK_BUILD_FOR_MAC)
-#define SK_DistanceFieldLCDFactor    "0.33"
-#define SK_DistanceFieldNonLCDFactor "0.25"
-#else
-#define SK_DistanceFieldLCDFactor    "0.05"
-#define SK_DistanceFieldNonLCDFactor "0.05"
-#endif
-
 // Assuming a radius of the diagonal of the fragment, hence a factor of sqrt(2)/2
 #define SK_DistanceFieldAAFactor     "0.7071"
 
@@ -66,8 +56,7 @@ public:
                                        kVec2f_GrSLType);
         fsBuilder->codeAppend(";\n");
         fsBuilder->codeAppend("\tfloat distance = "
-                          SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThreshold ")"
-                          "+ " SK_DistanceFieldNonLCDFactor ";\n");
+                       SK_DistanceFieldMultiplier "*(texColor.r - " SK_DistanceFieldThreshold ");");
 
         // we adjust for the effect of the transformation on the distance by using
         // the length of the gradient of the texture coordinates. We use st coordinates
@@ -465,8 +454,7 @@ public:
         fsBuilder->codeAppend("\tdistance.z = texColor.r;\n");
 
         fsBuilder->codeAppend("\tdistance = "
-            "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceFieldThreshold"))"
-            "+ vec3(" SK_DistanceFieldLCDFactor ");\n");
+           "vec3(" SK_DistanceFieldMultiplier ")*(distance - vec3(" SK_DistanceFieldThreshold"));");
 
         // we adjust for the effect of the transformation on the distance by using
         // the length of the gradient of the texture coordinates. We use st coordinates