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