/*
 * Copyright 2023 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkImage.h"
#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkRect.h"
#include "include/core/SkShader.h"
#include "include/core/SkTileMode.h"
#include "tools/DecodeUtils.h"
#include "tools/Resources.h"

DEF_SIMPLE_GM(coordclampshader, canvas, 1074, 795) {
    auto image = ToolUtils::GetResourceAsImage("images/mandrill_256.png");
    if (!image) {
        return;
    }
    // The mandrill_512 image has a bottom row of mostly black pixels. Remove it.
    image = image->makeSubset(nullptr, SkIRect::MakeWH(image->width(), image->height() - 1), {});
    image = image->withDefaultMipmaps();

    auto imageShader = image->makeShader(SkFilterMode::kLinear);

    SkPaint paint;

    auto drawRect = SkRect::Make(image->dimensions());

    auto rotate = SkMatrix::RotateDeg(45.f, drawRect.center());

    auto clampRect = drawRect.makeInset(20, 40);

    canvas->translate(10, 10);

    auto shader = SkShaders::CoordClamp(imageShader, clampRect);
    paint.setShader(std::move(shader));
    canvas->drawRect(drawRect, paint);

    canvas->save();
    canvas->translate(image->width(), 0);
    shader = SkShaders::CoordClamp(imageShader->makeWithLocalMatrix(rotate), clampRect);
    paint.setShader(std::move(shader));
    canvas->drawRect(drawRect, paint);
    canvas->restore();

    canvas->save();
    canvas->translate(0, image->height());
    shader = SkShaders::CoordClamp(imageShader, clampRect)->makeWithLocalMatrix(rotate);
    paint.setShader(std::move(shader));
    canvas->drawRect(drawRect, paint);
    canvas->restore();

    canvas->save();
    canvas->translate(image->width(), image->height());
    shader = SkShaders::CoordClamp(imageShader->makeWithLocalMatrix(rotate), clampRect)
                     ->makeWithLocalMatrix(rotate);
    paint.setShader(std::move(shader));
    canvas->drawRect(drawRect, paint);
    canvas->restore();

    canvas->translate(0, 2 * image->height() + 10);

    static const SkSamplingOptions kSamplers[] = {
            SkSamplingOptions{SkFilterMode::kNearest},
            SkSamplingOptions{SkFilterMode::kLinear},
            SkSamplingOptions{SkFilterMode::kLinear, SkMipmapMode::kLinear},
            SkSamplingOptions::Aniso(16)
    };

    for (const auto& sampler : kSamplers) {
        imageShader = image->makeShader(SkTileMode::kMirror,
                                        SkTileMode::kMirror,
                                        sampler,
                                        SkMatrix::Scale(0.3f, 1.0));

        shader = SkShaders::CoordClamp(imageShader, clampRect);
        paint.setShader(std::move(shader));
        canvas->drawRect(drawRect, paint);

        canvas->translate(image->width() + 10, 0);
    }
}
