Chromium Code Reviews| Index: gm/circulararcs.cpp |
| diff --git a/gm/circulararcs.cpp b/gm/circulararcs.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..7bc40de3faecf02ffd5eb27aa1dbba6d702f4554 |
| --- /dev/null |
| +++ b/gm/circulararcs.cpp |
| @@ -0,0 +1,102 @@ |
| +/* |
| + * Copyright 2016 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#include <functional> |
| +#include "SkCanvas.h" |
| +#include "gm.h" |
| + |
| +static constexpr SkScalar kStarts[] = {0.f, 10.f, 30.f, 45.f, 90.f, 165.f, 180.f, 270.f}; |
| +static constexpr SkScalar kSweeps[] = {45.f, 90.f, 165.f, 180.f, 220.f, 270.f, 300.f, 315.f}; |
| +static constexpr SkScalar kDiameter = 40.f; |
| +static constexpr SkRect kRect = {0.f, 0.f, kDiameter, kDiameter}; |
| +static constexpr int kW = 1000; |
| +static constexpr int kH = 1000; |
| +static constexpr SkScalar kPad = 20.f; |
| + |
| +void draw_arcs(SkCanvas* canvas, std::function<void(SkPaint*)> configureStyle) { |
| + // Draws grid of arcs with different start/sweep angles in red and their complement arcs in |
| + // blue. |
| + auto drawGrid = [canvas, &configureStyle] (SkScalar x, SkScalar y, bool useCenter, bool aa) { |
| + SkPaint p0; |
| + p0.setColor(SK_ColorRED); |
| + p0.setAntiAlias(aa); |
| + // Set a reasonable stroke width that configureStyle can override. |
| + p0.setStrokeWidth(15.f); |
| + // Use alpha so we see magenta on overlap between arc and its complement. |
| + p0.setAlpha(100); |
| + SkPaint p1 = p0; |
| + p1.setColor(SK_ColorBLUE); |
| + configureStyle(&p0); |
| + configureStyle(&p1); |
| + |
| + canvas->save(); |
| + canvas->translate(kPad + x, kPad + y); |
| + for (auto start : kStarts) { |
| + canvas->save(); |
| + for (auto sweep : kSweeps) { |
| + canvas->drawArc(kRect, start, sweep, useCenter, p0); |
| + canvas->drawArc(kRect, start, -(360.f - sweep), useCenter, p1); |
| + canvas->translate(kRect.width() + kPad, 0.f); |
| + } |
| + canvas->restore(); |
| + canvas->translate(0, kRect.height() + kPad); |
| + } |
| + canvas->restore(); |
| + }; |
| + // Draw a grids for combo of enabling/disabling aa and using center. |
| + static constexpr SkScalar kGridW = kW / 2.f; |
| + static constexpr SkScalar kGridH = kH / 2.f; |
| + drawGrid(0.f , 0.f , false, false); |
| + drawGrid(kGridW, 0.f , true , false); |
| + drawGrid(0.f , kGridH, false, true ); |
| + drawGrid(kGridW, kGridH, true , true ); |
| + // Draw separators between the grids. |
| + SkPaint linePaint; |
| + linePaint.setAntiAlias(true); |
| + linePaint.setColor(SK_ColorBLACK); |
| + canvas->drawLine(kGridW, 0.f , kGridW, SkIntToScalar(kH), linePaint); |
| + canvas->drawLine(0.f , kGridH, SkIntToScalar(kW), kGridH, linePaint); |
| +} |
| + |
| +#define DEF_ARC_GM(name) DEF_SIMPLE_GM(circular_arcs_##name, canvas, kW, kH) |
| + |
| +DEF_ARC_GM(circular_arcs_fill) { |
|
egdaniel
2016/08/19 18:35:18
the "circular_arcs_circular_arcs_fill" gm? somehow
bsalomon
2016/08/19 18:52:35
shoot, should be just fill here.
|
| + auto setFill = [] (SkPaint*p) { p->setStyle(SkPaint::kFill_Style); }; |
| + draw_arcs(canvas, setFill); |
| +} |
| + |
| +DEF_ARC_GM(hairline) { |
| + auto setHairline = [] (SkPaint* p) { |
| + p->setStyle(SkPaint::kStroke_Style); |
| + p->setStrokeWidth(0.f); |
| + }; |
| + draw_arcs(canvas, setHairline); |
| +} |
| + |
| +DEF_ARC_GM(stroke_butt) { |
| + auto setStroke = [](SkPaint* p) { |
| + p->setStyle(SkPaint::kStroke_Style); |
| + p->setStrokeCap(SkPaint::kButt_Cap); |
| + }; |
| + draw_arcs(canvas, setStroke); |
| +} |
| + |
| +DEF_ARC_GM(stroke_square) { |
| + auto setStroke = [] (SkPaint* p) { |
| + p->setStyle(SkPaint::kStroke_Style); |
| + p->setStrokeCap(SkPaint::kSquare_Cap); |
| + }; |
| + draw_arcs(canvas, setStroke); |
| +} |
| + |
| +DEF_ARC_GM(stroke_round) { |
| + auto setStroke = [] (SkPaint* p) { |
| + p->setStyle(SkPaint::kStroke_Style); |
| + p->setStrokeCap(SkPaint::kRound_Cap); |
| + }; |
| + draw_arcs(canvas, setStroke); |
| +} |