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

#ifndef StencilMaskHelper_DEFINED
#define StencilMaskHelper_DEFINED

#include "src/gpu/ganesh/StencilClip.h"

class GrShape;
class GrRecordingContext;
class SkMatrix;
struct SkRect;
class SkRRect;

namespace skgpu::v1 {

class SurfaceDrawContext;

/**
 * The StencilMaskHelper helps generate clip masks using the stencil buffer.
 * It is intended to be used as:
 *
 *   StencilMaskHelper helper;
 *   helper.init(...);
 *
 *      draw one or more paths/rects specifying the required boolean ops
 *
 *   helper.finish();
 *
 * The result of this process will be the mask stored in the clip bits of the stencil buffer.
 */
class StencilMaskHelper : SkNoncopyable {
public:
    // Configure the helper to update the stencil mask within the given rectangle, respecting the
    // set window rectangles. It will use the provided context and render target to draw into, both
    // of which must outlive the helper.
    StencilMaskHelper(GrRecordingContext*, SurfaceDrawContext*);

    // Returns true if the stencil mask must be redrawn
    bool init(const SkIRect& maskBounds, uint32_t genID,
              const GrWindowRectangles& windowRects, int numFPs);

    // Draw a single rect into the stencil clip using the specified op
    void drawRect(const SkRect& rect, const SkMatrix& matrix, SkRegion::Op, GrAA);

    // Draw a single filled path into the stencil clip with the specified op
    bool drawPath(const SkPath& path, const SkMatrix& matrix, SkRegion::Op, GrAA);

    // Draw a single shape into the stencil clip assuming a simple fill style, with the specified op
    bool drawShape(const GrShape& shape, const SkMatrix& matrix, SkRegion::Op, GrAA);

    // Reset the stencil buffer's clip bit to in or out.
    void clear(bool insideStencil);

    // Marks the last rendered stencil mask on the render target context
    void finish();

private:
    GrRecordingContext* fContext;
    SurfaceDrawContext* fSDC;
    StencilClip         fClip;
    int                 fNumFPs;

    using INHERITED = SkNoncopyable;
};

} // namespace skgpu::v1

#endif // StencilMaskHelper_DEFINED
