Index: src/core/SkPath.cpp |
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp |
index 6dbcda2233f530542d3396836b3e0ffc94097568..c1b63271938849b284daf766df9fde2be196e41f 100644 |
--- a/src/core/SkPath.cpp |
+++ b/src/core/SkPath.cpp |
@@ -1567,38 +1567,49 @@ |
// ignore the last point of the 1st contour |
void SkPath::reversePathTo(const SkPath& path) { |
- const uint8_t* verbs = path.fPathRef->verbsMemBegin(); // points at the last verb |
- if (!verbs) { // empty path returns nullptr |
+ int i, vcount = path.fPathRef->countVerbs(); |
+ // exit early if the path is empty, or just has a moveTo. |
+ if (vcount < 2) { |
return; |
} |
- const uint8_t* verbsEnd = path.fPathRef->verbs() - 1; // points just past the first verb |
- SkASSERT(verbsEnd[0] == kMove_Verb); |
- const SkPoint* pts = path.fPathRef->pointsEnd() - 1; |
- const SkScalar* conicWeights = path.fPathRef->conicWeightsEnd(); |
- |
- while (verbs < verbsEnd) { |
- uint8_t v = *verbs++; |
- pts -= pts_in_verb(v); |
- switch (v) { |
+ |
+ SkPathRef::Editor(&fPathRef, vcount, path.countPoints()); |
+ |
+ const uint8_t* verbs = path.fPathRef->verbs(); |
+ const SkPoint* pts = path.fPathRef->points(); |
+ const SkScalar* conicWeights = path.fPathRef->conicWeights(); |
+ |
+ SkASSERT(verbs[~0] == kMove_Verb); |
+ for (i = 1; i < vcount; ++i) { |
+ unsigned v = verbs[~i]; |
+ int n = pts_in_verb(v); |
+ if (n == 0) { |
+ break; |
+ } |
+ pts += n; |
+ conicWeights += (SkPath::kConic_Verb == v); |
+ } |
+ |
+ while (--i > 0) { |
+ switch (verbs[~i]) { |
case kLine_Verb: |
- this->lineTo(pts[0]); |
+ this->lineTo(pts[-1].fX, pts[-1].fY); |
break; |
case kQuad_Verb: |
- this->quadTo(pts[1], pts[0]); |
+ this->quadTo(pts[-1].fX, pts[-1].fY, pts[-2].fX, pts[-2].fY); |
break; |
case kConic_Verb: |
- this->conicTo(pts[1], pts[0], *--conicWeights); |
+ this->conicTo(pts[-1], pts[-2], *--conicWeights); |
break; |
case kCubic_Verb: |
- this->cubicTo(pts[2], pts[1], pts[0]); |
- break; |
- case kClose_Verb: |
- SkASSERT(verbs - path.fPathRef->verbsMemBegin() == 1); |
+ this->cubicTo(pts[-1].fX, pts[-1].fY, pts[-2].fX, pts[-2].fY, |
+ pts[-3].fX, pts[-3].fY); |
break; |
default: |
SkDEBUGFAIL("bad verb"); |
break; |
} |
+ pts -= pts_in_verb(verbs[~i]); |
} |
} |