Chromium Code Reviews| Index: src/core/SkRect.cpp |
| diff --git a/src/core/SkRect.cpp b/src/core/SkRect.cpp |
| index ecf6fa29893248dab9206fb06061f0d3d0f33fbe..564384fa122357bf628f8dba84a074147ba6068c 100644 |
| --- a/src/core/SkRect.cpp |
| +++ b/src/core/SkRect.cpp |
| @@ -45,6 +45,14 @@ void SkRect::toQuad(SkPoint quad[4]) const { |
| quad[3].set(fLeft, fBottom); |
| } |
| +//#include "Sk2x.h" |
| +#include "Sk4x.h" |
| + |
| +static inline bool is_finite(const Sk4f& value) { |
| + Sk4i finite = value * Sk4f(0) == Sk4f(0); |
| + return finite.allTrue(); |
| +} |
| + |
| bool SkRect::setBoundsCheck(const SkPoint pts[], int count) { |
| SkASSERT((pts && count > 0) || count == 0); |
| @@ -53,6 +61,7 @@ bool SkRect::setBoundsCheck(const SkPoint pts[], int count) { |
| if (count <= 0) { |
| sk_bzero(this, sizeof(SkRect)); |
| } else { |
| +#if 0 |
| SkScalar l, t, r, b; |
| l = r = pts[0].fX; |
| @@ -79,11 +88,48 @@ bool SkRect::setBoundsCheck(const SkPoint pts[], int count) { |
| } |
| SkASSERT(!accum || !SkScalarIsFinite(accum)); |
| + accum = 0; |
| if (accum) { |
| l = t = r = b = 0; |
| isFinite = false; |
| } |
| this->set(l, t, r, b); |
| +#else |
| + Sk4f min, max, accum; |
| + |
| + if (count & 1) { |
| + min = Sk4f(pts[0].fX, pts[0].fY, pts[0].fX, pts[0].fY); |
| + pts += 1; |
| + count -= 1; |
| + } else { |
| + min = Sk4f::Load(&pts[0].fX); |
| + pts += 2; |
| + count -= 2; |
| + } |
| + accum = max = min; |
| + accum *= Sk4f(0); |
|
mtklein
2015/03/25 18:35:55
// See is_finite(). ?
|
| + |
| + count >>= 1; |
| + for (int i = 0; i < count; ++i) { |
| + Sk4f xy = Sk4f::Load(&pts->fX); |
| + accum *= xy; |
| + min = Sk4f::Min(min, xy); |
|
mtklein
2015/03/25 18:35:55
Add a note about NaN + accum?
|
| + max = Sk4f::Max(max, xy); |
| + pts += 2; |
| + } |
| + |
| + if (is_finite(accum)) { |
| + float minArray[4], maxArray[4]; |
| + min.store(minArray); |
| + max.store(maxArray); |
| + this->set(SkTMin(minArray[0], minArray[2]), SkTMin(minArray[1], minArray[3]), |
| + SkTMax(maxArray[0], maxArray[2]), SkTMax(maxArray[1], maxArray[3])); |
| + } else { |
| + // we hit a non-finite value, so zero everything and return false |
| + this->setEmpty(); |
| + isFinite = false; |
| + } |
| +#endif |
| } |
| return isFinite; |