diff options
author | robertphillips <robertphillips@google.com> | 2016-10-03 08:41:04 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-10-03 08:41:04 -0700 |
commit | 6df2c8e8e030a3be9b3c1bb0436bb39d632df007 (patch) | |
tree | 0dbaca0de7a9bc74695e5677d5e1bec17ff2a5eb /src/effects | |
parent | 497630a2af7569d4c6c0f6df0b232f5e0196a8a5 (diff) |
Fix precision issues in SkRRectsGaussianEdgeShader.cpp
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2383863002
Review-Url: https://codereview.chromium.org/2383863002
Diffstat (limited to 'src/effects')
-rw-r--r-- | src/effects/SkRRectsGaussianEdgeShader.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/effects/SkRRectsGaussianEdgeShader.cpp b/src/effects/SkRRectsGaussianEdgeShader.cpp index 25c57cdcd9..e7703f964a 100644 --- a/src/effects/SkRRectsGaussianEdgeShader.cpp +++ b/src/effects/SkRRectsGaussianEdgeShader.cpp @@ -117,7 +117,11 @@ public: switch (mode) { case kCircle_Mode: - fragBuilder->codeAppendf("%s = clamp((%s.%c - length(delta))/%s, 0.0, 1.0);", + // When a shadow circle gets large we can have some precision issues if + // we do "length(delta)/radius". The scaleDist temporary cuts the + // delta vector down a bit before invoking length. + fragBuilder->codeAppendf("float scaledDist = length(delta/%s);", radName); + fragBuilder->codeAppendf("%s = clamp((%s.%c/%s - scaledDist), 0.0, 1.0);", outputName, sizesName, indices[0], radName); break; case kRect_Mode: @@ -136,7 +140,7 @@ public: // distance from the corner and then use the multiplier to mask // between the two distances. fragBuilder->codeAppendf("float xDist = clamp((%s.%c - abs(delta.x))/%s," - " 0.0, 1.0);", + "0.0, 1.0);", sizesName, indices[0], radName); fragBuilder->codeAppendf("float yDist = clamp((%s.%c - abs(delta.y))/%s," "0.0, 1.0);", |