| 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 "SkOpAngle.h" | 8 #include "SkOpAngle.h" | 
| 9 #include "SkOpSegment.h" | 9 #include "SkOpSegment.h" | 
| 10 #include "SkPathOpsCurve.h" | 10 #include "SkPathOpsCurve.h" | 
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 200         rroots = (ri.*CurveRay[SkPathOpsVerbToPoints(rVerb)])(rh.fSegment->pts()
     , ray); | 200         rroots = (ri.*CurveRay[SkPathOpsVerbToPoints(rVerb)])(rh.fSegment->pts()
     , ray); | 
| 201     } while ((roots == 0 || rroots == 0) && (flip ^= true)); | 201     } while ((roots == 0 || rroots == 0) && (flip ^= true)); | 
| 202     if (roots == 0 || rroots == 0) { | 202     if (roots == 0 || rroots == 0) { | 
| 203         // FIXME: we don't have a solution in this case. The interim solution | 203         // FIXME: we don't have a solution in this case. The interim solution | 
| 204         // is to mark the edges as unsortable, exclude them from this and | 204         // is to mark the edges as unsortable, exclude them from this and | 
| 205         // future computations, and allow the returned path to be fragmented | 205         // future computations, and allow the returned path to be fragmented | 
| 206         fUnsortable = true; | 206         fUnsortable = true; | 
| 207         return COMPARE_RESULT("roots == 0 || rroots == 0", this < &rh); | 207         return COMPARE_RESULT("roots == 0 || rroots == 0", this < &rh); | 
| 208     } | 208     } | 
| 209     SkASSERT(fSide != 0 && rh.fSide != 0); | 209     SkASSERT(fSide != 0 && rh.fSide != 0); | 
| 210     SkASSERT(fSide * rh.fSide > 0); // both are the same sign | 210     if (fSide * rh.fSide < 0) { | 
|  | 211         fUnsortable = true; | 
|  | 212         return COMPARE_RESULT("14 fSide * rh.fSide < 0", this < &rh); | 
|  | 213     } | 
| 211     SkDPoint lLoc; | 214     SkDPoint lLoc; | 
| 212     double best = SK_ScalarInfinity; | 215     double best = SK_ScalarInfinity; | 
| 213 #if DEBUG_SORT | 216 #if DEBUG_SORT | 
| 214     SkDebugf("lh=%d rh=%d use-lh=%d ray={{%1.9g,%1.9g}, {%1.9g,%1.9g}} %c\n", | 217     SkDebugf("lh=%d rh=%d use-lh=%d ray={{%1.9g,%1.9g}, {%1.9g,%1.9g}} %c\n", | 
| 215             fSegment->debugID(), rh.fSegment->debugID(), useThis, ray[0].fX, ray
     [0].fY, | 218             fSegment->debugID(), rh.fSegment->debugID(), useThis, ray[0].fX, ray
     [0].fY, | 
| 216             ray[1].fX, ray[1].fY, "-+"[fSide > 0]); | 219             ray[1].fX, ray[1].fY, "-+"[fSide > 0]); | 
| 217 #endif | 220 #endif | 
| 218     for (int index = 0; index < roots; ++index) { | 221     for (int index = 0; index < roots; ++index) { | 
| 219         SkDPoint loc = i.pt(index); | 222         SkDPoint loc = i.pt(index); | 
| 220         SkDVector dxy = loc - ray[0]; | 223         SkDVector dxy = loc - ray[0]; | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 239                 best, dist, "><"[fSide < 0], rLoc.fX, rLoc.fY, dxy.fX, dxy.fY); | 242                 best, dist, "><"[fSide < 0], rLoc.fX, rLoc.fY, dxy.fX, dxy.fY); | 
| 240 #endif | 243 #endif | 
| 241         if (best > dist) { | 244         if (best > dist) { | 
| 242             flip = true; | 245             flip = true; | 
| 243             break; | 246             break; | 
| 244         } | 247         } | 
| 245     } | 248     } | 
| 246     if (flip) { | 249     if (flip) { | 
| 247         leftLessThanRight = !leftLessThanRight; | 250         leftLessThanRight = !leftLessThanRight; | 
| 248     } | 251     } | 
| 249     return COMPARE_RESULT("14 leftLessThanRight", leftLessThanRight); | 252     return COMPARE_RESULT("15 leftLessThanRight", leftLessThanRight); | 
| 250 } | 253 } | 
| 251 | 254 | 
| 252 bool SkOpAngle::isHorizontal() const { | 255 bool SkOpAngle::isHorizontal() const { | 
| 253     return dy() == 0 && fSegment->verb() == SkPath::kLine_Verb; | 256     return dy() == 0 && fSegment->verb() == SkPath::kLine_Verb; | 
| 254 } | 257 } | 
| 255 | 258 | 
| 256 // lengthen cannot cross opposite angle | 259 // lengthen cannot cross opposite angle | 
| 257 bool SkOpAngle::lengthen(const SkOpAngle& opp) { | 260 bool SkOpAngle::lengthen(const SkOpAngle& opp) { | 
| 258     if (fSegment->other(fEnd) == opp.fSegment) { | 261     if (fSegment->other(fEnd) == opp.fSegment) { | 
| 259         return false; | 262         return false; | 
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 421     const SkOpSpan& spanMin = fStart < fEnd ? spanStart : spanEnd; | 424     const SkOpSpan& spanMin = fStart < fEnd ? spanStart : spanEnd; | 
| 422     SkDebugf("id=%d (%1.9g,%1.9g) start=%d (%1.9g) end=%d (%1.9g) sumWind=", | 425     SkDebugf("id=%d (%1.9g,%1.9g) start=%d (%1.9g) end=%d (%1.9g) sumWind=", | 
| 423             fSegment->debugID(), fSegment->xAtT(fStart), fSegment->yAtT(fStart), | 426             fSegment->debugID(), fSegment->xAtT(fStart), fSegment->yAtT(fStart), | 
| 424             fStart, spanStart.fT, fEnd, spanEnd.fT); | 427             fStart, spanStart.fT, fEnd, spanEnd.fT); | 
| 425     SkPathOpsDebug::WindingPrintf(spanMin.fWindSum); | 428     SkPathOpsDebug::WindingPrintf(spanMin.fWindSum); | 
| 426     SkDebugf(" oppWind="); | 429     SkDebugf(" oppWind="); | 
| 427     SkPathOpsDebug::WindingPrintf(spanMin.fOppSum), | 430     SkPathOpsDebug::WindingPrintf(spanMin.fOppSum), | 
| 428     SkDebugf(" done=%d\n", spanMin.fDone); | 431     SkDebugf(" done=%d\n", spanMin.fDone); | 
| 429 } | 432 } | 
| 430 #endif | 433 #endif | 
| OLD | NEW | 
|---|