aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/circulararcs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gm/circulararcs.cpp')
-rw-r--r--gm/circulararcs.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/gm/circulararcs.cpp b/gm/circulararcs.cpp
index 290390a47f..148ee42169 100644
--- a/gm/circulararcs.cpp
+++ b/gm/circulararcs.cpp
@@ -7,6 +7,7 @@
#include <functional>
#include "SkCanvas.h"
+#include "SkDashPathEffect.h"
#include "gm.h"
static constexpr SkScalar kStarts[] = {0.f, 10.f, 30.f, 45.f, 90.f, 165.f, 180.f, 270.f};
@@ -125,3 +126,87 @@ DEF_ARC_GM(stroke_and_fill_round) {
};
draw_arcs(canvas, setStroke);
}
+
+DEF_SIMPLE_GM(circular_arcs_weird, canvas, 1000, 400) {
+ static constexpr SkScalar kS = 50;
+ struct Arc {
+ SkRect fOval;
+ SkScalar fStart;
+ SkScalar fSweep;
+ };
+ static const Arc noDrawArcs[] = {
+ // no sweep
+ {SkRect::MakeWH(kS, kS), 0, 0},
+ // empty rect in x
+ {SkRect::MakeWH(-kS, kS), 0, 90},
+ // empty rect in y
+ {SkRect::MakeWH(kS, -kS), 0, 90},
+ // empty rect in x and y
+ {SkRect::MakeWH( 0, 0), 0, 90},
+ };
+ static const Arc arcs[] = {
+ // large start
+ {SkRect::MakeWH(kS, kS), 810.f, 90.f},
+ // large negative start
+ {SkRect::MakeWH(kS, kS), -810.f, 90.f},
+ // exactly 360 sweep
+ {SkRect::MakeWH(kS, kS), 0.f, 360.f},
+ // exactly -360 sweep
+ {SkRect::MakeWH(kS, kS), 0.f, -360.f},
+ // exactly 540 sweep
+ {SkRect::MakeWH(kS, kS), 0.f, 540.f},
+ // exactly -540 sweep
+ {SkRect::MakeWH(kS, kS), 0.f, -540.f},
+ // generic large sweep and large start
+ {SkRect::MakeWH(kS, kS), 1125.f, 990.f},
+ };
+ SkTArray<SkPaint> paints;
+ // fill
+ paints.push_back();
+ // stroke
+ paints.push_back().setStyle(SkPaint::kStroke_Style);
+ paints.back().setStrokeWidth(kS / 6.f);
+ // hairline
+ paints.push_back().setStyle(SkPaint::kStroke_Style);
+ paints.back().setStrokeWidth(0.f);
+ // stroke and fill
+ paints.push_back().setStyle(SkPaint::kStrokeAndFill_Style);
+ paints.back().setStrokeWidth(kS / 6.f);
+ // dash effect
+ paints.push_back().setStyle(SkPaint::kStroke_Style);
+ paints.back().setStrokeWidth(kS / 6.f);
+ static constexpr SkScalar kDashIntervals[] = {kS / 15, 2 * kS / 15};
+ paints.back().setPathEffect(SkDashPathEffect::Make(kDashIntervals, 2, 0.f));
+
+ canvas->translate(kPad, kPad);
+ // This loop should draw nothing.
+ for (auto arc : noDrawArcs) {
+ for (auto paint : paints) {
+ paint.setAntiAlias(true);
+ canvas->drawArc(arc.fOval, arc.fStart, arc.fSweep, false, paint);
+ canvas->drawArc(arc.fOval, arc.fStart, arc.fSweep, true, paint);
+ }
+ }
+
+ SkPaint linePaint;
+ linePaint.setAntiAlias(true);
+ linePaint.setColor(SK_ColorRED);
+ SkScalar midX = SK_ARRAY_COUNT(arcs) * (kS + kPad) - kPad/2.f;
+ SkScalar height = paints.count() * (kS + kPad);
+ canvas->drawLine(midX, -kPad, midX, height, linePaint);
+
+ for (auto paint : paints) {
+ paint.setAntiAlias(true);
+ canvas->save();
+ for (auto arc : arcs) {
+ canvas->drawArc(arc.fOval, arc.fStart, arc.fSweep, false, paint);
+ canvas->translate(kS + kPad, 0.f);
+ }
+ for (auto arc : arcs) {
+ canvas->drawArc(arc.fOval, arc.fStart, arc.fSweep, true, paint);
+ canvas->translate(kS + kPad, 0.f);
+ }
+ canvas->restore();
+ canvas->translate(0, kS + kPad);
+ }
+}