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
This commit is contained in:
parent
64022c1ed2
commit
93ca884879
@ -743,7 +743,8 @@ static int solve_cubic_poly(const SkScalar coeff[4], SkScalar tValues[3]) {
|
||||
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;
|
||||
|
@ -419,7 +419,8 @@ int SkDCubic::RootsReal(double A, double B, double C, double D, double s[3]) {
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user