aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/strokes.cpp
diff options
context:
space:
mode:
authorGravatar caryclark <caryclark@google.com>2015-08-21 13:27:37 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-08-21 13:27:37 -0700
commitdd3c165828fffb369d0f4b13b48381169a0249a9 (patch)
tree91dd40e798e4a6a982b43e414102d57a7a4809b1 /gm/strokes.cpp
parent1cbdcde9116e9efb514236faf8cfa42649a041d1 (diff)
experiment with zero-length round capped line segments
If the endcap is not butt, draw the endcaps even when the line has zero length. If the dash length is zero, generate a zero length line segment. Treat a move followed by a close as a move followed by a zero-length line. R=reed@google.com,schenney@google.com BUG=422974 Review URL: https://codereview.chromium.org/1309753002
Diffstat (limited to 'gm/strokes.cpp')
-rw-r--r--gm/strokes.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/gm/strokes.cpp b/gm/strokes.cpp
index 73823907a3..e914d0a0b7 100644
--- a/gm/strokes.cpp
+++ b/gm/strokes.cpp
@@ -8,6 +8,8 @@
#include "gm.h"
#include "SkPath.h"
#include "SkRandom.h"
+#include "SkDashPathEffect.h"
+#include "SkParsePath.h"
#define W 400
#define H 400
@@ -76,6 +78,76 @@ private:
typedef skiagm::GM INHERITED;
};
+/* See
+ https://code.google.com/p/chromium/issues/detail?id=422974 and
+ http://jsfiddle.net/1xnku3sg/2/
+ */
+class ZeroLenStrokesGM : public skiagm::GM {
+ SkPath fMoveHfPath, fMoveZfPath, fDashedfPath, fRefPath[4];
+protected:
+ void onOnceBeforeDraw() override {
+
+ SkAssertResult(SkParsePath::FromSVGString("M0,0h0M10,0h0M20,0h0", &fMoveHfPath));
+ SkAssertResult(SkParsePath::FromSVGString("M0,0zM10,0zM20,0z", &fMoveZfPath));
+ SkAssertResult(SkParsePath::FromSVGString("M0,0h25", &fDashedfPath));
+
+ for (int i = 0; i < 3; ++i) {
+ fRefPath[0].addCircle(i * 10.f, 0, 5);
+ fRefPath[1].addCircle(i * 10.f, 0, 10);
+ fRefPath[2].addRect(i * 10.f - 4, -2, i * 10.f + 4, 6);
+ fRefPath[3].addRect(i * 10.f - 10, -10, i * 10.f + 10, 10);
+ }
+ }
+
+ SkString onShortName() override {
+ return SkString("zeroPath");
+ }
+
+ SkISize onISize() override {
+ return SkISize::Make(W, H*2);
+ }
+
+ void onDraw(SkCanvas* canvas) override {
+ SkPaint fillPaint, strokePaint, dashPaint;
+ fillPaint.setAntiAlias(true);
+ strokePaint = fillPaint;
+ strokePaint.setStyle(SkPaint::kStroke_Style);
+ for (int i = 0; i < 2; ++i) {
+ fillPaint.setAlpha(255);
+ strokePaint.setAlpha(255);
+ strokePaint.setStrokeWidth(i ? 8.f : 10.f);
+ strokePaint.setStrokeCap(i ? SkPaint::kSquare_Cap : SkPaint::kRound_Cap);
+ canvas->save();
+ canvas->translate(10 + i * 100.f, 10);
+ canvas->drawPath(fMoveHfPath, strokePaint);
+ canvas->translate(0, 20);
+ canvas->drawPath(fMoveZfPath, strokePaint);
+ dashPaint = strokePaint;
+ const SkScalar intervals[] = { 0, 10 };
+ dashPaint.setPathEffect(SkDashPathEffect::Create(intervals, 2, 0))->unref();
+ SkPath fillPath;
+ dashPaint.getFillPath(fDashedfPath, &fillPath);
+ canvas->translate(0, 20);
+ canvas->drawPath(fDashedfPath, dashPaint);
+ canvas->translate(0, 20);
+ canvas->drawPath(fRefPath[i * 2], fillPaint);
+ strokePaint.setStrokeWidth(20);
+ strokePaint.setAlpha(127);
+ canvas->translate(0, 50);
+ canvas->drawPath(fMoveHfPath, strokePaint);
+ canvas->translate(0, 30);
+ canvas->drawPath(fMoveZfPath, strokePaint);
+ canvas->translate(0, 30);
+ fillPaint.setAlpha(127);
+ canvas->drawPath(fRefPath[1 + i * 2], fillPaint);
+ canvas->restore();
+ }
+ }
+
+private:
+ typedef skiagm::GM INHERITED;
+};
+
class Strokes2GM : public skiagm::GM {
SkPath fPath;
protected:
@@ -278,3 +350,5 @@ static skiagm::GMRegistry R0(F0);
static skiagm::GMRegistry R1(F1);
static skiagm::GMRegistry R2(F2);
static skiagm::GMRegistry R3(F3);
+
+DEF_GM(return SkNEW(ZeroLenStrokesGM);)