| 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 |