| 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]);
|
| }
|
| }
|
|
|
|
|