never check for degenerates in path::iter
This does not appear to be used externally, and only internally in 3
sites in GPU, which we can handle explicitly.
For now you can still pass bools to Iter::next() but they are ignored.
After this lands, I will update the callers to remove those.
FWIW: none of our other tests or gms seem to notice this change...
Bug: skia:9339
Change-Id: If40077b1ebb3d47cfce0ec43996ff272318e4a62
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/235104
Reviewed-by: Chris Dalton <csmartdalton@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/gpu/ops/GrAAConvexPathRenderer.cpp b/src/gpu/ops/GrAAConvexPathRenderer.cpp
index 5944aef..5021aa7 100644
--- a/src/gpu/ops/GrAAConvexPathRenderer.cpp
+++ b/src/gpu/ops/GrAAConvexPathRenderer.cpp
@@ -289,42 +289,50 @@
for (;;) {
SkPoint pts[4];
- SkPath::Verb verb = iter.next(pts, true, true);
+ SkPath::Verb verb = iter.next(pts);
switch (verb) {
case SkPath::kMove_Verb:
m.mapPoints(pts, 1);
update_degenerate_test(°enerateData, pts[0]);
break;
case SkPath::kLine_Verb: {
- m.mapPoints(&pts[1], 1);
- update_degenerate_test(°enerateData, pts[1]);
- add_line_to_segment(pts[1], segments);
+ if (!SkPathPriv::AllPointsEq(pts, 2)) {
+ m.mapPoints(&pts[1], 1);
+ update_degenerate_test(°enerateData, pts[1]);
+ add_line_to_segment(pts[1], segments);
+ }
break;
}
case SkPath::kQuad_Verb:
- m.mapPoints(pts, 3);
- update_degenerate_test(°enerateData, pts[1]);
- update_degenerate_test(°enerateData, pts[2]);
- add_quad_segment(pts, segments);
+ if (!SkPathPriv::AllPointsEq(pts, 3)) {
+ m.mapPoints(pts, 3);
+ update_degenerate_test(°enerateData, pts[1]);
+ update_degenerate_test(°enerateData, pts[2]);
+ add_quad_segment(pts, segments);
+ }
break;
case SkPath::kConic_Verb: {
- m.mapPoints(pts, 3);
- SkScalar weight = iter.conicWeight();
- SkAutoConicToQuads converter;
- const SkPoint* quadPts = converter.computeQuads(pts, weight, 0.25f);
- for (int i = 0; i < converter.countQuads(); ++i) {
- update_degenerate_test(°enerateData, quadPts[2*i + 1]);
- update_degenerate_test(°enerateData, quadPts[2*i + 2]);
- add_quad_segment(quadPts + 2*i, segments);
+ if (!SkPathPriv::AllPointsEq(pts, 3)) {
+ m.mapPoints(pts, 3);
+ SkScalar weight = iter.conicWeight();
+ SkAutoConicToQuads converter;
+ const SkPoint* quadPts = converter.computeQuads(pts, weight, 0.25f);
+ for (int i = 0; i < converter.countQuads(); ++i) {
+ update_degenerate_test(°enerateData, quadPts[2*i + 1]);
+ update_degenerate_test(°enerateData, quadPts[2*i + 2]);
+ add_quad_segment(quadPts + 2*i, segments);
+ }
}
break;
}
case SkPath::kCubic_Verb: {
- m.mapPoints(pts, 4);
- update_degenerate_test(°enerateData, pts[1]);
- update_degenerate_test(°enerateData, pts[2]);
- update_degenerate_test(°enerateData, pts[3]);
- add_cubic_segments(pts, dir, segments);
+ if (!SkPathPriv::AllPointsEq(pts, 4)) {
+ m.mapPoints(pts, 4);
+ update_degenerate_test(°enerateData, pts[1]);
+ update_degenerate_test(°enerateData, pts[2]);
+ update_degenerate_test(°enerateData, pts[3]);
+ add_cubic_segments(pts, dir, segments);
+ }
break;
}
case SkPath::kDone_Verb:
diff --git a/src/gpu/ops/GrAAConvexTessellator.cpp b/src/gpu/ops/GrAAConvexTessellator.cpp
index 5e545d4..0e753a1 100644
--- a/src/gpu/ops/GrAAConvexTessellator.cpp
+++ b/src/gpu/ops/GrAAConvexTessellator.cpp
@@ -394,19 +394,27 @@
SkPath::Iter iter(path, true);
SkPoint pts[4];
SkPath::Verb verb;
- while ((verb = iter.next(pts, true, true)) != SkPath::kDone_Verb) {
+ while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
switch (verb) {
case SkPath::kLine_Verb:
- this->lineTo(m, pts[1], kSharp_CurveState);
+ if (!SkPathPriv::AllPointsEq(pts, 2)) {
+ this->lineTo(m, pts[1], kSharp_CurveState);
+ }
break;
case SkPath::kQuad_Verb:
- this->quadTo(m, pts);
+ if (!SkPathPriv::AllPointsEq(pts, 3)) {
+ this->quadTo(m, pts);
+ }
break;
case SkPath::kCubic_Verb:
- this->cubicTo(m, pts);
+ if (!SkPathPriv::AllPointsEq(pts, 4)) {
+ this->cubicTo(m, pts);
+ }
break;
case SkPath::kConic_Verb:
- this->conicTo(m, pts, iter.conicWeight());
+ if (!SkPathPriv::AllPointsEq(pts, 3)) {
+ this->conicTo(m, pts, iter.conicWeight());
+ }
break;
case SkPath::kMove_Verb:
case SkPath::kClose_Verb:
diff --git a/src/gpu/ops/GrAAHairLinePathRenderer.cpp b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
index 6b054f8..748946b 100644
--- a/src/gpu/ops/GrAAHairLinePathRenderer.cpp
+++ b/src/gpu/ops/GrAAHairLinePathRenderer.cpp
@@ -312,7 +312,7 @@
for (;;) {
SkPoint pathPts[4];
- SkPath::Verb verb = iter.next(pathPts, false);
+ SkPath::Verb verb = iter.next(pathPts);
switch (verb) {
case SkPath::kConic_Verb:
if (convertConicsToQuads) {
diff --git a/src/gpu/ops/GrDefaultPathRenderer.cpp b/src/gpu/ops/GrDefaultPathRenderer.cpp
index 2c4db58..f31e7e9 100644
--- a/src/gpu/ops/GrDefaultPathRenderer.cpp
+++ b/src/gpu/ops/GrDefaultPathRenderer.cpp
@@ -151,7 +151,7 @@
bool done = false;
while (!done) {
- SkPath::Verb verb = iter.next(pts, false);
+ SkPath::Verb verb = iter.next(pts);
switch (verb) {
case SkPath::kMove_Verb:
this->moveTo(pts[0]);
@@ -183,7 +183,7 @@
SkPath::Verb verb;
SkPoint pts[4];
- while ((verb = iter.next(pts, false)) != SkPath::kDone_Verb) {
+ while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
if (SkPath::kMove_Verb == verb && !first) {
return true;
}