| /* | 
 |  * Copyright 2016 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 | #ifndef GrClipStackClip_DEFINED | 
 | #define GrClipStackClip_DEFINED | 
 |  | 
 | #include "GrClip.h" | 
 | #include "GrReducedClip.h" | 
 | #include "SkClipStack.h" | 
 |  | 
 | class GrPathRenderer; | 
 | class GrTextureProxy; | 
 |  | 
 | /** | 
 |  * GrClipStackClip can apply a generic SkClipStack to the draw state. It may need to generate an | 
 |  * 8-bit alpha clip mask and/or modify the stencil buffer during apply(). | 
 |  */ | 
 | class GrClipStackClip final : public GrClip { | 
 | public: | 
 |     GrClipStackClip(const SkClipStack* stack = nullptr) { this->reset(stack); } | 
 |  | 
 |     void reset(const SkClipStack* stack) { fStack = stack; } | 
 |  | 
 |     bool quickContains(const SkRect&) const final; | 
 |     bool quickContains(const SkRRect&) const final; | 
 |     void getConservativeBounds(int width, int height, SkIRect* devResult, | 
 |                                bool* isIntersectionOfRects) const final; | 
 |     bool apply(GrContext*, GrRenderTargetContext*, bool useHWAA, bool hasUserStencilSettings, | 
 |                GrAppliedClip* out, SkRect* bounds) const final; | 
 |  | 
 |     bool isRRect(const SkRect& rtBounds, SkRRect* rr, GrAA* aa) const override; | 
 |  | 
 |     sk_sp<GrTextureProxy> testingOnly_createClipMask(GrContext*) const; | 
 |     static const char kMaskTestTag[]; | 
 |  | 
 | private: | 
 |     static bool PathNeedsSWRenderer(GrContext* context, | 
 |                                     const SkIRect& scissorRect, | 
 |                                     bool hasUserStencilSettings, | 
 |                                     const GrRenderTargetContext*, | 
 |                                     const SkMatrix& viewMatrix, | 
 |                                     const SkClipStack::Element* element, | 
 |                                     GrPathRenderer** prOut, | 
 |                                     bool needsStencil); | 
 |  | 
 |     bool applyClipMask(GrContext*, GrRenderTargetContext*, const GrReducedClip&, | 
 |                        bool hasUserStencilSettings, GrAppliedClip*) const; | 
 |  | 
 |     // Creates an alpha mask of the clip. The mask is a rasterization of elements through the | 
 |     // rect specified by clipSpaceIBounds. | 
 |     sk_sp<GrTextureProxy> createAlphaClipMask(GrContext*, const GrReducedClip&) const; | 
 |  | 
 |     // Similar to createAlphaClipMask but it rasterizes in SW and uploads to the result texture. | 
 |     sk_sp<GrTextureProxy> createSoftwareClipMask(GrContext*, const GrReducedClip&, | 
 |                                                  GrRenderTargetContext*) const; | 
 |  | 
 |     static bool UseSWOnlyPath(GrContext*, | 
 |                               bool hasUserStencilSettings, | 
 |                               const GrRenderTargetContext*, | 
 |                               const GrReducedClip&); | 
 |  | 
 |     const SkClipStack*  fStack; | 
 | }; | 
 |  | 
 | #endif // GrClipStackClip_DEFINED |