diff options
author | 2016-11-04 11:38:41 -0700 | |
---|---|---|
committer | 2016-11-04 11:38:41 -0700 | |
commit | d8db392be9dd1887df04b10b5670991d6b098c17 (patch) | |
tree | e968ba01ec4043801bf6a74f0ff87de1d6f78f07 /src/core | |
parent | 8bd45cd98eb0eff1fb074fac9f469fdad5ca51f9 (diff) |
use reversePathTo in place of addPathReverse
Path ops was using addPathReverse, instead of reversePathTo.
The former adds a moveTo always, and the latter requires
that the caller add the moveTo if needed.
Simplify the reversePathTo implementation.
R=reed@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2481463002
Review-Url: https://codereview.chromium.org/2481463002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkPath.cpp | 45 |
1 files changed, 17 insertions, 28 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp index c1b6327193..6dbcda2233 100644 --- a/src/core/SkPath.cpp +++ b/src/core/SkPath.cpp @@ -1567,49 +1567,38 @@ static int pts_in_verb(unsigned verb) { // ignore the last point of the 1st contour void SkPath::reversePathTo(const SkPath& path) { - int i, vcount = path.fPathRef->countVerbs(); - // exit early if the path is empty, or just has a moveTo. - if (vcount < 2) { + const uint8_t* verbs = path.fPathRef->verbsMemBegin(); // points at the last verb + if (!verbs) { // empty path returns nullptr 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(); - 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]) { + while (verbs < verbsEnd) { + uint8_t v = *verbs++; + pts -= pts_in_verb(v); + switch (v) { case kLine_Verb: - this->lineTo(pts[-1].fX, pts[-1].fY); + this->lineTo(pts[0]); break; case kQuad_Verb: - this->quadTo(pts[-1].fX, pts[-1].fY, pts[-2].fX, pts[-2].fY); + this->quadTo(pts[1], pts[0]); break; case kConic_Verb: - this->conicTo(pts[-1], pts[-2], *--conicWeights); + this->conicTo(pts[1], pts[0], *--conicWeights); break; case kCubic_Verb: - this->cubicTo(pts[-1].fX, pts[-1].fY, pts[-2].fX, pts[-2].fY, - pts[-3].fX, pts[-3].fY); + this->cubicTo(pts[2], pts[1], pts[0]); + break; + case kClose_Verb: + SkASSERT(verbs - path.fPathRef->verbsMemBegin() == 1); break; default: SkDEBUGFAIL("bad verb"); break; } - pts -= pts_in_verb(verbs[~i]); } } |