// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#ifndef examples_DEFINED
#define examples_DEFINED

#include "tools/Registry.h"
#include "skia.h"

#include <cinttypes>
#include <cmath>
#include <string>

namespace fiddle {
struct Example {
    void (*fFunc)(SkCanvas*);
    const char* fName;
    double fAnimationDuration;
    int fImageIndex;
    int fWidth;
    int fHeight;
    int fOffscreenWidth;
    int fOffscreenHeight;
    int fOffscreenSampleCount;
    bool fText;
    bool fSRGB;
    bool fF16;
    bool fOffscreen;
    bool fOffscreenTexturable;
    bool fOffscreenMipMap;
};
}

extern GrBackendTexture backEndTexture;
extern GrBackendRenderTarget backEndRenderTarget;
extern GrBackendTexture backEndTextureRenderTarget;
extern SkBitmap source;
extern sk_sp<SkImage> image;
extern double duration; // The total duration of the animation in seconds.
extern double frame;    // A value in [0, 1] of where we are in the animation.
extern sk_sp<SkFontMgr> fontMgr;  // Can load some system fonts

#define REGISTER_FIDDLE(NAME, WIDTH, HEIGHT, TEXT, IMG_INDEX, DURATION, SRGB, F16,   \
                        OFSCR, OFSCR_WIDTH, OFSCR_HEIGHT, OFSCR_SAMPLECOUNT,         \
                        OFSCR_TEXTURABLE, OFSCR_MIPMAP)                              \
    namespace example_##NAME { void draw(SkCanvas*);  }                              \
    sk_tools::Registry<fiddle::Example> reg_##NAME(                                  \
        fiddle::Example{&example_##NAME::draw, #NAME, DURATION, IMG_INDEX,           \
                        WIDTH, HEIGHT, OFSCR_WIDTH, OFSCR_HEIGHT, OFSCR_SAMPLECOUNT, \
                        TEXT, SRGB, F16, OFSCR, OFSCR_TEXTURABLE, OFSCR_MIPMAP});    \
    namespace example_##NAME

#define REG_FIDDLE_SRGB(NAME, W, H, T, I, DURATION, F16)   \
    REGISTER_FIDDLE(NAME, W, H, T, I, DURATION, true, F16, \
                    false, 64, 64, 0, false, false)

#define REG_FIDDLE_ANIMATED(NAME, W, H, T, I, DURATION)       \
    REGISTER_FIDDLE(NAME, W, H, T, I, DURATION, false, false, \
                    false, 64, 64, 0, false, false)

#define REG_FIDDLE(NAME, W, H, TEXT, I)         \
    REG_FIDDLE_ANIMATED(NAME, W, H, TEXT, I, 0)

#endif  // examples_DEFINED
