// 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(not_path_gradient, 256, 256, false, 0) {
SkPath star() {
    const SkScalar R = 60.0f, C = 128.0f;
    SkPathBuilder path;
    path.moveTo(C + R, C);
    for (int i = 1; i < 15; ++i) {
        SkScalar a = 0.44879895f * i;
        SkScalar r = R + R * (i % 2);
        path.lineTo(C + r * cos(a), C + r * sin(a));
    }
    return path.detach();
}
void draw(SkCanvas* canvas) {
    SkPaint paint;
    paint.setPathEffect(SkDiscretePathEffect::Make(10.0f, 4.0f));
    SkPoint points[2] = {SkPoint::Make(0.0f, 0.0f), SkPoint::Make(256.0f, 256.0f)};
    paint.setStyle(SkPaint::kStroke_Style);
    paint.setStrokeWidth(10);
    SkColor4f colors[2] = {
        SkColor4f::FromColor(SkColorSetRGB(0xEA, 0xD2, 0xAC)),
        SkColor4f::FromColor(SkColorSetRGB(0x42, 0x81, 0xA4))
    };
    paint.setShader(SkShaders::LinearGradient(
            points, {{colors, {}, SkTileMode::kClamp}, {}}));
    paint.setAntiAlias(true);
    canvas->clear(SK_ColorWHITE);
    SkPath path(star());
    canvas->drawPath(path, paint);
}
}  // END FIDDLE
