| /* | 
 |  * Copyright 2017 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #ifndef GrStencilClip_DEFINED | 
 | #define GrStencilClip_DEFINED | 
 |  | 
 | #include "GrAppliedClip.h" | 
 | #include "GrFixedClip.h" | 
 |  | 
 | /** | 
 |  * Implements GrHardClip with the currently-existing stencil buffer contents and GrFixedClip. | 
 |  */ | 
 | class GrStencilClip final : public GrHardClip { | 
 | public: | 
 |     GrStencilClip(uint32_t stencilStackID = SK_InvalidGenID) : fStencilStackID(stencilStackID) {} | 
 |  | 
 |     explicit GrStencilClip(const SkIRect& scissorRect, uint32_t stencilStackID = SK_InvalidGenID) | 
 |         : fFixedClip(scissorRect) | 
 |         , fStencilStackID(stencilStackID) { | 
 |     } | 
 |  | 
 |     const GrFixedClip& fixedClip() const { return fFixedClip; } | 
 |     GrFixedClip& fixedClip() { return fFixedClip; } | 
 |  | 
 |     bool stencilStackID() const { return fStencilStackID; } | 
 |     bool hasStencilClip() const { return SK_InvalidGenID != fStencilStackID; } | 
 |     void setStencilClip(uint32_t stencilStackID) { fStencilStackID = stencilStackID; } | 
 |  | 
 |     bool quickContains(const SkRect& rect) const override { | 
 |         return !this->hasStencilClip() && fFixedClip.quickContains(rect); | 
 |     } | 
 |     void getConservativeBounds(int width, int height, SkIRect* bounds, bool* iior) const override { | 
 |         fFixedClip.getConservativeBounds(width, height, bounds, iior); | 
 |     } | 
 |     bool isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const override { | 
 |         return !this->hasStencilClip() && fFixedClip.isRRect(rtBounds, rr, aa); | 
 |     } | 
 |     bool apply(int rtWidth, int rtHeight, GrAppliedHardClip* out, SkRect* bounds) const override { | 
 |         if (!fFixedClip.apply(rtWidth, rtHeight, out, bounds)) { | 
 |             return false; | 
 |         } | 
 |         if (this->hasStencilClip()) { | 
 |             out->addStencilClip(fStencilStackID); | 
 |         } | 
 |         return true; | 
 |     } | 
 |  | 
 | private: | 
 |     GrFixedClip   fFixedClip; | 
 |     uint32_t      fStencilStackID; | 
 |  | 
 |     typedef GrClip INHERITED; | 
 | }; | 
 |  | 
 | #endif |