// 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(GradientShader_MakeLinear, 201, 201, false, 0) {
void draw(SkCanvas* canvas) {
    // This fiddle draws 4 instances of a LinearGradient, demonstrating
    // how the local matrix affects the gradient as well as the flag
    // which controls unpremul vs premul color interpolation.

    SkPaint strokePaint;
    strokePaint.setStyle(SkPaint::kStroke_Style);
    strokePaint.setColor(SK_ColorBLACK);

    SkPaint p;
    p.setStyle(SkPaint::kFill_Style);

    SkColor4f transparentGreen = SkColors::kGreen.withAlpha(0);
    SkColor4f colors[] = { transparentGreen, SkColors::kBlue, SkColors::kRed };
    SkScalar positions[] = { 0.0, 0.65, 1.0 };

    for (int i = 0; i < 4; i++) {
        SkScalar blockX = (i % 2) * 100;
        SkScalar blockY = (i / 2) * 100;
        SkPoint pts[] = { {blockX, blockY}, {blockX + 50, blockY + 100} };

        auto premul = SkGradient::Interpolation::InPremul::kNo;
        if (i % 2 == 1) {
            // right column will have premul
            premul = SkGradient::Interpolation::InPremul::kYes;
        }

        SkMatrix matr = SkMatrix::I();
        if (i / 2 == 1) {
            // bottom row will be rotated 45 degrees.
            matr.setRotate(45, blockX, blockY);
        }

        auto lgs = SkShaders::LinearGradient(
            pts, {{colors, positions, SkTileMode::kMirror}, {premul}}, &matr);

        p.setShader(lgs);
        auto r = SkRect::MakeLTRB(blockX, blockY, blockX + 100, blockY + 100);
        canvas->drawRect(r, p);
        canvas->drawRect(r, strokePaint);
    }
}
}  // END FIDDLE
