| 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 LineQuadraticIntersections(const SkDQuad& q, const SkDLine& l, SkIntersectio
ns* i) | 96 LineQuadraticIntersections(const SkDQuad& q, const SkDLine& l, SkIntersectio
ns* i) |
| 97 : fQuad(q) | 97 : fQuad(q) |
| 98 , fLine(&l) | 98 , fLine(&l) |
| 99 , fIntersections(i) | 99 , fIntersections(i) |
| 100 , fAllowNear(true) { | 100 , fAllowNear(true) { |
| 101 i->setMax(3); // allow short partial coincidence plus discrete intersec
tion | 101 i->setMax(3); // allow short partial coincidence plus discrete intersec
tion |
| 102 } | 102 } |
| 103 | 103 |
| 104 LineQuadraticIntersections(const SkDQuad& q) | 104 LineQuadraticIntersections(const SkDQuad& q) |
| 105 : fQuad(q) | 105 : fQuad(q) |
| 106 SkDEBUGPARAMS(fLine(NULL)) | 106 SkDEBUGPARAMS(fLine(nullptr)) |
| 107 SkDEBUGPARAMS(fIntersections(NULL)) | 107 SkDEBUGPARAMS(fIntersections(nullptr)) |
| 108 SkDEBUGPARAMS(fAllowNear(false)) { | 108 SkDEBUGPARAMS(fAllowNear(false)) { |
| 109 } | 109 } |
| 110 | 110 |
| 111 void allowNear(bool allow) { | 111 void allowNear(bool allow) { |
| 112 fAllowNear = allow; | 112 fAllowNear = allow; |
| 113 } | 113 } |
| 114 | 114 |
| 115 void checkCoincident() { | 115 void checkCoincident() { |
| 116 int last = fIntersections->used() - 1; | 116 int last = fIntersections->used() - 1; |
| 117 for (int index = 0; index < last; ) { | 117 for (int index = 0; index < last; ) { |
| 118 double quadMidT = ((*fIntersections)[0][index] + (*fIntersections)[0
][index + 1]) / 2; | 118 double quadMidT = ((*fIntersections)[0][index] + (*fIntersections)[0
][index + 1]) / 2; |
| 119 SkDPoint quadMidPt = fQuad.ptAtT(quadMidT); | 119 SkDPoint quadMidPt = fQuad.ptAtT(quadMidT); |
| 120 double t = fLine->nearPoint(quadMidPt, NULL); | 120 double t = fLine->nearPoint(quadMidPt, nullptr); |
| 121 if (t < 0) { | 121 if (t < 0) { |
| 122 ++index; | 122 ++index; |
| 123 continue; | 123 continue; |
| 124 } | 124 } |
| 125 if (fIntersections->isCoincident(index)) { | 125 if (fIntersections->isCoincident(index)) { |
| 126 fIntersections->removeOne(index); | 126 fIntersections->removeOne(index); |
| 127 --last; | 127 --last; |
| 128 } else if (fIntersections->isCoincident(index + 1)) { | 128 } else if (fIntersections->isCoincident(index + 1)) { |
| 129 fIntersections->removeOne(index + 1); | 129 fIntersections->removeOne(index + 1); |
| 130 --last; | 130 --last; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 fIntersections->insert(quadT, lineT, fQuad[qIndex]); | 284 fIntersections->insert(quadT, lineT, fQuad[qIndex]); |
| 285 } | 285 } |
| 286 } | 286 } |
| 287 | 287 |
| 288 void addNearEndPoints() { | 288 void addNearEndPoints() { |
| 289 for (int qIndex = 0; qIndex < 3; qIndex += 2) { | 289 for (int qIndex = 0; qIndex < 3; qIndex += 2) { |
| 290 double quadT = (double) (qIndex >> 1); | 290 double quadT = (double) (qIndex >> 1); |
| 291 if (fIntersections->hasT(quadT)) { | 291 if (fIntersections->hasT(quadT)) { |
| 292 continue; | 292 continue; |
| 293 } | 293 } |
| 294 double lineT = fLine->nearPoint(fQuad[qIndex], NULL); | 294 double lineT = fLine->nearPoint(fQuad[qIndex], nullptr); |
| 295 if (lineT < 0) { | 295 if (lineT < 0) { |
| 296 continue; | 296 continue; |
| 297 } | 297 } |
| 298 fIntersections->insert(quadT, lineT, fQuad[qIndex]); | 298 fIntersections->insert(quadT, lineT, fQuad[qIndex]); |
| 299 } | 299 } |
| 300 // FIXME: see if line end is nearly on quad | 300 // FIXME: see if line end is nearly on quad |
| 301 } | 301 } |
| 302 | 302 |
| 303 void addExactHorizontalEndPoints(double left, double right, double y) { | 303 void addExactHorizontalEndPoints(double left, double right, double y) { |
| 304 for (int qIndex = 0; qIndex < 3; qIndex += 2) { | 304 for (int qIndex = 0; qIndex < 3; qIndex += 2) { |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 | 435 |
| 436 int SkIntersections::HorizontalIntercept(const SkDQuad& quad, SkScalar y, double
* roots) { | 436 int SkIntersections::HorizontalIntercept(const SkDQuad& quad, SkScalar y, double
* roots) { |
| 437 LineQuadraticIntersections q(quad); | 437 LineQuadraticIntersections q(quad); |
| 438 return q.horizontalIntersect(y, roots); | 438 return q.horizontalIntersect(y, roots); |
| 439 } | 439 } |
| 440 | 440 |
| 441 int SkIntersections::VerticalIntercept(const SkDQuad& quad, SkScalar x, double*
roots) { | 441 int SkIntersections::VerticalIntercept(const SkDQuad& quad, SkScalar x, double*
roots) { |
| 442 LineQuadraticIntersections q(quad); | 442 LineQuadraticIntersections q(quad); |
| 443 return q.verticalIntersect(x, roots); | 443 return q.verticalIntersect(x, roots); |
| 444 } | 444 } |
| OLD | NEW |