aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2016-10-03 08:41:04 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-10-03 08:41:04 -0700
commit6df2c8e8e030a3be9b3c1bb0436bb39d632df007 (patch)
tree0dbaca0de7a9bc74695e5677d5e1bec17ff2a5eb /src/effects
parent497630a2af7569d4c6c0f6df0b232f5e0196a8a5 (diff)
Fix precision issues in SkRRectsGaussianEdgeShader.cpp
Diffstat (limited to 'src/effects')
-rw-r--r--src/effects/SkRRectsGaussianEdgeShader.cpp8
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);",