| 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 "SkOpCoincidence.h" | 7 #include "SkOpCoincidence.h" | 
| 8 #include "SkOpContour.h" | 8 #include "SkOpContour.h" | 
| 9 #include "SkOpSegment.h" | 9 #include "SkOpSegment.h" | 
| 10 #include "SkPathWriter.h" | 10 #include "SkPathWriter.h" | 
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 233                 SkOpPtT* ptT = segment->addT(i[0][0], SkOpSegment::kAllowAlias, 
      allocator); | 233                 SkOpPtT* ptT = segment->addT(i[0][0], SkOpSegment::kAllowAlias, 
      allocator); | 
| 234                 ptT->fPt = newPt; | 234                 ptT->fPt = newPt; | 
| 235                 endPtT.addOpp(ptT); | 235                 endPtT.addOpp(ptT); | 
| 236             } | 236             } | 
| 237     nextSegment: | 237     nextSegment: | 
| 238             ; | 238             ; | 
| 239         } while ((segment = segment->next())); | 239         } while ((segment = segment->next())); | 
| 240     } while ((current = current->next())); | 240     } while ((current = current->next())); | 
| 241 } | 241 } | 
| 242 | 242 | 
| 243 void SkOpSegment::addCurveTo(const SkOpSpanBase* start, const SkOpSpanBase* end, | 243 bool SkOpSegment::addCurveTo(const SkOpSpanBase* start, const SkOpSpanBase* end, | 
| 244         SkPathWriter* path, bool active) const { | 244         SkPathWriter* path) const { | 
|  | 245     if (start->starter(end)->alreadyAdded()) { | 
|  | 246         return false; | 
|  | 247     } | 
| 245     SkOpCurve edge; | 248     SkOpCurve edge; | 
| 246     const SkPoint* ePtr; | 249     const SkPoint* ePtr; | 
| 247     SkScalar eWeight; | 250     SkScalar eWeight; | 
| 248     if ((start == &fHead && end == &fTail) || (start == &fTail && end == &fHead)
      ) { | 251     if ((start == &fHead && end == &fTail) || (start == &fTail && end == &fHead)
      ) { | 
| 249         ePtr = fPts; | 252         ePtr = fPts; | 
| 250         eWeight = fWeight; | 253         eWeight = fWeight; | 
| 251     } else { | 254     } else { | 
| 252     // OPTIMIZE? if not active, skip remainder and return xyAtT(end) | 255     // OPTIMIZE? if not active, skip remainder and return xyAtT(end) | 
| 253         subDivide(start, end, &edge); | 256         subDivide(start, end, &edge); | 
| 254         ePtr = edge.fPts; | 257         ePtr = edge.fPts; | 
| 255         eWeight = edge.fWeight; | 258         eWeight = edge.fWeight; | 
| 256     } | 259     } | 
| 257     if (active) { | 260     bool reverse = ePtr == fPts && start != &fHead; | 
| 258         bool reverse = ePtr == fPts && start != &fHead; | 261     if (reverse) { | 
| 259         if (reverse) { | 262         path->deferredMoveLine(ePtr[SkPathOpsVerbToPoints(fVerb)]); | 
| 260             path->deferredMoveLine(ePtr[SkPathOpsVerbToPoints(fVerb)]); | 263         switch (fVerb) { | 
| 261             switch (fVerb) { | 264             case SkPath::kLine_Verb: | 
| 262                 case SkPath::kLine_Verb: | 265                 path->deferredLine(ePtr[0]); | 
| 263                     path->deferredLine(ePtr[0]); | 266                 break; | 
| 264                     break; | 267             case SkPath::kQuad_Verb: | 
| 265                 case SkPath::kQuad_Verb: | 268                 path->quadTo(ePtr[1], ePtr[0]); | 
| 266                     path->quadTo(ePtr[1], ePtr[0]); | 269                 break; | 
| 267                     break; | 270             case SkPath::kConic_Verb: | 
| 268                 case SkPath::kConic_Verb: | 271                 path->conicTo(ePtr[1], ePtr[0], eWeight); | 
| 269                     path->conicTo(ePtr[1], ePtr[0], eWeight); | 272                 break; | 
| 270                     break; | 273             case SkPath::kCubic_Verb: | 
| 271                 case SkPath::kCubic_Verb: | 274                 path->cubicTo(ePtr[2], ePtr[1], ePtr[0]); | 
| 272                     path->cubicTo(ePtr[2], ePtr[1], ePtr[0]); | 275                 break; | 
| 273                     break; | 276             default: | 
| 274                 default: | 277                 SkASSERT(0); | 
| 275                     SkASSERT(0); | 278         } | 
| 276             } | 279     } else { | 
| 277        } else { | 280         path->deferredMoveLine(ePtr[0]); | 
| 278             path->deferredMoveLine(ePtr[0]); | 281         switch (fVerb) { | 
| 279             switch (fVerb) { | 282             case SkPath::kLine_Verb: | 
| 280                 case SkPath::kLine_Verb: | 283                 path->deferredLine(ePtr[1]); | 
| 281                     path->deferredLine(ePtr[1]); | 284                 break; | 
| 282                     break; | 285             case SkPath::kQuad_Verb: | 
| 283                 case SkPath::kQuad_Verb: | 286                 path->quadTo(ePtr[1], ePtr[2]); | 
| 284                     path->quadTo(ePtr[1], ePtr[2]); | 287                 break; | 
| 285                     break; | 288             case SkPath::kConic_Verb: | 
| 286                 case SkPath::kConic_Verb: | 289                 path->conicTo(ePtr[1], ePtr[2], eWeight); | 
| 287                     path->conicTo(ePtr[1], ePtr[2], eWeight); | 290                 break; | 
| 288                     break; | 291             case SkPath::kCubic_Verb: | 
| 289                 case SkPath::kCubic_Verb: | 292                 path->cubicTo(ePtr[1], ePtr[2], ePtr[3]); | 
| 290                     path->cubicTo(ePtr[1], ePtr[2], ePtr[3]); | 293                 break; | 
| 291                     break; | 294             default: | 
| 292                 default: | 295                 SkASSERT(0); | 
| 293                     SkASSERT(0); |  | 
| 294             } |  | 
| 295         } | 296         } | 
| 296     } | 297     } | 
|  | 298     return true; | 
| 297 } | 299 } | 
| 298 | 300 | 
| 299 SkOpPtT* SkOpSegment::addMissing(double t, SkOpSegment* opp, SkChunkAlloc* alloc
      ator) { | 301 SkOpPtT* SkOpSegment::addMissing(double t, SkOpSegment* opp, SkChunkAlloc* alloc
      ator) { | 
| 300     SkOpSpanBase* existing = nullptr; | 302     SkOpSpanBase* existing = nullptr; | 
| 301     SkOpSpanBase* test = &fHead; | 303     SkOpSpanBase* test = &fHead; | 
| 302     double testT; | 304     double testT; | 
| 303     do { | 305     do { | 
| 304         if ((testT = test->ptT()->fT) >= t) { | 306         if ((testT = test->ptT()->fT) >= t) { | 
| 305             if (testT == t) { | 307             if (testT == t) { | 
| 306                 existing = test; | 308                 existing = test; | 
| (...skipping 1462 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1769     int absOut = SkTAbs(outerWinding); | 1771     int absOut = SkTAbs(outerWinding); | 
| 1770     int absIn = SkTAbs(innerWinding); | 1772     int absIn = SkTAbs(innerWinding); | 
| 1771     bool result = absOut == absIn ? outerWinding < 0 : absOut < absIn; | 1773     bool result = absOut == absIn ? outerWinding < 0 : absOut < absIn; | 
| 1772     return result; | 1774     return result; | 
| 1773 } | 1775 } | 
| 1774 | 1776 | 
| 1775 int SkOpSegment::windSum(const SkOpAngle* angle) const { | 1777 int SkOpSegment::windSum(const SkOpAngle* angle) const { | 
| 1776     const SkOpSpan* minSpan = angle->start()->starter(angle->end()); | 1778     const SkOpSpan* minSpan = angle->start()->starter(angle->end()); | 
| 1777     return minSpan->windSum(); | 1779     return minSpan->windSum(); | 
| 1778 } | 1780 } | 
| OLD | NEW | 
|---|