aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/shaders/SkPerlinNoiseShader.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2018-06-05 17:37:12 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-06-06 13:02:56 +0000
commit102c8cf26e2886ba783a2b54827e1f5d1cf0a774 (patch)
tree1ce640b3886fd5333cbc6f08b30cf739cce6a0d6 /src/shaders/SkPerlinNoiseShader.cpp
parent31cb864fdbb5704a2c6f946a1d4aaef433a8f944 (diff)
Harden SkPerlinNoiseShader StitchData initialization
... to ensure fWrap{X,Y} don't overflow int. Bug: chromium:846010, oss-fuzz:8377 Change-Id: I7cf082e388002ad5f8a6c62bad92f998fe831385 Reviewed-on: https://skia-review.googlesource.com/132222 Reviewed-by: Kevin Lubick <kjlubick@google.com> Commit-Queue: Florin Malita <fmalita@chromium.org>
Diffstat (limited to 'src/shaders/SkPerlinNoiseShader.cpp')
-rw-r--r--src/shaders/SkPerlinNoiseShader.cpp20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index d864e165e5..7b457f5b32 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -75,6 +75,12 @@ public:
, fWrapY(0)
{}
+ StitchData(SkScalar w, SkScalar h)
+ : fWidth(SkTMin(SkScalarRoundToInt(w), SK_MaxS32 - kPerlinNoise))
+ , fWrapX(kPerlinNoise + fWidth)
+ , fHeight(SkTMin(SkScalarRoundToInt(h), SK_MaxS32 - kPerlinNoise))
+ , fWrapY(kPerlinNoise + fHeight) {}
+
bool operator==(const StitchData& other) const {
return fWidth == other.fWidth &&
fWrapX == other.fWrapX &&
@@ -290,12 +296,8 @@ public:
}
}
// Set up TurbulenceInitial stitch values.
- fStitchDataInit.fWidth =
- SkScalarRoundToInt(tileWidth * fBaseFrequency.fX);
- fStitchDataInit.fWrapX = kPerlinNoise + fStitchDataInit.fWidth;
- fStitchDataInit.fHeight =
- SkScalarRoundToInt(tileHeight * fBaseFrequency.fY);
- fStitchDataInit.fWrapY = kPerlinNoise + fStitchDataInit.fHeight;
+ fStitchDataInit = StitchData(tileWidth * fBaseFrequency.fX,
+ tileHeight * fBaseFrequency.fY);
}
public:
@@ -543,10 +545,8 @@ SkScalar SkPerlinNoiseShaderImpl::PerlinNoiseShaderContext::calculateTurbulenceV
ratio *= 2;
if (perlinNoiseShader.fStitchTiles) {
// Update stitch values
- stitchData.fWidth *= 2;
- stitchData.fWrapX = stitchData.fWidth + kPerlinNoise;
- stitchData.fHeight *= 2;
- stitchData.fWrapY = stitchData.fHeight + kPerlinNoise;
+ stitchData = StitchData(SkIntToScalar(stitchData.fWidth) * 2,
+ SkIntToScalar(stitchData.fHeight) * 2);
}
}