Chromium Code Reviews| Index: src/core/SkGeometry.cpp |
| diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp |
| index 027b65f0f1962e82e0bbfc38afb77184a23fdc12..b82fb2e4e5cfb1d0a2fb6785b8978efcbba04f3f 100644 |
| --- a/src/core/SkGeometry.cpp |
| +++ b/src/core/SkGeometry.cpp |
| @@ -975,7 +975,8 @@ static void ratquad_mapTo3D(const SkPoint src[3], SkScalar w, SkP3D dst[]) { |
| dst[2].set(src[2].fX * 1, src[2].fY * 1, 1); |
| } |
| -void SkConic::chopAt(SkScalar t, SkConic dst[2]) const { |
| +// return false if infinity or NaN is generated; caller must check |
| +bool SkConic::chopAt(SkScalar t, SkConic dst[2]) const { |
| SkP3D tmp[3], tmp2[3]; |
| ratquad_mapTo3D(fPts, fW, tmp); |
| @@ -1001,18 +1002,23 @@ void SkConic::chopAt(SkScalar t, SkConic dst[2]) const { |
| SkScalar root = SkScalarSqrt(tmp2[1].fZ); |
| dst[0].fW = tmp2[0].fZ / root; |
| dst[1].fW = tmp2[2].fZ / root; |
| + SkASSERT(sizeof(dst[0]) == sizeof(SkScalar) * 7); |
| + SkASSERT(0 == offsetof(SkConic, fPts[0].fX)); |
| + return SkScalarsAreFinite(&dst[0].fPts[0].fX, 7) && SkScalarsAreFinite(&dst[1].fPts[0].fX, 7); |
|
reed1
2016/09/26 15:25:26
SkScalarsAreFinite(&dst[0].fPts[0].fX, 14) ?
caryclark
2016/09/26 17:10:33
Done.
|
| } |
| void SkConic::chopAt(SkScalar t1, SkScalar t2, SkConic* dst) const { |
| if (0 == t1 || 1 == t2) { |
| if (0 == t1 && 1 == t2) { |
| *dst = *this; |
| + return; |
| } else { |
| SkConic pair[2]; |
| - this->chopAt(t1 ? t1 : t2, pair); |
| - *dst = pair[SkToBool(t1)]; |
| + if (this->chopAt(t1 ? t1 : t2, pair)) { |
| + *dst = pair[SkToBool(t1)]; |
| + return; |
| + } |
| } |
| - return; |
| } |
| SkConicCoeff coeff(*this); |
| Sk2s tt1(t1); |
| @@ -1243,7 +1249,10 @@ bool SkConic::findYExtrema(SkScalar* t) const { |
| bool SkConic::chopAtXExtrema(SkConic dst[2]) const { |
| SkScalar t; |
| if (this->findXExtrema(&t)) { |
| - this->chopAt(t, dst); |
| + if (!this->chopAt(t, dst)) { |
| + // if chop can't return finite values, don't chop |
| + return false; |
| + } |
| // now clean-up the middle, since we know t was meant to be at |
| // an X-extrema |
| SkScalar value = dst[0].fPts[2].fX; |
| @@ -1258,7 +1267,10 @@ bool SkConic::chopAtXExtrema(SkConic dst[2]) const { |
| bool SkConic::chopAtYExtrema(SkConic dst[2]) const { |
| SkScalar t; |
| if (this->findYExtrema(&t)) { |
| - this->chopAt(t, dst); |
| + if (!this->chopAt(t, dst)) { |
| + // if chop can't return finite values, don't chop |
| + return false; |
| + } |
| // now clean-up the middle, since we know t was meant to be at |
| // an Y-extrema |
| SkScalar value = dst[0].fPts[2].fY; |