/*
 * 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

#include "include/core/SkCanvas.h"
#include "include/core/SkDocument.h"
#include "include/core/SkFontMgr.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkStream.h"
#include "include/core/SkSurface.h"
#include "include/gpu/ganesh/GrDirectContext.h"
#include "include/gpu/ganesh/gl/GrGLAssembleInterface.h"
#include "include/gpu/ganesh/gl/GrGLInterface.h"

#include <memory>
#include <sstream>

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


// fiddle_main.h (purposefully) pollutes the global namespace with very generic identifiers like
// "image", "duration", "frame", and "fontMgr". As such it is something of an
// "implementation header" and should be included last to avoid name shadowing warnings.
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

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
