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

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, fillPath;
                path.addRect(rect);
                SkPaint paint;

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

                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();
                AutoTArray<SkPoint> points(n);
                fillPath.getPoints(points.get(), n);
                canvas->drawPoints(SkCanvas::kPoints_PointMode, n, points.get(), paint);
            }
        }
    }
}
}  // END FIDDLE
