| 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 1461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1472 SkPoint midPt = this->ptAtT(midT); | 1472 SkPoint midPt = this->ptAtT(midT); |
| 1473 double seDistSq = SkTMax(pt1.distanceToSqd(pt2) * 2, FLT_EPSILON * 2); | 1473 double seDistSq = SkTMax(pt1.distanceToSqd(pt2) * 2, FLT_EPSILON * 2); |
| 1474 return midPt.distanceToSqd(pt1) > seDistSq || midPt.distanceToSqd(pt2) > seD
istSq; | 1474 return midPt.distanceToSqd(pt1) > seDistSq || midPt.distanceToSqd(pt2) > seD
istSq; |
| 1475 } | 1475 } |
| 1476 | 1476 |
| 1477 void SkOpSegment::setUpWindings(SkOpSpanBase* start, SkOpSpanBase* end, int* sum
MiWinding, | 1477 void SkOpSegment::setUpWindings(SkOpSpanBase* start, SkOpSpanBase* end, int* sum
MiWinding, |
| 1478 int* maxWinding, int* sumWinding) { | 1478 int* maxWinding, int* sumWinding) { |
| 1479 int deltaSum = SpanSign(start, end); | 1479 int deltaSum = SpanSign(start, end); |
| 1480 *maxWinding = *sumMiWinding; | 1480 *maxWinding = *sumMiWinding; |
| 1481 *sumWinding = *sumMiWinding -= deltaSum; | 1481 *sumWinding = *sumMiWinding -= deltaSum; |
| 1482 SkASSERT(!DEBUG_LIMIT_WIND_SUM || abs(*sumWinding) <= DEBUG_LIMIT_WIND_SUM); | 1482 SkASSERT(!DEBUG_LIMIT_WIND_SUM || SkTAbs(*sumWinding) <= DEBUG_LIMIT_WIND_SU
M); |
| 1483 } | 1483 } |
| 1484 | 1484 |
| 1485 void SkOpSegment::setUpWindings(SkOpSpanBase* start, SkOpSpanBase* end, int* sum
MiWinding, | 1485 void SkOpSegment::setUpWindings(SkOpSpanBase* start, SkOpSpanBase* end, int* sum
MiWinding, |
| 1486 int* sumSuWinding, int* maxWinding, int* sumWinding, int* oppMaxWinding, | 1486 int* sumSuWinding, int* maxWinding, int* sumWinding, int* oppMaxWinding, |
| 1487 int* oppSumWinding) { | 1487 int* oppSumWinding) { |
| 1488 int deltaSum = SpanSign(start, end); | 1488 int deltaSum = SpanSign(start, end); |
| 1489 int oppDeltaSum = OppSign(start, end); | 1489 int oppDeltaSum = OppSign(start, end); |
| 1490 if (operand()) { | 1490 if (operand()) { |
| 1491 *maxWinding = *sumSuWinding; | 1491 *maxWinding = *sumSuWinding; |
| 1492 *sumWinding = *sumSuWinding -= deltaSum; | 1492 *sumWinding = *sumSuWinding -= deltaSum; |
| 1493 *oppMaxWinding = *sumMiWinding; | 1493 *oppMaxWinding = *sumMiWinding; |
| 1494 *oppSumWinding = *sumMiWinding -= oppDeltaSum; | 1494 *oppSumWinding = *sumMiWinding -= oppDeltaSum; |
| 1495 } else { | 1495 } else { |
| 1496 *maxWinding = *sumMiWinding; | 1496 *maxWinding = *sumMiWinding; |
| 1497 *sumWinding = *sumMiWinding -= deltaSum; | 1497 *sumWinding = *sumMiWinding -= deltaSum; |
| 1498 *oppMaxWinding = *sumSuWinding; | 1498 *oppMaxWinding = *sumSuWinding; |
| 1499 *oppSumWinding = *sumSuWinding -= oppDeltaSum; | 1499 *oppSumWinding = *sumSuWinding -= oppDeltaSum; |
| 1500 } | 1500 } |
| 1501 SkASSERT(!DEBUG_LIMIT_WIND_SUM || abs(*sumWinding) <= DEBUG_LIMIT_WIND_SUM); | 1501 SkASSERT(!DEBUG_LIMIT_WIND_SUM || SkTAbs(*sumWinding) <= DEBUG_LIMIT_WIND_SU
M); |
| 1502 SkASSERT(!DEBUG_LIMIT_WIND_SUM || abs(*oppSumWinding) <= DEBUG_LIMIT_WIND_SU
M); | 1502 SkASSERT(!DEBUG_LIMIT_WIND_SUM || SkTAbs(*oppSumWinding) <= DEBUG_LIMIT_WIND
_SUM); |
| 1503 } | 1503 } |
| 1504 | 1504 |
| 1505 void SkOpSegment::sortAngles() { | 1505 void SkOpSegment::sortAngles() { |
| 1506 SkOpSpanBase* span = &this->fHead; | 1506 SkOpSpanBase* span = &this->fHead; |
| 1507 do { | 1507 do { |
| 1508 SkOpAngle* fromAngle = span->fromAngle(); | 1508 SkOpAngle* fromAngle = span->fromAngle(); |
| 1509 SkOpAngle* toAngle = span->final() ? NULL : span->upCast()->toAngle(); | 1509 SkOpAngle* toAngle = span->final() ? NULL : span->upCast()->toAngle(); |
| 1510 if (!fromAngle && !toAngle) { | 1510 if (!fromAngle && !toAngle) { |
| 1511 continue; | 1511 continue; |
| 1512 } | 1512 } |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1767 SkOpSpanBase* endSpan = angle->end(); | 1767 SkOpSpanBase* endSpan = angle->end(); |
| 1768 return updateWinding(startSpan, endSpan); | 1768 return updateWinding(startSpan, endSpan); |
| 1769 } | 1769 } |
| 1770 | 1770 |
| 1771 // OPTIMIZATION: does the following also work, and is it any faster? | 1771 // OPTIMIZATION: does the following also work, and is it any faster? |
| 1772 // return outerWinding * innerWinding > 0 | 1772 // return outerWinding * innerWinding > 0 |
| 1773 // || ((outerWinding + innerWinding < 0) ^ ((outerWinding - innerWinding) <
0))) | 1773 // || ((outerWinding + innerWinding < 0) ^ ((outerWinding - innerWinding) <
0))) |
| 1774 bool SkOpSegment::UseInnerWinding(int outerWinding, int innerWinding) { | 1774 bool SkOpSegment::UseInnerWinding(int outerWinding, int innerWinding) { |
| 1775 SkASSERT(outerWinding != SK_MaxS32); | 1775 SkASSERT(outerWinding != SK_MaxS32); |
| 1776 SkASSERT(innerWinding != SK_MaxS32); | 1776 SkASSERT(innerWinding != SK_MaxS32); |
| 1777 int absOut = abs(outerWinding); | 1777 int absOut = SkTAbs(outerWinding); |
| 1778 int absIn = abs(innerWinding); | 1778 int absIn = SkTAbs(innerWinding); |
| 1779 bool result = absOut == absIn ? outerWinding < 0 : absOut < absIn; | 1779 bool result = absOut == absIn ? outerWinding < 0 : absOut < absIn; |
| 1780 return result; | 1780 return result; |
| 1781 } | 1781 } |
| 1782 | 1782 |
| 1783 int SkOpSegment::windSum(const SkOpAngle* angle) const { | 1783 int SkOpSegment::windSum(const SkOpAngle* angle) const { |
| 1784 const SkOpSpan* minSpan = angle->start()->starter(angle->end()); | 1784 const SkOpSpan* minSpan = angle->start()->starter(angle->end()); |
| 1785 return minSpan->windSum(); | 1785 return minSpan->windSum(); |
| 1786 } | 1786 } |
| OLD | NEW |