• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 Google LLC
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef GrStencilMaskHelper_DEFINED
9 #define GrStencilMaskHelper_DEFINED
10 
11 #include "include/core/SkRect.h"
12 #include "include/private/GrTypesPriv.h"
13 #include "src/gpu/GrStencilClip.h"
14 #include "src/gpu/GrWindowRectsState.h"
15 
16 class GrShape;
17 class GrRecordingContext;
18 class GrSurfaceDrawContext;
19 class SkMatrix;
20 class SkRRect;
21 
22 /**
23  * The GrStencilMaskHelper helps generate clip masks using the stencil buffer.
24  * It is intended to be used as:
25  *
26  *   GrStencilMaskHelper helper;
27  *   helper.init(...);
28  *
29  *      draw one or more paths/rects specifying the required boolean ops
30  *
31  *   helper.finish();
32  *
33  * The result of this process will be the mask stored in the clip bits of the stencil buffer.
34  */
35 class GrStencilMaskHelper : SkNoncopyable {
36 public:
37     // Configure the helper to update the stencil mask within the given rectangle, respecting the
38     // set window rectangles. It will use the provided context and render target to draw into, both
39     // of which must outlive the helper.
GrStencilMaskHelper(GrRecordingContext * context,GrSurfaceDrawContext * rtc)40     GrStencilMaskHelper(GrRecordingContext* context, GrSurfaceDrawContext* rtc)
41             : fContext(context)
42             , fRTC(rtc)
43             , fClip(rtc->dimensions()) {}
44 
45     // Returns true if the stencil mask must be redrawn
46     bool init(const SkIRect& maskBounds, uint32_t genID,
47               const GrWindowRectangles& windowRects, int numFPs);
48 
49     // Draw a single rect into the stencil clip using the specified op
50     void drawRect(const SkRect& rect, const SkMatrix& matrix, SkRegion::Op, GrAA);
51 
52     // Draw a single filled path into the stencil clip with the specified op
53     bool drawPath(const SkPath& path, const SkMatrix& matrix, SkRegion::Op, GrAA);
54 
55     // Draw a single shape into the stencil clip assuming a simple fill style, with the specified op
56     bool drawShape(const GrShape& shape, const SkMatrix& matrix, SkRegion::Op, GrAA);
57 
58     // Reset the stencil buffer's clip bit to in or out.
59     void clear(bool insideStencil);
60 
61     // Marks the last rendered stencil mask on the render target context
62     void finish();
63 
64 private:
65     GrRecordingContext*    fContext;
66     GrSurfaceDrawContext* fRTC;
67     GrStencilClip          fClip;
68     int                    fNumFPs;
69 
70     using INHERITED = SkNoncopyable;
71 };
72 
73 #endif // GrStencilMaskHelper_DEFINED
74