Put back the 0.5 bias in the shader. Only adjust the radii for the geometry, not the radii constants.

After working through this with Jim, this is more mathematically correct, and also accounts for the inner radius.

BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1692683003

Review URL: https://codereview.chromium.org/1692683003
This commit is contained in:
brianosman 2016-02-12 10:20:00 -08:00 committed by Commit bot
parent de8e54ccfd
commit c6052ac41a

View File

@ -297,7 +297,7 @@ public:
// avoid calling inversesqrt on zero. // avoid calling inversesqrt on zero.
fragBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); fragBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);");
fragBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); fragBuilder->codeAppend("float invlen = inversesqrt(grad_dot);");
fragBuilder->codeAppend("float edgeAlpha = clamp(-test*invlen, 0.0, 1.0);"); fragBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.0, 1.0);");
// for inner curve // for inner curve
if (ee.isStroked()) { if (ee.isStroked()) {
@ -1081,8 +1081,8 @@ static GrDrawBatch* create_ellipse_batch(GrColor color,
// We've extended the outer x radius out half a pixel to antialias. // We've extended the outer x radius out half a pixel to antialias.
// This will also expand the rect so all the pixels will be captured. // This will also expand the rect so all the pixels will be captured.
// TODO: Consider if we should use sqrt(2)/2 instead // TODO: Consider if we should use sqrt(2)/2 instead
xRadius += SK_ScalarHalf; SkScalar geoXRadius = xRadius + SK_ScalarHalf;
yRadius += SK_ScalarHalf; SkScalar geoYRadius = yRadius + SK_ScalarHalf;
EllipseBatch::Geometry geometry; EllipseBatch::Geometry geometry;
geometry.fViewMatrix = viewMatrix; geometry.fViewMatrix = viewMatrix;
@ -1092,8 +1092,8 @@ static GrDrawBatch* create_ellipse_batch(GrColor color,
geometry.fInnerXRadius = innerXRadius; geometry.fInnerXRadius = innerXRadius;
geometry.fInnerYRadius = innerYRadius; geometry.fInnerYRadius = innerYRadius;
geometry.fStroke = isStrokeOnly && innerXRadius > 0 && innerYRadius > 0; geometry.fStroke = isStrokeOnly && innerXRadius > 0 && innerYRadius > 0;
geometry.fDevBounds = SkRect::MakeLTRB(center.fX - xRadius, center.fY - yRadius, geometry.fDevBounds = SkRect::MakeLTRB(center.fX - geoXRadius, center.fY - geoYRadius,
center.fX + xRadius, center.fY + yRadius); center.fX + geoXRadius, center.fY + geoYRadius);
return EllipseBatch::Create(geometry); return EllipseBatch::Create(geometry);
} }