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:
caryclark 2016-05-27 05:24:37 -07:00 committed by Commit bot
parent 64022c1ed2
commit 93ca884879
2 changed files with 4 additions and 2 deletions

View File

@ -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;

View File

@ -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;