blob: 8c03a58c996d50e5f5e23c1981a94a6ac42570d3 [file] [log] [blame]
/*
* 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 GrStencilMaskHelper_DEFINED
#define GrStencilMaskHelper_DEFINED
#include "include/core/SkRect.h"
#include "include/private/GrTypesPriv.h"
#include "src/gpu/GrStencilClip.h"
#include "src/gpu/GrWindowRectsState.h"
class GrShape;
class GrRecordingContext;
class GrSurfaceDrawContext;
class SkMatrix;
class SkRRect;
/**
* The GrStencilMaskHelper helps generate clip masks using the stencil buffer.
* It is intended to be used as:
*
* GrStencilMaskHelper 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 GrStencilMaskHelper : 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.
GrStencilMaskHelper(GrRecordingContext* context, GrSurfaceDrawContext* rtc)
: fContext(context)
, fRTC(rtc)
, fClip(rtc->dimensions()) {}
// 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;
GrSurfaceDrawContext* fRTC;
GrStencilClip fClip;
int fNumFPs;
using INHERITED = SkNoncopyable;
};
#endif // GrStencilMaskHelper_DEFINED