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

#ifndef PathRendererChain_DEFINED
#define PathRendererChain_DEFINED

#include "src/gpu/v1/PathRenderer.h"

#include "include/core/SkTypes.h"
#include "include/private/GrTypesPriv.h"
#include "include/private/SkNoncopyable.h"
#include "include/private/SkTArray.h"

namespace skgpu::v1 {

class AtlasPathRenderer;

/**
 * Keeps track of an ordered list of path renderers. When a path needs to be
 * drawn this list is scanned to find the most preferred renderer. To add your
 * path renderer to the list implement the GrPathRenderer::AddPathRenderers
 * function.
 */
class PathRendererChain : public SkNoncopyable {
public:
    struct Options {
        bool fAllowPathMaskCaching = false;
        GpuPathRenderers fGpuPathRenderers = GpuPathRenderers::kDefault;
    };
    PathRendererChain(GrRecordingContext*, const Options&);

    /** Documents how the caller plans to use a GrPathRenderer to draw a path. It affects the PR
        returned by getPathRenderer */
    enum class DrawType {
        kColor,            // draw to the color buffer, no AA
        kStencil,          // draw just to the stencil buffer
        kStencilAndColor,  // draw the stencil and color buffer, no AA
    };

    /** Returns a GrPathRenderer compatible with the request if one is available. If the caller
        is drawing the path to the stencil buffer then stencilSupport can be used to determine
        whether the path can be rendered with arbitrary stencil rules or not. See comments on
        StencilSupport in GrPathRenderer.h. */
    PathRenderer* getPathRenderer(const PathRenderer::CanDrawPathArgs&,
                                  DrawType,
                                  PathRenderer::StencilSupport*);

    /** Returns a direct pointer to the atlas path renderer, or null if it is not in the
        chain. */
    skgpu::v1::AtlasPathRenderer* getAtlasPathRenderer() {
        return fAtlasPathRenderer;
    }

    /** Returns a direct pointer to the tessellation path renderer, or null if it is not in the
        chain. */
    PathRenderer* getTessellationPathRenderer() {
        return fTessellationPathRenderer;
    }

private:
    enum {
        kPreAllocCount = 8,
    };
    SkSTArray<kPreAllocCount, sk_sp<PathRenderer>> fChain;
    AtlasPathRenderer*                             fAtlasPathRenderer = nullptr;
    PathRenderer*                                  fTessellationPathRenderer = nullptr;
};

} // namespace skgpu::v1

#endif // PathRendererChain_DEFINED
