From 3d1a6bc5f3124dd5cd237ccc39ead26fe4b3355f Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Thu, 9 Feb 2017 15:05:15 -0500 Subject: [4fGradient] Relax interval checks for SkGradientShaderBase also Similar to https://skia-review.googlesource.com/8270, treat intervals as closed at both extremities in the 4f gradient fallback impl also. BUG=skia:6212 Change-Id: I7f164868202ae6a0f76cbcdbcbf8e62db12a1bd4 Reviewed-on: https://skia-review.googlesource.com/8277 Commit-Queue: Florin Malita Reviewed-by: Mike Reed --- src/effects/gradients/Sk4fGradientBase.cpp | 18 +++++++++--------- src/effects/gradients/Sk4fGradientBase.h | 7 +++++++ 2 files changed, 16 insertions(+), 9 deletions(-) (limited to 'src/effects/gradients') diff --git a/src/effects/gradients/Sk4fGradientBase.cpp b/src/effects/gradients/Sk4fGradientBase.cpp index 91f418564f..e234e9bc36 100644 --- a/src/effects/gradients/Sk4fGradientBase.cpp +++ b/src/effects/gradients/Sk4fGradientBase.cpp @@ -360,7 +360,7 @@ public: // TODO: maybe do this in ctor to remove a branch? fInterval = this->findFirstInterval(tiled_t); this->loadIntervalData(fInterval); - } else if (tiled_t < fInterval->fP0 || tiled_t >= fInterval->fP1) { + } else if (!fInterval->contains(tiled_t)) { fInterval = this->findNextInterval(t, tiled_t); this->loadIntervalData(fInterval); } @@ -391,7 +391,7 @@ private: } Sk4f lerp(SkScalar t) { - SkASSERT(t >= fInterval->fP0 && t < fInterval->fP1); + SkASSERT(fInterval->contains(t)); return fCc + fDc * (t - fInterval->fP0); } @@ -402,24 +402,24 @@ private: while (i0 != i1) { SkASSERT(i0 < i1); - SkASSERT(t >= i0->fP0 && t < i1->fP1); + SkASSERT(t >= i0->fP0 && t <= i1->fP1); const Interval* i = i0 + ((i1 - i0) >> 1); - if (t >= i->fP1) { + if (t > i->fP1) { i0 = i + 1; } else { i1 = i; } } - SkASSERT(t >= i0->fP0 && t <= i0->fP1); + SkASSERT(i0->contains(t)); return i0; } const Interval* findNextInterval(SkScalar t, SkScalar tiled_t) const { - SkASSERT(tiled_t < fInterval->fP0 || tiled_t >= fInterval->fP1); - SkASSERT(tiled_t >= fFirstInterval->fP0 && tiled_t < fLastInterval->fP1); + SkASSERT(!fInterval->contains(tiled_t)); + SkASSERT(tiled_t >= fFirstInterval->fP0 && tiled_t <= fLastInterval->fP1); const Interval* i = fInterval; @@ -431,14 +431,14 @@ private: if (i > fLastInterval) { i = fFirstInterval; } - } while (tiled_t < i->fP0 || tiled_t >= i->fP1); + } while (!i->contains(tiled_t)); } else { do { i -= 1; if (i < fFirstInterval) { i = fLastInterval; } - } while (tiled_t < i->fP0 || tiled_t >= i->fP1); + } while (!i->contains(tiled_t)); } return i; diff --git a/src/effects/gradients/Sk4fGradientBase.h b/src/effects/gradients/Sk4fGradientBase.h index fa8412ce2a..6d0c3b96ff 100644 --- a/src/effects/gradients/Sk4fGradientBase.h +++ b/src/effects/gradients/Sk4fGradientBase.h @@ -37,6 +37,13 @@ protected: bool isZeroRamp() const { return fZeroRamp; } + bool contains(SkScalar p) const { + // True if p is in [p0,p1]. Note: this helper assumes a + // natural/increasing interval - so it's not usable in Sk4fLinearGradient. + SkASSERT(fP0 < fP1); + return p >= fP0 && p <= fP1; + } + SkPM4f fC0, fDc; SkScalar fP0, fP1; bool fZeroRamp; -- cgit v1.2.3