aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2015-09-15 13:13:50 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-09-15 13:13:50 -0700
commit27b6335c71bccb96206ff0495793433bfa982777 (patch)
tree750282c33f8c895c0282bee6393943efbee51c60
parentfb1e2fc8aa25b8c2ef0714c27cfcb1ee0f8f806b (diff)
On gpu, use max(r,g,b) for coverage alpha in LCD and update lcd blend gm.
-rw-r--r--gm/lcdblendmodes.cpp45
-rw-r--r--src/gpu/GrTextContext.cpp4
-rw-r--r--src/gpu/effects/GrBitmapTextGeoProc.cpp6
-rw-r--r--src/gpu/effects/GrDistanceFieldGeoProc.cpp4
4 files changed, 45 insertions, 14 deletions
diff --git a/gm/lcdblendmodes.cpp b/gm/lcdblendmodes.cpp
index a2494cc343..a2405349eb 100644
--- a/gm/lcdblendmodes.cpp
+++ b/gm/lcdblendmodes.cpp
@@ -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;
};
diff --git a/src/gpu/GrTextContext.cpp b/src/gpu/GrTextContext.cpp
index be62619783..6ab730cdfa 100644
--- a/src/gpu/GrTextContext.cpp
+++ b/src/gpu/GrTextContext.cpp
@@ -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)
diff --git a/src/gpu/effects/GrBitmapTextGeoProc.cpp b/src/gpu/effects/GrBitmapTextGeoProc.cpp
index e8bcd57e6d..c866ae6ca5 100644
--- a/src/gpu/effects/GrBitmapTextGeoProc.cpp
+++ b/src/gpu/effects/GrBitmapTextGeoProc.cpp
@@ -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);
+ }
}
}
diff --git a/src/gpu/effects/GrDistanceFieldGeoProc.cpp b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
index 08fa5ac6d5..4f8da160e7 100644
--- a/src/gpu/effects/GrDistanceFieldGeoProc.cpp
+++ b/src/gpu/effects/GrDistanceFieldGeoProc.cpp
@@ -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,