Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: src/core/SkPath.cpp

Issue 2478763003: Revert of use reversePathTo in place of addPathReverse (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « include/pathops/SkPathOps.h ('k') | src/pathops/SkOpBuilder.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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]);
}
}
« no previous file with comments | « include/pathops/SkPathOps.h ('k') | src/pathops/SkOpBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698