On gpu, use max(r,g,b) for coverage alpha in LCD and update lcd blend gm.
authoregdaniel <egdaniel@google.com>
Tue, 15 Sep 2015 20:13:50 +0000 (13:13 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 15 Sep 2015 20:13:50 +0000 (13:13 -0700)
BUG=skia:

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

gm/lcdblendmodes.cpp
src/gpu/GrTextContext.cpp
src/gpu/effects/GrBitmapTextGeoProc.cpp
src/gpu/effects/GrDistanceFieldGeoProc.cpp

index a2494cc..a240534 100644 (file)
@@ -13,6 +13,7 @@
 #include "gm.h"
 #include "SkCanvas.h"
 #include "SkGradientShader.h"
+#include "SkSurface.h"
 
 namespace skiagm {
 
@@ -43,21 +44,44 @@ public:
     
 protected:
     SkString onShortName() override {
-        SkString name("lcdblendmodes");
-        name.append(sk_tool_utils::major_platform_os_name());
-        return name;
+        return SkString("lcdblendmodes");
+    }
+
+    void onOnceBeforeDraw() override {
+        fCheckerboard.reset(sk_tool_utils::create_checkerboard_shader(SK_ColorBLACK,
+                                                                      SK_ColorWHITE,
+                                                                      4));
     }
     
     SkISize onISize() override { return SkISize::Make(kWidth, kHeight); }
     
     void onDraw(SkCanvas* canvas) override {
-        this->drawColumn(canvas, SK_ColorBLACK, SK_ColorWHITE, false);
-        canvas->translate(SkIntToScalar(kColWidth), 0);
-        this->drawColumn(canvas, SK_ColorWHITE, SK_ColorBLACK, false);
-        canvas->translate(SkIntToScalar(kColWidth), 0);
-        this->drawColumn(canvas, SK_ColorGREEN, SK_ColorMAGENTA, false);
-        canvas->translate(SkIntToScalar(kColWidth), 0);
-        this->drawColumn(canvas, SK_ColorCYAN, SK_ColorMAGENTA, true);
+        SkPaint p;
+        p.setAntiAlias(false);
+        p.setStyle(SkPaint::kFill_Style);
+        p.setShader(fCheckerboard);
+        SkRect r = SkRect::MakeWH(SkIntToScalar(kWidth), SkIntToScalar(kHeight));
+        canvas->drawRect(r, p);
+
+        SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
+        SkAutoTUnref<SkSurface> surface(canvas->newSurface(info));
+        if (nullptr == surface) {
+            surface.reset(SkSurface::NewRaster(info));
+        }
+
+        SkCanvas* surfCanvas = surface->getCanvas();
+        this->drawColumn(surfCanvas, SK_ColorBLACK, SK_ColorWHITE, false);
+        surfCanvas->translate(SkIntToScalar(kColWidth), 0);
+        this->drawColumn(surfCanvas, SK_ColorWHITE, SK_ColorBLACK, false);
+        surfCanvas->translate(SkIntToScalar(kColWidth), 0);
+        this->drawColumn(surfCanvas, SK_ColorGREEN, SK_ColorMAGENTA, false);
+        surfCanvas->translate(SkIntToScalar(kColWidth), 0);
+        this->drawColumn(surfCanvas, SK_ColorCYAN, SK_ColorMAGENTA, true);
+
+        SkPaint surfPaint;
+        SkAutoTUnref<SkXfermode> xfermode(SkXfermode::Create(SkXfermode::kSrcOver_Mode));
+        surfPaint.setXfermode(xfermode);
+        surface->draw(canvas, 0, 0, &surfPaint);
     }
 
     void drawColumn(SkCanvas* canvas, SkColor backgroundColor, SkColor textColor, bool useGrad) {
@@ -124,6 +148,7 @@ protected:
     
 private:
     SkScalar fTextHeight;
+    SkAutoTUnref<SkShader> fCheckerboard;
     typedef skiagm::GM INHERITED;
 };
 
index be62619..6ab730c 100644 (file)
@@ -79,11 +79,9 @@ void GrTextContext::drawPosText(GrDrawContext* dc, GrRenderTarget* rt,
 }
 
 bool GrTextContext::ShouldDisableLCD(const SkPaint& paint) {
-    if (paint.getShader() ||
-        !SkXfermode::AsMode(paint.getXfermode(), nullptr) ||
+    if (!SkXfermode::AsMode(paint.getXfermode(), nullptr) ||
         paint.getMaskFilter() ||
         paint.getRasterizer() ||
-        paint.getColorFilter() ||
         paint.getPathEffect() ||
         paint.isFakeBoldText() ||
         paint.getStyle() != SkPaint::kFill_Style)
index e8bcd57..c866ae6 100644 (file)
@@ -69,6 +69,12 @@ public:
             fsBuilder->codeAppendf("%s = ", args.fOutputCoverage);
             fsBuilder->appendTextureLookup(args.fSamplers[0], v.fsIn(), kVec2f_GrSLType);
             fsBuilder->codeAppend(";");
+            if (cte.maskFormat() == kA565_GrMaskFormat) {
+                // set alpha to be max of rgb coverage
+                fsBuilder->codeAppendf("%s.a = max(max(%s.r, %s.g), %s.b);",
+                                       args.fOutputCoverage, args.fOutputCoverage,
+                                       args.fOutputCoverage, args.fOutputCoverage);
+            }
         }
     }
 
index 08fa5ac..4f8da16 100644 (file)
@@ -633,8 +633,10 @@ public:
 
         fsBuilder->codeAppend(
                       "vec4 val = vec4(smoothstep(vec3(-afwidth), vec3(afwidth), distance), 1.0);");
+        // set alpha to be max of rgb coverage
+        fsBuilder->codeAppend("val.a = max(max(val.r, val.g), val.b);");
 
-        fsBuilder->codeAppendf("%s = vec4(val);", args.fOutputCoverage);
+        fsBuilder->codeAppendf("%s = val;", args.fOutputCoverage);
     }
 
     void setData(const GrGLProgramDataManager& pdman,