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