aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2018-03-13 11:17:52 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-03-13 21:56:08 +0000
commit40481bb39242b0a6dc4fec3dc9f3f482ee4b8b57 (patch)
treeb2563b97023860eff6e17fe6eafdac9f663cff74 /src/shaders
parentdf574048f5acc737775fc0281e3022d7faac0781 (diff)
Harden initial LinearGradient4f tiling
Even with verified/finite inputs, fx can sometimes collapse to infinity. When that happens, attempting to apply repeat/mirror tiling produces NaN results and things go south. Catch these degenerate cases and tile to 0 (for lack of a better idea). Note: leaving fx == +/- inf in clamp mode should be safe. BUG=oss-fuzz:6622 Change-Id: I65711020057856b47045f67a52d906336ad1f173 Reviewed-on: https://skia-review.googlesource.com/114090 Reviewed-by: Kevin Lubick <kjlubick@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src/shaders')
-rw-r--r--src/shaders/gradients/Sk4fLinearGradient.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/shaders/gradients/Sk4fLinearGradient.cpp b/src/shaders/gradients/Sk4fLinearGradient.cpp
index 1a0dbd2042..0000fd9a15 100644
--- a/src/shaders/gradients/Sk4fLinearGradient.cpp
+++ b/src/shaders/gradients/Sk4fLinearGradient.cpp
@@ -56,7 +56,7 @@ SkScalar pinFx<SkShader::kClamp_TileMode>(SkScalar fx) {
template<>
SkScalar pinFx<SkShader::kRepeat_TileMode>(SkScalar fx) {
- SkScalar f = SkScalarFraction(fx);
+ SkScalar f = SkScalarIsFinite(fx) ? SkScalarFraction(fx) : 0;
if (f < 0) {
f = SkTMin(f + 1, nextafterf(1, 0));
}
@@ -67,7 +67,7 @@ SkScalar pinFx<SkShader::kRepeat_TileMode>(SkScalar fx) {
template<>
SkScalar pinFx<SkShader::kMirror_TileMode>(SkScalar fx) {
- SkScalar f = SkScalarMod(fx, 2.0f);
+ SkScalar f = SkScalarIsFinite(fx) ? SkScalarMod(fx, 2.0f) : 0;
if (f < 0) {
f = SkTMin(f + 2, nextafterf(2, 0));
}