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

#include <memory>
#include "bench/Benchmark.h"
#include "include/codec/SkCodec.h"
#include "include/codec/SkWebpDecoder.h"
#include "include/private/SkAssert.h"
#include "src/core/SkAutoMalloc.h"
#include "tools/Resources.h"

namespace {

class WebpBlendBench final : public Benchmark {
public:
    const char* onGetName() override {
        return "webp_blend_bench";
    }

    bool isSuitableFor(Backend backend) override {
        return Backend::kNonRendering == backend;
    }

    void onDelayedSetup() override {
        auto data = GetResourceAsData("images/blendBG.webp");
        SkASSERT(data);

        SkCodec::Result result;
        fCodec = SkWebpDecoder::Decode(data, &result);
        SkASSERT(result == SkCodec::kSuccess);

        fStorage.reset(fCodec->getInfo().computeMinByteSize());
    }

    void onDraw(int n, SkCanvas* canvas) override {
        const SkImageInfo info = fCodec->getInfo();

        SkCodec::Options options;
        options.fFrameIndex = 1; // frame known to blend with prev

        for (int i = 0; i < n; ++i) {
            fCodec->getPixels(info, fStorage.get(), info.minRowBytes(), &options);
        }
    }

private:
    std::unique_ptr<SkCodec> fCodec;
    SkAutoMalloc             fStorage;
};

}  // namespace

DEF_BENCH( return new WebpBlendBench(); )
