| 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 "SkPathOpsLine.h" | 8 #include "SkPathOpsLine.h" |
| 9 #include "SkPathOpsQuad.h" | 9 #include "SkPathOpsQuad.h" |
| 10 | 10 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 A += C - 2 * B; // A = a - 2*b + c | 134 A += C - 2 * B; // A = a - 2*b + c |
| 135 B -= C; // B = -(b - c) | 135 B -= C; // B = -(b - c) |
| 136 return SkDQuad::RootsValidT(A, 2 * B, C, roots); | 136 return SkDQuad::RootsValidT(A, 2 * B, C, roots); |
| 137 } | 137 } |
| 138 | 138 |
| 139 int intersect() { | 139 int intersect() { |
| 140 addExactEndPoints(); | 140 addExactEndPoints(); |
| 141 if (fAllowNear) { | 141 if (fAllowNear) { |
| 142 addNearEndPoints(); | 142 addNearEndPoints(); |
| 143 } | 143 } |
| 144 double rootVals[2]; | 144 if (fIntersections->used() == 2) { |
| 145 int roots = intersectRay(rootVals); | 145 // FIXME : need sharable code that turns spans into coincident if mi
ddle point is on |
| 146 for (int index = 0; index < roots; ++index) { | 146 } else { |
| 147 double quadT = rootVals[index]; | 147 double rootVals[2]; |
| 148 double lineT = findLineT(quadT); | 148 int roots = intersectRay(rootVals); |
| 149 SkDPoint pt; | 149 for (int index = 0; index < roots; ++index) { |
| 150 if (pinTs(&quadT, &lineT, &pt, kPointUninitialized)) { | 150 double quadT = rootVals[index]; |
| 151 fIntersections->insert(quadT, lineT, pt); | 151 double lineT = findLineT(quadT); |
| 152 SkDPoint pt; |
| 153 if (pinTs(&quadT, &lineT, &pt, kPointUninitialized)) { |
| 154 fIntersections->insert(quadT, lineT, pt); |
| 155 } |
| 152 } | 156 } |
| 153 } | 157 } |
| 154 return fIntersections->used(); | 158 return fIntersections->used(); |
| 155 } | 159 } |
| 156 | 160 |
| 157 int horizontalIntersect(double axisIntercept, double roots[2]) { | 161 int horizontalIntersect(double axisIntercept, double roots[2]) { |
| 158 double D = fQuad[2].fY; // f | 162 double D = fQuad[2].fY; // f |
| 159 double E = fQuad[1].fY; // e | 163 double E = fQuad[1].fY; // e |
| 160 double F = fQuad[0].fY; // d | 164 double F = fQuad[0].fY; // d |
| 161 D += F - 2 * E; // D = d - 2*e + f | 165 D += F - 2 * E; // D = d - 2*e + f |
| (...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 } | 409 } |
| 406 | 410 |
| 407 int SkIntersections::intersectRay(const SkDQuad& quad, const SkDLine& line) { | 411 int SkIntersections::intersectRay(const SkDQuad& quad, const SkDLine& line) { |
| 408 LineQuadraticIntersections q(quad, line, this); | 412 LineQuadraticIntersections q(quad, line, this); |
| 409 fUsed = q.intersectRay(fT[0]); | 413 fUsed = q.intersectRay(fT[0]); |
| 410 for (int index = 0; index < fUsed; ++index) { | 414 for (int index = 0; index < fUsed; ++index) { |
| 411 fPt[index] = quad.ptAtT(fT[0][index]); | 415 fPt[index] = quad.ptAtT(fT[0][index]); |
| 412 } | 416 } |
| 413 return fUsed; | 417 return fUsed; |
| 414 } | 418 } |
| OLD | NEW |