| Index: src/core/SkPath.cpp
|
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
|
| index 37592ddc3c875fb28c263d144baa8d888988040f..ab8d7359d2271b5a15b531859f44379522a4b378 100644
|
| --- a/src/core/SkPath.cpp
|
| +++ b/src/core/SkPath.cpp
|
| @@ -2764,16 +2764,12 @@ static bool is_mono_quad(SkScalar y0, SkScalar y1, SkScalar y2) {
|
| static int winding_conic(const SkPoint pts[], SkScalar x, SkScalar y, SkScalar weight,
|
| int* onCurveCount) {
|
| SkConic conic(pts, weight);
|
| - SkConic *c = &conic;
|
| SkConic chopped[2];
|
| - int n = 0;
|
| -
|
| - if (!is_mono_quad(pts[0].fY, pts[1].fY, pts[2].fY)) {
|
| - n = conic.chopAtYExtrema(chopped);
|
| - c = chopped;
|
| - }
|
| - int w = winding_mono_conic(*c, x, y, onCurveCount);
|
| - if (n > 0) {
|
| + // If the data points are very large, the conic may not be monotonic but may also
|
| + // fail to chop. Then, the chopper does not split the original conic in two.
|
| + bool isMono = is_mono_quad(pts[0].fY, pts[1].fY, pts[2].fY) || !conic.chopAtYExtrema(chopped);
|
| + int w = winding_mono_conic(isMono ? conic : chopped[0], x, y, onCurveCount);
|
| + if (!isMono) {
|
| w += winding_mono_conic(chopped[1], x, y, onCurveCount);
|
| }
|
| return w;
|
|
|