OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 #include "SkIntersections.h" | 7 #include "SkIntersections.h" |
8 #include "SkPathOpsCubic.h" | 8 #include "SkPathOpsCubic.h" |
9 #include "SkPathOpsLine.h" | 9 #include "SkPathOpsLine.h" |
10 | 10 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 } | 139 } |
140 } | 140 } |
141 fIntersections->insert(cubicT, lineT, pt); | 141 fIntersections->insert(cubicT, lineT, pt); |
142 skipInsert: | 142 skipInsert: |
143 ; | 143 ; |
144 } | 144 } |
145 } | 145 } |
146 return fIntersections->used(); | 146 return fIntersections->used(); |
147 } | 147 } |
148 | 148 |
149 int horizontalIntersect(double axisIntercept, double roots[3]) { | 149 int horizontalIntersect(double axisIntercept, double validRoots[3]) { |
150 double A, B, C, D; | 150 double A, B, C, D; |
151 SkDCubic::Coefficients(&fCubic[0].fY, &A, &B, &C, &D); | 151 SkDCubic::Coefficients(&fCubic[0].fY, &A, &B, &C, &D); |
152 D -= axisIntercept; | 152 D -= axisIntercept; |
153 return SkDCubic::RootsValidT(A, B, C, D, roots); | 153 int realCount; |
| 154 double allRoots[3]; |
| 155 int validCount = SkDCubic::RootsValidT(A, B, C, D, allRoots, &realCount,
validRoots); |
| 156 if (validCount >= 0) { |
| 157 return validCount; |
| 158 } |
| 159 SkDPoint calcPt = fCubic.ptAtT(validRoots[0]); |
| 160 if (approximately_equal(calcPt.fY, axisIntercept)) { |
| 161 return 1; |
| 162 } |
| 163 fCubic.searchRoots(allRoots, realCount, &validRoots[0], axisIntercept, f
alse); |
| 164 return 1; |
154 } | 165 } |
155 | 166 |
156 int horizontalIntersect(double axisIntercept, double left, double right, boo
l flipped) { | 167 int horizontalIntersect(double axisIntercept, double left, double right, boo
l flipped) { |
157 addExactHorizontalEndPoints(left, right, axisIntercept); | 168 addExactHorizontalEndPoints(left, right, axisIntercept); |
158 if (fAllowNear) { | 169 if (fAllowNear) { |
159 addNearHorizontalEndPoints(left, right, axisIntercept); | 170 addNearHorizontalEndPoints(left, right, axisIntercept); |
160 } | 171 } |
161 double rootVals[3]; | 172 double rootVals[3]; |
162 int roots = horizontalIntersect(axisIntercept, rootVals); | 173 int roots = horizontalIntersect(axisIntercept, rootVals); |
163 for (int index = 0; index < roots; ++index) { | 174 for (int index = 0; index < roots; ++index) { |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 } | 367 } |
357 | 368 |
358 int SkIntersections::intersectRay(const SkDCubic& cubic, const SkDLine& line) { | 369 int SkIntersections::intersectRay(const SkDCubic& cubic, const SkDLine& line) { |
359 LineCubicIntersections c(cubic, line, this); | 370 LineCubicIntersections c(cubic, line, this); |
360 fUsed = c.intersectRay(fT[0]); | 371 fUsed = c.intersectRay(fT[0]); |
361 for (int index = 0; index < fUsed; ++index) { | 372 for (int index = 0; index < fUsed; ++index) { |
362 fPt[index] = cubic.ptAtT(fT[0][index]); | 373 fPt[index] = cubic.ptAtT(fT[0][index]); |
363 } | 374 } |
364 return fUsed; | 375 return fUsed; |
365 } | 376 } |
OLD | NEW |