SkPathOpsTypes.cpp revision b669300a9753893ef900207c38aeff2d467764e5
107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com/*
207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Copyright 2012 Google Inc.
307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com *
407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * Use of this source code is governed by a BSD-style license that can be
507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com * found in the LICENSE file.
607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com */
7cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com#include "SkFloatBits.h"
827c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark#include "SkOpCoincidence.h"
907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com#include "SkPathOpsTypes.h"
1007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
117eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comstatic bool arguments_denormalized(float a, float b, int epsilon) {
12a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    float denormalizedCheck = FLT_EPSILON * epsilon / 2;
13a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    return fabsf(a) <= denormalizedCheck && fabsf(b) <= denormalizedCheck;
147eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com}
157eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
1607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// from http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
17cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.com// FIXME: move to SkFloatBits.h
18a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.comstatic bool equal_ulps(float a, float b, int epsilon, int depsilon) {
19b669300a9753893ef900207c38aeff2d467764e5caryclark    if (arguments_denormalized(a, b, depsilon)) {
20b669300a9753893ef900207c38aeff2d467764e5caryclark        return true;
21b669300a9753893ef900207c38aeff2d467764e5caryclark    }
22b669300a9753893ef900207c38aeff2d467764e5caryclark    int aBits = SkFloatAs2sCompliment(a);
23b669300a9753893ef900207c38aeff2d467764e5caryclark    int bBits = SkFloatAs2sCompliment(b);
24b669300a9753893ef900207c38aeff2d467764e5caryclark    // Find the difference in ULPs.
25b669300a9753893ef900207c38aeff2d467764e5caryclark    return aBits < bBits + epsilon && bBits < aBits + epsilon;
26b669300a9753893ef900207c38aeff2d467764e5caryclark}
27b669300a9753893ef900207c38aeff2d467764e5caryclark
28b669300a9753893ef900207c38aeff2d467764e5caryclarkstatic bool equal_ulps_pin(float a, float b, int epsilon, int depsilon) {
29570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) {
30570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com        return false;
3107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
32a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    if (arguments_denormalized(a, b, depsilon)) {
337eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com        return true;
347eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    }
357eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    int aBits = SkFloatAs2sCompliment(a);
367eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    int bBits = SkFloatAs2sCompliment(b);
377eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    // Find the difference in ULPs.
387eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    return aBits < bBits + epsilon && bBits < aBits + epsilon;
397eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com}
407eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
417eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comstatic bool d_equal_ulps(float a, float b, int epsilon) {
42570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int aBits = SkFloatAs2sCompliment(a);
43570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int bBits = SkFloatAs2sCompliment(b);
4407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    // Find the difference in ULPs.
45570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return aBits < bBits + epsilon && bBits < aBits + epsilon;
46570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
47570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
48570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comstatic bool not_equal_ulps(float a, float b, int epsilon) {
49b669300a9753893ef900207c38aeff2d467764e5caryclark    if (arguments_denormalized(a, b, epsilon)) {
50b669300a9753893ef900207c38aeff2d467764e5caryclark        return false;
51b669300a9753893ef900207c38aeff2d467764e5caryclark    }
52b669300a9753893ef900207c38aeff2d467764e5caryclark    int aBits = SkFloatAs2sCompliment(a);
53b669300a9753893ef900207c38aeff2d467764e5caryclark    int bBits = SkFloatAs2sCompliment(b);
54b669300a9753893ef900207c38aeff2d467764e5caryclark    // Find the difference in ULPs.
55b669300a9753893ef900207c38aeff2d467764e5caryclark    return aBits >= bBits + epsilon || bBits >= aBits + epsilon;
56b669300a9753893ef900207c38aeff2d467764e5caryclark}
57b669300a9753893ef900207c38aeff2d467764e5caryclark
58b669300a9753893ef900207c38aeff2d467764e5caryclarkstatic bool not_equal_ulps_pin(float a, float b, int epsilon) {
59570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    if (!SkScalarIsFinite(a) || !SkScalarIsFinite(b)) {
60570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com        return false;
61570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    }
627eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    if (arguments_denormalized(a, b, epsilon)) {
637eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com        return false;
647eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    }
657eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    int aBits = SkFloatAs2sCompliment(a);
667eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    int bBits = SkFloatAs2sCompliment(b);
677eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    // Find the difference in ULPs.
687eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    return aBits >= bBits + epsilon || bBits >= aBits + epsilon;
697eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com}
707eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
717eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.comstatic bool d_not_equal_ulps(float a, float b, int epsilon) {
72570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int aBits = SkFloatAs2sCompliment(a);
73570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int bBits = SkFloatAs2sCompliment(b);
74570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    // Find the difference in ULPs.
75570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return aBits >= bBits + epsilon || bBits >= aBits + epsilon;
7607e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com}
7707e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com
784fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.comstatic bool less_ulps(float a, float b, int epsilon) {
797eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    if (arguments_denormalized(a, b, epsilon)) {
807eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com        return a <= b - FLT_EPSILON * epsilon;
817eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    }
82570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int aBits = SkFloatAs2sCompliment(a);
83570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int bBits = SkFloatAs2sCompliment(b);
84fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com    // Find the difference in ULPs.
85570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return aBits <= bBits - epsilon;
86570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
87570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
88570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.comstatic bool less_or_equal_ulps(float a, float b, int epsilon) {
897eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    if (arguments_denormalized(a, b, epsilon)) {
907eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com        return a < b + FLT_EPSILON * epsilon;
917eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    }
92570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int aBits = SkFloatAs2sCompliment(a);
93570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    int bBits = SkFloatAs2sCompliment(b);
94570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    // Find the difference in ULPs.
95570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return aBits < bBits + epsilon;
96570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
97570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
98570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com// equality using the same error term as between
99570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool AlmostBequalUlps(float a, float b) {
100570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    const int UlpsEpsilon = 2;
101a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    return equal_ulps(a, b, UlpsEpsilon, UlpsEpsilon);
102a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com}
103a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com
104a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.combool AlmostPequalUlps(float a, float b) {
105a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    const int UlpsEpsilon = 8;
106a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    return equal_ulps(a, b, UlpsEpsilon, UlpsEpsilon);
107fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com}
108fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com
1097eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.combool AlmostDequalUlps(float a, float b) {
1107eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    const int UlpsEpsilon = 16;
1117eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    return d_equal_ulps(a, b, UlpsEpsilon);
1127eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com}
1137eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
1142db7fe7d3b7ee875e1099a22f0af17520696f5d7commit-bot@chromium.orgbool AlmostDequalUlps(double a, double b) {
115b669300a9753893ef900207c38aeff2d467764e5caryclark    return AlmostDequalUlps(SkDoubleToScalar(a), SkDoubleToScalar(b));
1162db7fe7d3b7ee875e1099a22f0af17520696f5d7commit-bot@chromium.org}
1172db7fe7d3b7ee875e1099a22f0af17520696f5d7commit-bot@chromium.org
1184fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.combool AlmostEqualUlps(float a, float b) {
11907e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com    const int UlpsEpsilon = 16;
120a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    return equal_ulps(a, b, UlpsEpsilon, UlpsEpsilon);
12107e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com}
12207e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com
123b669300a9753893ef900207c38aeff2d467764e5caryclarkbool AlmostEqualUlps_Pin(float a, float b) {
124b669300a9753893ef900207c38aeff2d467764e5caryclark    const int UlpsEpsilon = 16;
125b669300a9753893ef900207c38aeff2d467764e5caryclark    return equal_ulps_pin(a, b, UlpsEpsilon, UlpsEpsilon);
126b669300a9753893ef900207c38aeff2d467764e5caryclark}
127b669300a9753893ef900207c38aeff2d467764e5caryclark
128570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool NotAlmostEqualUlps(float a, float b) {
129570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    const int UlpsEpsilon = 16;
130570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return not_equal_ulps(a, b, UlpsEpsilon);
131570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
132570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
133b669300a9753893ef900207c38aeff2d467764e5caryclarkbool NotAlmostEqualUlps_Pin(float a, float b) {
134b669300a9753893ef900207c38aeff2d467764e5caryclark    const int UlpsEpsilon = 16;
135b669300a9753893ef900207c38aeff2d467764e5caryclark    return not_equal_ulps_pin(a, b, UlpsEpsilon);
136b669300a9753893ef900207c38aeff2d467764e5caryclark}
137b669300a9753893ef900207c38aeff2d467764e5caryclark
1387eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.combool NotAlmostDequalUlps(float a, float b) {
1397eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    const int UlpsEpsilon = 16;
1407eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com    return d_not_equal_ulps(a, b, UlpsEpsilon);
1417eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com}
1427eaa53d8f7e48fd17d02b5e3bd91f90e9c1899efcaryclark@google.com
1434fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.combool RoughlyEqualUlps(float a, float b) {
14407e97fccd2d85076cd22ef411b0773ab92a18abecaryclark@google.com    const int UlpsEpsilon = 256;
145a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    const int DUlpsEpsilon = 1024;
146a2bbc6e19d5332e81784e582c290cc060f40c4c7caryclark@google.com    return equal_ulps(a, b, UlpsEpsilon, DUlpsEpsilon);
14707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
14807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
149fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.combool AlmostBetweenUlps(float a, float b, float c) {
150570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    const int UlpsEpsilon = 2;
151570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return a <= c ? less_or_equal_ulps(a, b, UlpsEpsilon) && less_or_equal_ulps(b, c, UlpsEpsilon)
152570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com        : less_or_equal_ulps(b, a, UlpsEpsilon) && less_or_equal_ulps(c, b, UlpsEpsilon);
153570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
154570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
155570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool AlmostLessUlps(float a, float b) {
156570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    const int UlpsEpsilon = 16;
157570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return less_ulps(a, b, UlpsEpsilon);
158570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com}
159570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com
160570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.combool AlmostLessOrEqualUlps(float a, float b) {
161570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    const int UlpsEpsilon = 16;
162570863f2e22b8ea7d7c504bd15e4f766af097df2caryclark@google.com    return less_or_equal_ulps(a, b, UlpsEpsilon);
163fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com}
164fa2aeee27af27f2934ee52a9732148f66481fb03caryclark@google.com
1654fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.comint UlpsDistance(float a, float b) {
1664fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    SkFloatIntUnion floatIntA, floatIntB;
1674fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    floatIntA.fFloat = a;
1684fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    floatIntB.fFloat = b;
1694fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    // Different signs means they do not match.
1704fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    if ((floatIntA.fSignBitInt < 0) != (floatIntB.fSignBitInt < 0)) {
1714fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com        // Check for equality to make sure +0 == -0
1724fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com        return a == b ? 0 : SK_MaxS32;
1734fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    }
1744fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com    // Find the difference in ULPs.
17560e0fee6d4acff638ccc9670c4055aced529a7a0bungeman    return SkTAbs(floatIntA.fSignBitInt - floatIntB.fSignBitInt);
1764fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com}
1774fdbb229649caf74e5c1b55a1823926df903af34caryclark@google.com
17807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// cube root approximation using bit hack for 64-bit float
17907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// adapted from Kahan's cbrt
180cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.comstatic double cbrt_5d(double d) {
18107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    const unsigned int B1 = 715094163;
18207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    double t = 0.0;
18307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    unsigned int* pt = (unsigned int*) &t;
18407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    unsigned int* px = (unsigned int*) &d;
18507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    pt[1] = px[1] / 3 + B1;
18607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return t;
18707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
18807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
18907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// iterative cube root approximation using Halley's method (double)
190cffbcc3b9665f2c928544b6fc6b8a0e22a4210fbcaryclark@google.comstatic double cbrta_halleyd(const double a, const double R) {
19107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    const double a3 = a * a * a;
19207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    const double b = a * (a3 + R + R) / (a3 + a3 + R);
19307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return b;
19407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
19507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
19607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com// cube root approximation using 3 iterations of Halley's method (double)
19707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comstatic double halley_cbrt3d(double d) {
19807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    double a = cbrt_5d(d);
19907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    a = cbrta_halleyd(a, d);
20007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    a = cbrta_halleyd(a, d);
20107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return cbrta_halleyd(a, d);
20207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
20307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com
20407393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.comdouble SkDCubeRoot(double x) {
20507393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    if (approximately_zero_cubed(x)) {
20607393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        return 0;
20707393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
20807393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    double result = halley_cbrt3d(fabs(x));
20907393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    if (x < 0) {
21007393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com        result = -result;
21107393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    }
21207393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com    return result;
21307393cab57ce74a4aae89a31fae9aaa9780fc19dcaryclark@google.com}
21427c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark
215d4349723fac9c0fd4dcf8c275fb7c756bdfdff7bcaryclarkSkOpGlobalState::SkOpGlobalState(SkOpCoincidence* coincidence, SkOpContourHead* head
216d4349723fac9c0fd4dcf8c275fb7c756bdfdff7bcaryclark                                 SkDEBUGPARAMS(const char* testName))
21727c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    : fCoincidence(coincidence)
21827c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    , fContourHead(head)
21927c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    , fNested(0)
22027c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    , fWindingFailed(false)
22127c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    , fAngleCoincidence(false)
22227c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    , fPhase(kIntersecting)
223d4349723fac9c0fd4dcf8c275fb7c756bdfdff7bcaryclark    SkDEBUGPARAMS(fDebugTestName(testName))
22427c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    SkDEBUGPARAMS(fAngleID(0))
22526ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark    SkDEBUGPARAMS(fCoinID(0))
22627c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    SkDEBUGPARAMS(fContourID(0))
22727c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    SkDEBUGPARAMS(fPtTID(0))
22827c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    SkDEBUGPARAMS(fSegmentID(0))
22927c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    SkDEBUGPARAMS(fSpanID(0)) {
23027c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    if (coincidence) {
23127c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark        coincidence->debugSetGlobalState(this);
23227c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark    }
23326ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark#if DEBUG_T_SECT_LOOP_COUNT
23426ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark    debugResetLoopCounts();
23526ad22ab61539e3d3b6bc5e0da8dcebbd52a53decaryclark#endif
23627c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark}
23727c8eb8ffd7e221693d840c2b9279d53fe6f03d4caryclark
238