Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Unified Diff: src/effects/gradients/Sk4fGradientBase.cpp

Issue 2472763002: Fix fuzzer assert in GradientShaderBase4fContext::TSampler (Closed)
Patch Set: Win build fix Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/gradients/Sk4fGradientBase.cpp
diff --git a/src/effects/gradients/Sk4fGradientBase.cpp b/src/effects/gradients/Sk4fGradientBase.cpp
index 5cabab967a56c78b80b1a51478df215541cbaed9..05dc353a0f9cfc25cdf0ece3db58568328fa60ea 100644
--- a/src/effects/gradients/Sk4fGradientBase.cpp
+++ b/src/effects/gradients/Sk4fGradientBase.cpp
@@ -20,28 +20,6 @@ Sk4f pack_color(SkColor c, bool premul, const Sk4f& component_scale) {
return pm4f * component_scale;
}
-template<SkShader::TileMode>
-SkScalar tileProc(SkScalar t);
-
-template<>
-SkScalar tileProc<SkShader::kClamp_TileMode>(SkScalar t) {
- // synthetic clamp-mode edge intervals allow for a free-floating t:
- // [-inf..0)[0..1)[1..+inf)
- return t;
-}
-
-template<>
-SkScalar tileProc<SkShader::kRepeat_TileMode>(SkScalar t) {
- // t % 1 (intervals range: [0..1))
- return t - SkScalarFloorToScalar(t);
-}
-
-template<>
-SkScalar tileProc<SkShader::kMirror_TileMode>(SkScalar t) {
- // t % 2 (synthetic mirror intervals expand the range to [0..2)
- return t - SkScalarFloorToScalar(t / 2) * 2;
-}
-
class IntervalIterator {
public:
IntervalIterator(const SkColor* colors, const SkScalar* pos, int count, bool reverse)
@@ -354,12 +332,13 @@ public:
TSampler(const GradientShaderBase4fContext& ctx)
: fFirstInterval(ctx.fIntervals.begin())
, fLastInterval(ctx.fIntervals.end() - 1)
- , fInterval(nullptr) {
+ , fInterval(nullptr)
+ , fLargestLessThanTwo(nextafterf(2, 0)) {
SkASSERT(fLastInterval >= fFirstInterval);
}
Sk4f sample(SkScalar t) {
- const SkScalar tiled_t = tileProc<tileMode>(t);
+ const auto tiled_t = tileProc(t);
if (!fInterval) {
// Very first sample => locate the initial interval.
@@ -376,6 +355,25 @@ public:
}
private:
+ SkScalar tileProc(SkScalar t) const {
+ switch (tileMode) {
+ case kClamp_TileMode:
+ // synthetic clamp-mode edge intervals allow for a free-floating t:
+ // [-inf..0)[0..1)[1..+inf)
+ return t;
+ case kRepeat_TileMode:
+ // t % 1 (intervals range: [0..1))
+ return t - SkScalarFloorToScalar(t);
+ case kMirror_TileMode:
+ // t % 2 (synthetic mirror intervals expand the range to [0..2)
+ // Due to the extra arithmetic, we must clamp to ensure the value remains less than 2.
+ return SkTMin(t - SkScalarFloorToScalar(t / 2) * 2, fLargestLessThanTwo);
+ }
+
+ SK_ABORT("Unhandled tile mode.");
+ return 0;
+ }
+
Sk4f lerp(SkScalar t) {
SkASSERT(t >= fInterval->fP0 && t < fInterval->fP1);
return fCc + fDc * (t - fInterval->fP0);
@@ -439,6 +437,7 @@ private:
const Interval* fLastInterval;
const Interval* fInterval;
SkScalar fPrevT;
+ SkScalar fLargestLessThanTwo;
herb_g 2016/11/04 14:58:44 Can this be static constexpr?
f(malita) 2016/11/04 15:05:53 Unfortunately not, nextafterf is not constexpr :(
Sk4f fCc;
Sk4f fDc;
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698