pin before calling acos
Adobe reports some user crashes in acos(). While the cause is
unknown, it's safe and may help stability to pin the input
in case the arguments drifted slightly outside [-1, 1].
R=reed@google.com
BUG=skia:5222
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2006653006
Review-Url: https://codereview.chromium.org/2006653006
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
index 7256b9e..5d181a3 100644
--- a/src/core/SkGeometry.cpp
+++ b/src/core/SkGeometry.cpp
@@ -743,7 +743,8 @@
SkScalar r;
if (R2MinusQ3 < 0) { // we have 3 real roots
- SkScalar theta = SkScalarACos(R / SkScalarSqrt(Q3));
+ // the divide/root can, due to finite precisions, be slightly outside of -1...1
+ SkScalar theta = SkScalarACos(SkScalarPin(R / SkScalarSqrt(Q3), -1, 1));
SkScalar neg2RootQ = -2 * SkScalarSqrt(Q);
r = neg2RootQ * SkScalarCos(theta/3) - adiv3;
diff --git a/src/pathops/SkPathOpsCubic.cpp b/src/pathops/SkPathOpsCubic.cpp
index 6b74fb0..a161e36 100644
--- a/src/pathops/SkPathOpsCubic.cpp
+++ b/src/pathops/SkPathOpsCubic.cpp
@@ -419,7 +419,8 @@
double r;
double* roots = s;
if (R2MinusQ3 < 0) { // we have 3 real roots
- double theta = acos(R / sqrt(Q3));
+ // the divide/root can, due to finite precisions, be slightly outside of -1...1
+ double theta = acos(SkTPin(R / sqrt(Q3), -1., 1.));
double neg2RootQ = -2 * sqrt(Q);
r = neg2RootQ * cos(theta / 3) - adiv3;