| Index: src/gpu/effects/GrConvexPolyEffect.cpp
|
| diff --git a/src/gpu/effects/GrConvexPolyEffect.cpp b/src/gpu/effects/GrConvexPolyEffect.cpp
|
| index 7035094fa6a57794c7a7f48b27747c18d2ffb613..d494bf2467715e77383b991f56cdf013f41e3133 100644
|
| --- a/src/gpu/effects/GrConvexPolyEffect.cpp
|
| +++ b/src/gpu/effects/GrConvexPolyEffect.cpp
|
| @@ -137,10 +137,14 @@ void GLAARectEffect::emitCode(GrGLFPBuilder* builder,
|
| fsBuilder->codeAppendf("\t\tfloat alpha = (1.0 + max(xSub, -1.0)) * (1.0 + max(ySub, -1.0));\n");
|
| } else {
|
| fsBuilder->codeAppendf("\t\tfloat alpha = 1.0;\n");
|
| - fsBuilder->codeAppendf("\t\talpha *= (%s.x - %s.x) > -0.5 ? 1.0 : 0.0;\n", fragmentPos, rectName);
|
| - fsBuilder->codeAppendf("\t\talpha *= (%s.z - %s.x) > -0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos);
|
| - fsBuilder->codeAppendf("\t\talpha *= (%s.y - %s.y) > -0.5 ? 1.0 : 0.0;\n", fragmentPos, rectName);
|
| - fsBuilder->codeAppendf("\t\talpha *= (%s.w - %s.y) > -0.5 ? 1.0 : 0.0;\n", rectName, fragmentPos);
|
| + fsBuilder->codeAppendf("\t\talpha *= (%s.x - %s.x) > -0.5 ? 1.0 : 0.0;\n",
|
| + fragmentPos, rectName);
|
| + fsBuilder->codeAppendf("\t\talpha *= (%s.z - %s.x) > -0.5 ? 1.0 : 0.0;\n",
|
| + rectName, fragmentPos);
|
| + fsBuilder->codeAppendf("\t\talpha *= (%s.y - %s.y) > -0.5 ? 1.0 : 0.0;\n",
|
| + fragmentPos, rectName);
|
| + fsBuilder->codeAppendf("\t\talpha *= (%s.w - %s.y) > -0.5 ? 1.0 : 0.0;\n",
|
| + rectName, fragmentPos);
|
| }
|
|
|
| if (GrProcessorEdgeTypeIsInverseFill(aare.getEdgeType())) {
|
| @@ -154,8 +158,10 @@ void GLAARectEffect::setData(const GrGLProgramDataManager& pdman, const GrProces
|
| const AARectEffect& aare = processor.cast<AARectEffect>();
|
| const SkRect& rect = aare.getRect();
|
| if (rect != fPrevRect) {
|
| - pdman.set4f(fRectUniform, rect.fLeft + 0.5f, rect.fTop + 0.5f,
|
| - rect.fRight - 0.5f, rect.fBottom - 0.5f);
|
| + // Add a device space "nudge" of 0.003f, 0.003f to match raster's rounding behavior for
|
| + // BW clipping/drawing
|
| + pdman.set4f(fRectUniform, rect.fLeft + 0.503f, rect.fTop + 0.503f,
|
| + rect.fRight - 0.497f, rect.fBottom - 0.497f);
|
| fPrevRect = rect;
|
| }
|
| }
|
| @@ -221,7 +227,10 @@ void GrGLConvexPolyEffect::emitCode(GrGLFPBuilder* builder,
|
| fsBuilder->codeAppend("\t\tfloat edge;\n");
|
| const char* fragmentPos = fsBuilder->fragmentPosition();
|
| for (int i = 0; i < cpe.getEdgeCount(); ++i) {
|
| - fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x, %s.y, 1));\n",
|
| + // Add a device space "nudge" of 0.003f, 0.003f to match raster's rounding behavior for
|
| + // BW clipping/drawing. Since we are "nudging" fragment positions we have to go in
|
| + // the opposite direction.
|
| + fsBuilder->codeAppendf("\t\tedge = dot(%s[%d], vec3(%s.x - 0.003, %s.y - 0.003, 1));\n",
|
| edgeArrayName, i, fragmentPos, fragmentPos);
|
| if (GrProcessorEdgeTypeIsAA(cpe.getEdgeType())) {
|
| fsBuilder->codeAppend("\t\tedge = clamp(edge, 0.0, 1.0);\n");
|
|
|