/*
 * Copyright 2016 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/SkBitmap.h"
#include "include/core/SkFontMgr.h"
#include "include/core/SkPicture.h"
#include "include/core/SkPictureRecorder.h"
#include "modules/skottie/include/Skottie.h"
#include "tools/DecodeUtils.h"
#include "tools/Resources.h"
#include "tools/fonts/FontToolUtils.h"

class DecodeBench : public Benchmark {
protected:
    DecodeBench(const char* name, const char* source)
        : fName(SkStringPrintf("decode_%s", name))
        , fSource(source)
    {}

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

    const char* onGetName() final { return fName.c_str(); }

    void onDelayedSetup() override {
        fData = GetResourceAsData(fSource);
        SkASSERT(fData);
    }

protected:
    sk_sp<SkData>  fData;

private:
    const SkString fName;
    const char*    fSource;
};

class BitmapDecodeBench final : public DecodeBench {
public:
    BitmapDecodeBench(const char* name, const char* source)
        : INHERITED(name, source)
    {}

    void onDraw(int loops, SkCanvas*) override {
        while (loops-- > 0) {
            SkBitmap bm;
            SkAssertResult(ToolUtils::DecodeDataToBitmap(fData, &bm));
        }
    }

private:
    using INHERITED = DecodeBench;
};


class SkottieDecodeBench final : public DecodeBench {
public:
    SkottieDecodeBench(const char* name, const char* source)
        : INHERITED(name, source)
    {}

    void onDraw(int loops, SkCanvas*) override {
        while (loops-- > 0) {
            const auto anim = skottie::Animation::Builder()
                .setFontManager(ToolUtils::TestFontMgr())
                .make(reinterpret_cast<const char*>(fData->data()),
                                                    fData->size());
        }
    }

private:
    using INHERITED = DecodeBench;
};

class SkottiePictureDecodeBench final : public DecodeBench {
public:
    SkottiePictureDecodeBench(const char* name, const char* source)
        : INHERITED(name, source)
    {}

    void onDraw(int loops, SkCanvas*) override {
        while (loops-- > 0) {
            const auto anim = skottie::Animation::Builder()
                .setFontManager(ToolUtils::TestFontMgr())
                .make(reinterpret_cast<const char*>(fData->data()),
                                                    fData->size());
            SkPictureRecorder recorder;
            anim->seek(0);
            anim->render(recorder.beginRecording(anim->size().width(), anim->size().height()));

            const auto pic = recorder.finishRecordingAsPicture();
        }
    }

private:
    using INHERITED = DecodeBench;
};

DEF_BENCH(return new SkottieDecodeBench("skottie_large",  // 426593
                                        "skottie/skottie-text-scale-to-fit-minmax.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_medium", //  10947
                                        "skottie/skottie-sphere-effect.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_small",  //   1112
                                        "skottie/skottie_sample_multiframe.json"))
// Created from PhoneHub assets SVG source, with https://lottiefiles.com/svg-to-lottie
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_connecting.json",    // 216x216
                                        "skottie/skottie-phonehub-connecting.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_generic_error.json", // 216x217
                                        "skottie/skottie-phonehub-generic-error.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_onboard.json",       // 217x217
                                        "skottie/skottie-phonehub-onboard.json"))
// Created from PhoneHub assets SVG source, with https://jakearchibald.github.io/svgomg/ and then
// https://lottiefiles.com/svg-to-lottie
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_connecting.json",
                                        "skottie/skottie-phonehub-svgo-connecting.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_generic_error.json",
                                        "skottie/skottie-phonehub-svgo-generic-error.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_onboard.json",
                                        "skottie/skottie-phonehub-svgo-onboard.json"))
// Created from PhoneHub assets SVG source:
// 1. Manually edited to have no masks (but look the same as the original)
// 2. https://jakearchibald.github.io/svgomg/
// 3. https://lottiefiles.com/svg-to-lottie
// Note: The Generic Error asset is excluded here because it has no masks in the first place.
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_masks_connecting.json",
                                        "skottie/skottie-phonehub-svgo-no-masks-connecting.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_masks_onboard.json",
                                        "skottie/skottie-phonehub-svgo-no-masks-onboard.json"))
// Created from PhoneHub assets SVG source:
// 1. Manually edited to use only the most basic functionality of SVG (but look the same as the
//    original)
// 2. https://jakearchibald.github.io/svgomg/
// 3. https://lottiefiles.com/svg-to-lottie
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_frills_connecting.json",
                                        "skottie/skottie-phonehub-svgo-no-frills-connecting.json"))
DEF_BENCH(return new SkottieDecodeBench(
        "skottie_phonehub_svgo_no_frills_generic_error.json",
        "skottie/skottie-phonehub-svgo-no-frills-generic-error.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_frills_onboard.json",
                                        "skottie/skottie-phonehub-svgo-no-frills-onboard.json"))
// All of the above PhoneHub benchmarks, with https://skia-review.googlesource.com/c/skia/+/141265
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_connecting_min.json",
                                        "skottie/skottie-phonehub-connecting_min.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_generic_error_min.json",
                                        "skottie/skottie-phonehub-generic-error_min.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_onboard_min.json",
                                        "skottie/skottie-phonehub-onboard_min.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_connecting_min.json",
                                        "skottie/skottie-phonehub-svgo-connecting_min.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_generic_error_min.json",
                                        "skottie/skottie-phonehub-svgo-generic-error_min.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_onboard_min.json",
                                        "skottie/skottie-phonehub-svgo-onboard_min.json"))
DEF_BENCH(return new SkottieDecodeBench(
        "skottie_phonehub_svgo_no_masks_connecting_min.json",
        "skottie/skottie-phonehub-svgo-no-masks-connecting_min.json"))
DEF_BENCH(return new SkottieDecodeBench("skottie_phonehub_svgo_no_masks_onboard_min.json",
                                        "skottie/skottie-phonehub-svgo-no-masks-onboard_min.json"))
DEF_BENCH(return new SkottieDecodeBench(
        "skottie_phonehub_svgo_no_frills_connecting_min.json",
        "skottie/skottie-phonehub-svgo-no-frills-connecting_min.json"))
DEF_BENCH(return new SkottieDecodeBench(
        "skottie_phonehub_svgo_no_frills_generic_error_min.json",
        "skottie/skottie-phonehub-svgo-no-frills-generic-error_min.json"))
DEF_BENCH(
        return new SkottieDecodeBench("skottie_phonehub_svgo_no_frills_onboard_min.json",
                                      "skottie/skottie-phonehub-svgo-no-frills-onboard_min.json"))

DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_large",
                                               "skottie/skottie-text-scale-to-fit-minmax.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_medium",
                                               "skottie/skottie-sphere-effect.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_small",
                                               "skottie/skottie_sample_multiframe.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_connecting.json",
                                               "skottie/skottie-phonehub-connecting.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_generic_error.json",
                                               "skottie/skottie-phonehub-generic-error.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_onboard.json",
                                               "skottie/skottie-phonehub-onboard.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_connecting.json",
                                               "skottie/skottie-phonehub-svgo-connecting.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_generic_error.json",
                                               "skottie/skottie-phonehub-svgo-generic-error.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_onboard.json",
                                               "skottie/skottie-phonehub-svgo-onboard.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_masks_connecting.json",
        "skottie/skottie-phonehub-svgo-no-masks-connecting.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_masks_onboard.json",
        "skottie/skottie-phonehub-svgo-no-masks-onboard.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_frills_connecting.json",
        "skottie/skottie-phonehub-svgo-no-frills-connecting.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_frills_generic_error.json",
        "skottie/skottie-phonehub-svgo-no-frills-generic-error.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_frills_onboard.json",
        "skottie/skottie-phonehub-svgo-no-frills-onboard.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_connecting_min.json",
                                               "skottie/skottie-phonehub-connecting_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_generic_error_min.json",
                                               "skottie/skottie-phonehub-generic-error_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_onboard_min.json",
                                               "skottie/skottie-phonehub-onboard_min.json"))
DEF_BENCH(
        return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_connecting_min.json",
                                             "skottie/skottie-phonehub-svgo-connecting_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_generic_error_min.json",
        "skottie/skottie-phonehub-svgo-generic-error_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench("skottiepic_phonehub_svgo_onboard_min.json",
                                               "skottie/skottie-phonehub-svgo-onboard_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_masks_connecting_min.json",
        "skottie/skottie-phonehub-svgo-no-masks-connecting_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_masks_onboard_min.json",
        "skottie/skottie-phonehub-svgo-no-masks-onboard_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_frills_connecting_min.json",
        "skottie/skottie-phonehub-svgo-no-frills-connecting_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_frills_generic_error_min.json",
        "skottie/skottie-phonehub-svgo-no-frills-generic-error_min.json"))
DEF_BENCH(return new SkottiePictureDecodeBench(
        "skottiepic_phonehub_svgo_no_frills_onboard_min.json",
        "skottie/skottie-phonehub-svgo-no-frills-onboard_min.json"))

DEF_BENCH(return new BitmapDecodeBench("png_large"    /*1600x1600*/, "images/mandrill_1600.png"))
DEF_BENCH(return new BitmapDecodeBench("png_medium"   /* 512x 512*/, "images/mandrill_512.png"))
DEF_BENCH(return new BitmapDecodeBench("png_small"    /*  32x  32*/, "images/mandrill_32.png"))
DEF_BENCH(return new BitmapDecodeBench("png_phonehub_connecting"   , "images/Connecting.png"))
DEF_BENCH(return new BitmapDecodeBench("png_phonehub_generic_error", "images/Generic_Error.png"))
DEF_BENCH(return new BitmapDecodeBench("png_phonehub_onboard"      , "images/Onboard.png"))
