1 /*
2  * Copyright 2016 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 #ifndef GrClipStackClip_DEFINED
8 #define GrClipStackClip_DEFINED
9 
10 #include "GrClip.h"
11 #include "GrReducedClip.h"
12 #include "SkClipStack.h"
13 
14 class GrPathRenderer;
15 class GrTextureProxy;
16 
17 /**
18  * GrClipStackClip can apply a generic SkClipStack to the draw state. It may need to generate an
19  * 8-bit alpha clip mask and/or modify the stencil buffer during apply().
20  */
21 class GrClipStackClip final : public GrClip {
22 public:
23     GrClipStackClip(const SkClipStack* stack = nullptr) { this->reset(stack); }
24 
reset(const SkClipStack * stack)25     void reset(const SkClipStack* stack) { fStack = stack; }
26 
27     bool quickContains(const SkRect&) const final;
28     bool quickContains(const SkRRect&) const final;
29     void getConservativeBounds(int width, int height, SkIRect* devResult,
30                                bool* isIntersectionOfRects) const final;
31     bool apply(GrContext*, GrRenderTargetContext*, bool useHWAA, bool hasUserStencilSettings,
32                GrAppliedClip* out, SkRect* bounds) const final;
33 
34     bool isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const override;
35 
36     sk_sp<GrTextureProxy> testingOnly_createClipMask(GrContext*) const;
37     static const char kMaskTestTag[];
38 
39 private:
40     static bool PathNeedsSWRenderer(GrContext* context,
41                                     const SkIRect& scissorRect,
42                                     bool hasUserStencilSettings,
43                                     const GrRenderTargetContext*,
44                                     const SkMatrix& viewMatrix,
45                                     const SkClipStack::Element* element,
46                                     GrPathRenderer** prOut,
47                                     bool needsStencil);
48 
49     bool applyClipMask(GrContext*, GrRenderTargetContext*, const GrReducedClip&,
50                        bool hasUserStencilSettings, GrAppliedClip*) const;
51 
52     // Creates an alpha mask of the clip. The mask is a rasterization of elements through the
53     // rect specified by clipSpaceIBounds.
54     sk_sp<GrTextureProxy> createAlphaClipMask(GrContext*, const GrReducedClip&) const;
55 
56     // Similar to createAlphaClipMask but it rasterizes in SW and uploads to the result texture.
57     sk_sp<GrTextureProxy> createSoftwareClipMask(GrContext*, const GrReducedClip&,
58                                                  GrRenderTargetContext*) const;
59 
60     static bool UseSWOnlyPath(GrContext*,
61                               bool hasUserStencilSettings,
62                               const GrRenderTargetContext*,
63                               const GrReducedClip&);
64 
65     const SkClipStack*  fStack;
66 };
67 
68 #endif // GrClipStackClip_DEFINED
69