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

// This is an example of the translation unit that needs to be
// assembled by the fiddler program to compile into a fiddle: an
// implementation of the GetDrawOptions() and draw() functions.

#include "skia.h"

// 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.
#include "tools/fiddle/fiddle_main.h"

DrawOptions GetDrawOptions() {
    // path *should* be absolute.
    static const char path[] = "resources/images/color_wheel.png";
    return DrawOptions(256,
                       256,
                       true,
                       true,
                       true,
                       true,
                       true,
                       false,
                       false,
                       path,
                       skgpu::Mipmapped::kYes,
                       64,
                       64,
                       0,
                       skgpu::Mipmapped::kYes);
}
void draw(SkCanvas* canvas) {
    canvas->clear(SK_ColorWHITE);
    SkMatrix matrix;
    matrix.setScale(0.75f, 0.75f);
    matrix.preRotate(frame * 30.0f * duration); // If an animation, rotate at 30 deg/s.
    SkPaint paint;
    paint.setShader(image->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
                                      SkSamplingOptions(), matrix));
    canvas->drawPaint(paint);
    SkDebugf("This is text output: %d", 2);

    if (auto dContext = GrAsDirectContext(canvas->recordingContext())) {
        sk_sp<SkImage> tmp = SkImages::BorrowTextureFrom(dContext,
                                                         backEndTexture,
                                                         kTopLeft_GrSurfaceOrigin,
                                                         kRGBA_8888_SkColorType,
                                                         kOpaque_SkAlphaType,
                                                         nullptr);

        constexpr int kSampleCnt = 0;
        sk_sp<SkSurface> tmp2 = SkSurfaces::WrapBackendTexture(dContext,
                                                               backEndTextureRenderTarget,
                                                               kTopLeft_GrSurfaceOrigin,
                                                               kSampleCnt,
                                                               kRGBA_8888_SkColorType,
                                                               nullptr,
                                                               nullptr);

        // Note: this surface should only be renderable (i.e., not textureable)
        sk_sp<SkSurface> tmp3 = SkSurfaces::WrapBackendRenderTarget(dContext,
                                                                    backEndRenderTarget,
                                                                    kTopLeft_GrSurfaceOrigin,
                                                                    kRGBA_8888_SkColorType,
                                                                    nullptr,
                                                                    nullptr);
    }
}
