// 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 <cfloat>

REG_FIDDLE(strokerect_gm, 1400, 740, false, 0) {
void draw(SkCanvas* canvas) {
    constexpr SkScalar kStrokeWidth = 20;
    constexpr SkPaint::Join gJoins[] = {SkPaint::kMiter_Join, SkPaint::kRound_Join,
                                        SkPaint::kBevel_Join};
    constexpr SkScalar W = 80;
    constexpr SkScalar H = 80;
    constexpr SkRect gRects[] = {
            {0, 0, W, H},
            {W, 0, 0, H},
            {0, H, W, 0},
            {0, 0, kStrokeWidth, H},
            {0, 0, W, kStrokeWidth},
            {0, 0, kStrokeWidth / 2, kStrokeWidth / 2},
            {0, 0, W, 0},
            {0, 0, 0, H},
            {0, 0, 0, 0},
            {0, 0, W, FLT_EPSILON},
            {0, 0, FLT_EPSILON, H},
            {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
