1 /*
2  * Copyright 2017 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 GrStencilClip_DEFINED
9 #define GrStencilClip_DEFINED
10 
11 #include "GrAppliedClip.h"
12 #include "GrFixedClip.h"
13 
14 /**
15  * Implements GrHardClip with the currently-existing stencil buffer contents and GrFixedClip.
16  */
17 class GrStencilClip final : public GrHardClip {
18 public:
fStencilStackID(stencilStackID)19     GrStencilClip(uint32_t stencilStackID = SK_InvalidGenID) : fStencilStackID(stencilStackID) {}
20 
21     explicit GrStencilClip(const SkIRect& scissorRect, uint32_t stencilStackID = SK_InvalidGenID)
fFixedClip(scissorRect)22         : fFixedClip(scissorRect)
23         , fStencilStackID(stencilStackID) {
24     }
25 
fixedClip()26     const GrFixedClip& fixedClip() const { return fFixedClip; }
fixedClip()27     GrFixedClip& fixedClip() { return fFixedClip; }
28 
stencilStackID()29     bool stencilStackID() const { return fStencilStackID; }
hasStencilClip()30     bool hasStencilClip() const { return SK_InvalidGenID != fStencilStackID; }
setStencilClip(uint32_t stencilStackID)31     void setStencilClip(uint32_t stencilStackID) { fStencilStackID = stencilStackID; }
32 
quickContains(const SkRect & rect)33     bool quickContains(const SkRect& rect) const override {
34         return !this->hasStencilClip() && fFixedClip.quickContains(rect);
35     }
getConservativeBounds(int width,int height,SkIRect * bounds,bool * iior)36     void getConservativeBounds(int width, int height, SkIRect* bounds, bool* iior) const override {
37         fFixedClip.getConservativeBounds(width, height, bounds, iior);
38     }
isRRect(const SkRect & rtBounds,SkRRect * rr,GrAA * aa)39     bool isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const override {
40         return !this->hasStencilClip() && fFixedClip.isRRect(rtBounds, rr, aa);
41     }
apply(int rtWidth,int rtHeight,GrAppliedHardClip * out,SkRect * bounds)42     bool apply(int rtWidth, int rtHeight, GrAppliedHardClip* out, SkRect* bounds) const override {
43         if (!fFixedClip.apply(rtWidth, rtHeight, out, bounds)) {
44             return false;
45         }
46         if (this->hasStencilClip()) {
47             out->addStencilClip(fStencilStackID);
48         }
49         return true;
50     }
51 
52 private:
53     GrFixedClip   fFixedClip;
54     uint32_t      fStencilStackID;
55 
56     typedef GrClip INHERITED;
57 };
58 
59 #endif
60