aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/dashcubics.cpp
diff options
context:
space:
mode:
authorGravatar caryclark <caryclark@google.com>2015-02-23 12:47:03 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-23 12:47:03 -0800
commit6df8e3495a677a5df2476d2ff3bbe878fd178e4b (patch)
treed54fa706d0eb9bad1656c5071a0cb2569d672c3c /gm/dashcubics.cpp
parentf056bd1e01078c02b35d00c22d55ef52b017ef7f (diff)
break out of cubic stroker loop on degenerate case
The looper can generate more than one quad, but if any one is degenerate, give up, but not before generating the state for the line join to produce the correct end. Before, the early return allowed the inside path to contain multiple movetos that caused reversePath to assert. R=reed@google.com Review URL: https://codereview.chromium.org/948043002
Diffstat (limited to 'gm/dashcubics.cpp')
-rw-r--r--gm/dashcubics.cpp45
1 files changed, 28 insertions, 17 deletions
diff --git a/gm/dashcubics.cpp b/gm/dashcubics.cpp
index 9a7d6d7482..246d0548ca 100644
--- a/gm/dashcubics.cpp
+++ b/gm/dashcubics.cpp
@@ -26,30 +26,16 @@ protected:
}
virtual SkISize onISize() {
- return SkISize::Make(640, 480);
+ return SkISize::Make(860, 700);
}
- virtual void onDraw(SkCanvas* canvas) {
- SkPath path;
- const char* d = "M 337,98 C 250,141 250,212 250,212 C 250,212 250,212 250,212"
- "C 250,212 250,212 250,212 C 250,212 250,141 163,98 C 156,195 217,231 217,231"
- "C 217,231 217,231 217,231 C 217,231 217,231 217,231 C 217,231 156,195 75,250"
- "C 156,305 217,269 217,269 C 217,269 217,269 217,269 C 217,269 217,269 217,269"
- "C 217,269 156,305 163,402 C 250,359 250,288 250,288 C 250,288 250,288 250,288"
- "C 250,288 250,288 250,288 C 250,288 250,359 338,402 C 345,305 283,269 283,269"
- "C 283,269 283,269 283,269 C 283,269 283,269 283,269 C 283,269 345,305 425,250"
- "C 344,195 283,231 283,231 C 283,231 283,231 283,231 C 283,231 283,231 283,231"
- "C 283,231 344,195 338,98";
-
- SkParsePath::FromSVGString(d, &path);
-
- SkScalar intervals[] = { 5, 10 };
+ void flower(SkCanvas* canvas, const SkPath& path, SkScalar intervals[2], SkPaint::Join join) {
SkPathEffect* pe = SkDashPathEffect::Create(intervals, 2, 0);
SkPaint paint;
paint.setAntiAlias(true);
paint.setStyle(SkPaint::kStroke_Style);
-
+ paint.setStrokeJoin(join);
paint.setStrokeWidth(42);
canvas->drawPath(path, paint);
@@ -64,6 +50,31 @@ protected:
canvas->drawPath(path, paint);
}
+ virtual void onDraw(SkCanvas* canvas) {
+ SkPath path;
+ const char* d = "M 337,98 C 250,141 250,212 250,212 C 250,212 250,212 250,212"
+ "C 250,212 250,212 250,212 C 250,212 250,141 163,98 C 156,195 217,231 217,231"
+ "C 217,231 217,231 217,231 C 217,231 217,231 217,231 C 217,231 156,195 75,250"
+ "C 156,305 217,269 217,269 C 217,269 217,269 217,269 C 217,269 217,269 217,269"
+ "C 217,269 156,305 163,402 C 250,359 250,288 250,288 C 250,288 250,288 250,288"
+ "C 250,288 250,288 250,288 C 250,288 250,359 338,402 C 345,305 283,269 283,269"
+ "C 283,269 283,269 283,269 C 283,269 283,269 283,269 C 283,269 345,305 425,250"
+ "C 344,195 283,231 283,231 C 283,231 283,231 283,231 C 283,231 283,231 283,231"
+ "C 283,231 344,195 338,98";
+
+ SkParsePath::FromSVGString(d, &path);
+ canvas->translate(-35.f, -55.f);
+ for (int x = 0; x < 2; ++x) {
+ for (int y = 0; y < 2; ++y) {
+ canvas->save();
+ canvas->translate(x * 430.f, y * 355.f);
+ SkScalar intervals[] = { 5 + (x ? 0 : 0.0001f + 0.0001f), 10 };
+ flower(canvas, path, intervals, y ? SkPaint::kDefault_Join : SkPaint::kRound_Join);
+ canvas->restore();
+ }
+ }
+ }
+
private:
typedef GM INHERITED;
};