Fix precision errors in large circle rendering.

BUG=skia:6044

Change-Id: I2ff2a80e1e6798ad18d1c8ec97e8b0fcc731e9af
Reviewed-on: https://skia-review.googlesource.com/6281
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Jim Van Verth <jvanverth@google.com>
This commit is contained in:
Jim Van Verth 2016-12-19 14:45:19 -05:00 committed by Skia Commit-Bot
parent 2410717f90
commit 6750e91544
2 changed files with 17 additions and 4 deletions

View File

@ -148,6 +148,17 @@ DEF_SIMPLE_GM(arccirclegap, canvas, 250, 250) {
canvas->drawPath(path, paint);
}
/* circle should be antialiased */
DEF_SIMPLE_GM(largecircle, canvas, 250, 250) {
canvas->translate(50, 100);
SkPoint c = { 1052.5390625f, 506.8760978034711f };
SkScalar radius = 1096.702150363923f;
SkPaint paint;
paint.setAntiAlias(true);
paint.setStyle(SkPaint::kStroke_Style);
canvas->drawCircle(c.fX, c.fY, radius, paint);
}
DEF_SIMPLE_GM(crbug_640176, canvas, 250, 250) {
SkPath path;
path.moveTo(SkBits2Float(0x00000000), SkBits2Float(0x00000000)); // 0, 0

View File

@ -82,7 +82,8 @@ public:
fInPosition = &this->addVertexAttrib("inPosition", kVec2f_GrVertexAttribType,
kHigh_GrSLPrecision);
fInColor = &this->addVertexAttrib("inColor", kVec4ub_GrVertexAttribType);
fInCircleEdge = &this->addVertexAttrib("inCircleEdge", kVec4f_GrVertexAttribType);
fInCircleEdge = &this->addVertexAttrib("inCircleEdge", kVec4f_GrVertexAttribType,
kHigh_GrSLPrecision);
if (clipPlane) {
fInClipPlane = &this->addVertexAttrib("inClipPlane", kVec3f_GrVertexAttribType);
} else {
@ -129,8 +130,9 @@ private:
// emit attributes
varyingHandler->emitAttributes(cgp);
fragBuilder->codeAppend("vec4 circleEdge;");
varyingHandler->addPassThroughAttribute(cgp.fInCircleEdge, "circleEdge");
fragBuilder->codeAppend("highp vec4 circleEdge;");
varyingHandler->addPassThroughAttribute(cgp.fInCircleEdge, "circleEdge",
kHigh_GrSLPrecision);
if (cgp.fInClipPlane) {
fragBuilder->codeAppend("vec3 clipPlane;");
varyingHandler->addPassThroughAttribute(cgp.fInClipPlane, "clipPlane");
@ -161,7 +163,7 @@ private:
cgp.fLocalMatrix,
args.fFPCoordTransformHandler);
fragBuilder->codeAppend("float d = length(circleEdge.xy);");
fragBuilder->codeAppend("highp float d = length(circleEdge.xy);");
fragBuilder->codeAppend("float distanceToOuterEdge = circleEdge.z * (1.0 - d);");
fragBuilder->codeAppend("float edgeAlpha = clamp(distanceToOuterEdge, 0.0, 1.0);");
if (cgp.fStroke) {