// Copyright 2020 Google LLC
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "tools/fiddle/examples.h"

#include <array>
#include <cfloat>

REG_FIDDLE(strokerect_gm, 1400, 740, false, 0) {
void draw(SkCanvas* canvas) {
    constexpr SkScalar kStrokeWidth = 20;
    constexpr auto gJoins = std::to_array<SkPaint::Join>({
            SkPaint::kMiter_Join,
            SkPaint::kRound_Join,
            SkPaint::kBevel_Join,
    });
    constexpr SkScalar W = 80;
    constexpr SkScalar H = 80;
    constexpr auto gRects = std::to_array<SkRect>({
            SkRect{0, 0, W, H},
            SkRect{W, 0, 0, H},
            SkRect{0, H, W, 0},
            SkRect{0, 0, kStrokeWidth, H},
            SkRect{0, 0, W, kStrokeWidth},
            SkRect{0, 0, kStrokeWidth / 2, kStrokeWidth / 2},
            SkRect{0, 0, W, 0},
            SkRect{0, 0, 0, H},
            SkRect{0, 0, 0, 0},
            SkRect{0, 0, W, FLT_EPSILON},
            SkRect{0, 0, FLT_EPSILON, H},
            SkRect{0, 0, FLT_EPSILON, FLT_EPSILON},
    });
    canvas->translate(kStrokeWidth * 3 / 2, kStrokeWidth * 3 / 2);
    for (int doFill = 0; doFill <= 1; ++doFill) {
        SkPaint::Style style = doFill ? SkPaint::kStrokeAndFill_Style : SkPaint::kStroke_Style;
        for (size_t i = 0; i < std::size(gJoins); ++i) {
            SkPaint::Join join = gJoins[i];
            for (size_t j = 0; j < std::size(gRects); ++j) {
                SkAutoCanvasRestore acr(canvas, true);
                canvas->translate(
                        j * (W + 2 * kStrokeWidth),
                        (i + doFill * std::size(gJoins)) * (H + 2 * kStrokeWidth));
                const SkRect& rect = gRects[j];

                SkPath path = SkPath::Rect(rect);
                SkPaint paint;

                paint.setStrokeWidth(kStrokeWidth);
                paint.setStyle(style);
                paint.setStrokeJoin(join);
                SkPath fillPath = skpathutils::FillPathWithPaint(path, paint);

                paint.setAntiAlias(true);
                paint.setColor(0xFF8C8A8C);
                canvas->drawRect(rect, paint);

                paint.setStyle(SkPaint::kStroke_Style);
                paint.setStrokeWidth(0);
                paint.setColor(SK_ColorRED);
                canvas->drawPath(fillPath, paint);

                paint.setStrokeWidth(3);
                paint.setStrokeJoin(SkPaint::kMiter_Join);
                int n = fillPath.countPoints();
                std::vector<SkPoint> points(n);
                fillPath.getPoints(points);
                canvas->drawPoints(SkCanvas::kPoints_PointMode, points, paint);
            }
        }
    }
}
}  // END FIDDLE
