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

#ifndef CanvasStateHelpers_DEFINED
#define CanvasStateHelpers_DEFINED

#include "include/core/SkTypes.h"

#include <cstdint>

// See CanvasStateTest. These functions are either linked in to 'dm' directly (when this flag is
// not defined), or built in a shared library that is dlopened by the test. In that case, they
// should not be visible in 'dm', but the shared library will not have this flag set and compiles
// them as expected.
#if !defined(SK_TEST_CANVAS_STATE_CROSS_LIBRARY)

class SkCanvas;
class SkCanvasState;
class SkRegion;

#if defined(SK_BUILD_FOR_WIN)
#define EXPORT _declspec(dllexport)
#else
#define EXPORT
#endif

/*
 *  Helper function to perform drawing to an SkCanvas. Used by both
 *  test_complex_layers and complex_layers_draw_from_canvas_state.
 */
void complex_layers_draw(SkCanvas* canvas, float left, float top,
                         float right, float bottom, int32_t spacer);

/*
 *  Create an SkCanvas from state and draw to it. Return true on success.
 *
 *  Used by test_complex_layers test in CanvasStateTest. Marked as extern
 *  so it can be called from a separate library.
 */
extern "C" bool EXPORT complex_layers_draw_from_canvas_state(SkCanvasState* state,
        float left, float top, float right, float bottom, int32_t spacer);

/*
 *  Helper function to perform drawing to an SkCanvas. Used both by test_complex_clips
 *  and complex_clips_draw_from_canvas_state.
 */
void complex_clips_draw(SkCanvas* canvas, int32_t left, int32_t top,
        int32_t right, int32_t bottom, int32_t clipOp, const SkRegion& localRegion);

/*
 *  Create an SkCanvas from state and draw to it. Return true on success.
 *
 *  Used by test_complex_clips test in CanvasStateTest. Marked as extern
 *  so it can be called from a separate library.
 */
extern "C" bool EXPORT complex_clips_draw_from_canvas_state(SkCanvasState* state,
        int32_t left, int32_t top, int32_t right, int32_t bottom, int32_t clipOp,
        int32_t regionRects, int32_t* rectCoords);

#endif // SK_TEST_CANVAS_STATE_CROSS_LIBRARY
#endif // CanvasStateHelpers_DEFINED
