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

#ifdef FIDDLE_BUILD_TEST
    #include "include/core/SkCanvas.h"
    #include "include/core/SkDocument.h"
    #include "include/core/SkPictureRecorder.h"
    #include "include/core/SkStream.h"
    #include "include/core/SkSurface.h"
    #include "include/gpu/GrDirectContext.h"
    #include "include/gpu/gl/GrGLAssembleInterface.h"
    #include "include/gpu/gl/GrGLInterface.h"
#else
    #include "skia.h"
#endif

#include <memory>
#include <sstream>

namespace sk_gpu_test {
class GLTestContext;
class ManagedBackendTexture;
}  // namespace sk_gpu_test

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.

struct DrawOptions {
    DrawOptions(int w,
                int h,
                bool r,
                bool g,
                bool p,
                bool k,
                bool srgb,
                bool f16,
                bool textOnly,
                const char* s,
                skgpu::Mipmapped mipMapping,
                int offScreenWidth,
                int offScreenHeight,
                int deprecated,  // TODO(jcgregorio): remove
                skgpu::Mipmapped offScreenMipMapping)
            : size(SkISize::Make(w, h))
            , raster(r)
            , gpu(g)
            , pdf(p)
            , skp(k)
            , srgb(srgb)
            , f16(f16)
            , textOnly(textOnly)
            , source(s)
            , fMipMapping(mipMapping)
            , fOffScreenWidth(offScreenWidth)
            , fOffScreenHeight(offScreenHeight)
            , fOffScreenMipMapping(offScreenMipMapping) {
        // F16 mode is only valid for color correct backends.
        SkASSERT(srgb || !f16);
    }
    SkISize size;
    bool raster;
    bool gpu;
    bool pdf;
    bool skp;
    bool srgb;
    bool f16;
    bool textOnly;
    const char* source;

    // This flag is used when a GPU texture resource is created and exposed as a GrBackendTexture.
    // In this case the resource is created with extra room to accommodate mipmaps.
    // TODO: The SkImage::makeTextureImage API would need to be widened to allow this to be true
    // for the non-backend gpu SkImages.
    skgpu::Mipmapped fMipMapping;

    // Parameters for an GPU offscreen resource exposed as a GrBackendRenderTarget
    int         fOffScreenWidth;
    int         fOffScreenHeight;
    // TODO: should we also expose stencilBits here? How about the config?

    skgpu::Mipmapped fOffScreenMipMapping;  // only applicable if the offscreen is also textureable
};

extern DrawOptions GetDrawOptions();
extern void SkDebugf(const char * format, ...);
extern void draw(SkCanvas*);

// There are different implementations of create_direct_context() for EGL, Mesa,
// and a fallback to a null context.
extern sk_sp<GrDirectContext> create_direct_context(std::ostringstream& driverinfo,
                                                    std::unique_ptr<sk_gpu_test::GLTestContext>*);

#endif  // fiddle_main_DEFINED
