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 |