xref: /aosp_15_r20/external/skia/src/gpu/ganesh/ops/FillRectOp.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2  * Copyright 2018 Google Inc.
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 FillRectOp_DEFINED
9 #define FillRectOp_DEFINED
10 
11 #include "src/gpu/ganesh/ops/GrOp.h"
12 #include "src/gpu/ganesh/ops/GrSimpleMeshDrawOpHelper.h"
13 
14 #include <cstdint>
15 
16 class GrClip;
17 class GrPaint;
18 class GrRecordingContext;
19 class SkMatrix;
20 enum class GrAAType : unsigned int;
21 struct DrawQuad;
22 struct GrQuadSetEntry;
23 struct GrUserStencilSettings;
24 struct SkRect;
25 
26 namespace skgpu::ganesh {
27 
28 class SurfaceDrawContext;
29 
30 /**
31  * A set of factory functions for drawing filled rectangles either coverage-antialiased, or
32  * non-antialiased. The non-antialiased ops can be used with MSAA. As with other GrDrawOp factories,
33  * the GrPaint is only consumed by these methods if a valid op is returned. If null is returned then
34  * the paint is unmodified and may still be used.
35  */
36 class FillRectOp {
37 public:
38     using InputFlags = GrSimpleMeshDrawOpHelper::InputFlags;
39 
40     static GrOp::Owner Make(GrRecordingContext*,
41                             GrPaint&&,
42                             GrAAType,
43                             DrawQuad*,
44                             const GrUserStencilSettings* = nullptr,
45                             InputFlags = InputFlags::kNone);
46 
47     // Utility function to create a non-AA rect transformed by view. This is used commonly enough
48     // in testing and GMs that manage ops without going through GrRTC that it's worth the
49     // convenience.
50     static GrOp::Owner MakeNonAARect(GrRecordingContext*,
51                                      GrPaint&&,
52                                      const SkMatrix& view,
53                                      const SkRect&,
54                                      const GrUserStencilSettings* = nullptr);
55 
56     // Bulk API for drawing quads with a single op
57     // TODO(michaelludwig) - remove if the bulk API is not useful for SkiaRenderer
58     static void AddFillRectOps(SurfaceDrawContext*,
59                                const GrClip*,
60                                GrRecordingContext*,
61                                GrPaint&&,
62                                GrAAType,
63                                const SkMatrix& viewMatrix,
64                                const GrQuadSetEntry quads[],
65                                int quadCount,
66                                const GrUserStencilSettings* = nullptr);
67 
68 #if defined(GPU_TEST_UTILS)
69     static uint32_t ClassID();
70 #endif
71 
72 private:
73     // Create a FillRectOp that uses as many quads as possible from 'quads' w/o exceeding
74     // any index buffer size limits.
75     static GrOp::Owner MakeOp(GrRecordingContext*,
76                               GrPaint&&,
77                               GrAAType,
78                               const SkMatrix& viewMatrix,
79                               const GrQuadSetEntry quads[],
80                               int quadCount,
81                               const GrUserStencilSettings*,
82                               int* numConsumed);
83 };
84 
85 }  // namespace skgpu::ganesh
86 
87 #endif // FillRectOp_DEFINED
88