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

#include "bench/Benchmark.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkShader.h"
#include "include/core/SkString.h"
#include "tools/Resources.h"

class FilteringBench : public Benchmark {
public:
    FilteringBench(SkFilterMode fm, SkMipmapMode mm) : fSampling(fm, mm) {
        fName.printf("samplingoptions_filter_%d_mipmap_%d", (int)fm, (int)mm);
    }

protected:
    const char* onGetName() override {
        return fName.c_str();
    }

    void onDelayedSetup() override {
        auto img = GetResourceAsImage("images/ship.png");
        // need to force raster since lazy doesn't support filteroptions yet
        img = img->makeRasterImage();

        fRect = SkRect::MakeIWH(img->width(), img->height());
        fShader = img->makeShader(SkTileMode::kClamp, SkTileMode::kClamp, fSampling);
    }

    void onDraw(int loops, SkCanvas* canvas) override {
        // scale so we will trigger lerping between levels if we mipmapping
        canvas->scale(0.75f, 0.75f);

        SkPaint paint;
        paint.setShader(fShader);
        for (int i = 0; i < loops; ++i) {
            for (int j = 0; j < 10; ++j) {
                canvas->drawRect(fRect, paint);
            }
        }
    }

private:
    SkString        fName;
    SkRect          fRect;
    sk_sp<SkShader> fShader;
    SkSamplingOptions fSampling;

    using INHERITED = Benchmark;
};

DEF_BENCH( return new FilteringBench(SkFilterMode::kLinear,  SkMipmapMode::kLinear); )
DEF_BENCH( return new FilteringBench(SkFilterMode::kLinear,  SkMipmapMode::kNearest); )
DEF_BENCH( return new FilteringBench(SkFilterMode::kLinear,  SkMipmapMode::kNone); )

DEF_BENCH( return new FilteringBench(SkFilterMode::kNearest, SkMipmapMode::kLinear); )
DEF_BENCH( return new FilteringBench(SkFilterMode::kNearest, SkMipmapMode::kNearest); )
DEF_BENCH( return new FilteringBench(SkFilterMode::kNearest, SkMipmapMode::kNone); )
