| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 The Android Open Source Project |
| 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 | 7 |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include "SkBuffer.h" | 9 #include "SkBuffer.h" |
| 10 #include "SkCubicClipper.h" | 10 #include "SkCubicClipper.h" |
| (...skipping 1549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1560 0, // kClose | 1560 0, // kClose |
| 1561 0 // kDone | 1561 0 // kDone |
| 1562 }; | 1562 }; |
| 1563 | 1563 |
| 1564 SkASSERT(verb < SK_ARRAY_COUNT(gPtsInVerb)); | 1564 SkASSERT(verb < SK_ARRAY_COUNT(gPtsInVerb)); |
| 1565 return gPtsInVerb[verb]; | 1565 return gPtsInVerb[verb]; |
| 1566 } | 1566 } |
| 1567 | 1567 |
| 1568 // ignore the last point of the 1st contour | 1568 // ignore the last point of the 1st contour |
| 1569 void SkPath::reversePathTo(const SkPath& path) { | 1569 void SkPath::reversePathTo(const SkPath& path) { |
| 1570 const uint8_t* verbs = path.fPathRef->verbsMemBegin(); // points at the last
verb | 1570 int i, vcount = path.fPathRef->countVerbs(); |
| 1571 if (!verbs) { // empty path returns nullptr | 1571 // exit early if the path is empty, or just has a moveTo. |
| 1572 if (vcount < 2) { |
| 1572 return; | 1573 return; |
| 1573 } | 1574 } |
| 1574 const uint8_t* verbsEnd = path.fPathRef->verbs() - 1; // points just past th
e first verb | |
| 1575 SkASSERT(verbsEnd[0] == kMove_Verb); | |
| 1576 const SkPoint* pts = path.fPathRef->pointsEnd() - 1; | |
| 1577 const SkScalar* conicWeights = path.fPathRef->conicWeightsEnd(); | |
| 1578 | 1575 |
| 1579 while (verbs < verbsEnd) { | 1576 SkPathRef::Editor(&fPathRef, vcount, path.countPoints()); |
| 1580 uint8_t v = *verbs++; | 1577 |
| 1581 pts -= pts_in_verb(v); | 1578 const uint8_t* verbs = path.fPathRef->verbs(); |
| 1582 switch (v) { | 1579 const SkPoint* pts = path.fPathRef->points(); |
| 1580 const SkScalar* conicWeights = path.fPathRef->conicWeights(); |
| 1581 |
| 1582 SkASSERT(verbs[~0] == kMove_Verb); |
| 1583 for (i = 1; i < vcount; ++i) { |
| 1584 unsigned v = verbs[~i]; |
| 1585 int n = pts_in_verb(v); |
| 1586 if (n == 0) { |
| 1587 break; |
| 1588 } |
| 1589 pts += n; |
| 1590 conicWeights += (SkPath::kConic_Verb == v); |
| 1591 } |
| 1592 |
| 1593 while (--i > 0) { |
| 1594 switch (verbs[~i]) { |
| 1583 case kLine_Verb: | 1595 case kLine_Verb: |
| 1584 this->lineTo(pts[0]); | 1596 this->lineTo(pts[-1].fX, pts[-1].fY); |
| 1585 break; | 1597 break; |
| 1586 case kQuad_Verb: | 1598 case kQuad_Verb: |
| 1587 this->quadTo(pts[1], pts[0]); | 1599 this->quadTo(pts[-1].fX, pts[-1].fY, pts[-2].fX, pts[-2].fY); |
| 1588 break; | 1600 break; |
| 1589 case kConic_Verb: | 1601 case kConic_Verb: |
| 1590 this->conicTo(pts[1], pts[0], *--conicWeights); | 1602 this->conicTo(pts[-1], pts[-2], *--conicWeights); |
| 1591 break; | 1603 break; |
| 1592 case kCubic_Verb: | 1604 case kCubic_Verb: |
| 1593 this->cubicTo(pts[2], pts[1], pts[0]); | 1605 this->cubicTo(pts[-1].fX, pts[-1].fY, pts[-2].fX, pts[-2].fY, |
| 1594 break; | 1606 pts[-3].fX, pts[-3].fY); |
| 1595 case kClose_Verb: | |
| 1596 SkASSERT(verbs - path.fPathRef->verbsMemBegin() == 1); | |
| 1597 break; | 1607 break; |
| 1598 default: | 1608 default: |
| 1599 SkDEBUGFAIL("bad verb"); | 1609 SkDEBUGFAIL("bad verb"); |
| 1600 break; | 1610 break; |
| 1601 } | 1611 } |
| 1612 pts -= pts_in_verb(verbs[~i]); |
| 1602 } | 1613 } |
| 1603 } | 1614 } |
| 1604 | 1615 |
| 1605 void SkPath::reverseAddPath(const SkPath& src) { | 1616 void SkPath::reverseAddPath(const SkPath& src) { |
| 1606 SkPathRef::Editor ed(&fPathRef, src.fPathRef->countPoints(), src.fPathRef->c
ountVerbs()); | 1617 SkPathRef::Editor ed(&fPathRef, src.fPathRef->countPoints(), src.fPathRef->c
ountVerbs()); |
| 1607 | 1618 |
| 1608 const SkPoint* pts = src.fPathRef->pointsEnd(); | 1619 const SkPoint* pts = src.fPathRef->pointsEnd(); |
| 1609 // we will iterator through src's verbs backwards | 1620 // we will iterator through src's verbs backwards |
| 1610 const uint8_t* verbs = src.fPathRef->verbsMemBegin(); // points at the last
verb | 1621 const uint8_t* verbs = src.fPathRef->verbsMemBegin(); // points at the last
verb |
| 1611 const uint8_t* verbsEnd = src.fPathRef->verbs(); // points just past the fir
st verb | 1622 const uint8_t* verbsEnd = src.fPathRef->verbs(); // points just past the fir
st verb |
| (...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3380 path->arcTo(oval, startAngle, 180.f, false); | 3391 path->arcTo(oval, startAngle, 180.f, false); |
| 3381 startAngle += 180.f; | 3392 startAngle += 180.f; |
| 3382 forceMoveTo = false; | 3393 forceMoveTo = false; |
| 3383 sweepAngle -= 360.f; | 3394 sweepAngle -= 360.f; |
| 3384 } | 3395 } |
| 3385 path->arcTo(oval, startAngle, sweepAngle, forceMoveTo); | 3396 path->arcTo(oval, startAngle, sweepAngle, forceMoveTo); |
| 3386 if (useCenter) { | 3397 if (useCenter) { |
| 3387 path->close(); | 3398 path->close(); |
| 3388 } | 3399 } |
| 3389 } | 3400 } |
| OLD | NEW |