| /* |
| * 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 GrTexture; |
| class GrTextureProvider; |
| class GrUniqueKey; |
| |
| /** |
| * 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, const SkIPoint* origin = nullptr) { |
| this->reset(stack, origin); |
| } |
| |
| void reset(const SkClipStack* stack = nullptr, const SkIPoint* origin = nullptr) { |
| fOrigin = origin ? *origin : SkIPoint::Make(0, 0); |
| fStack.reset(SkSafeRef(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*, GrDrawContext*, bool useHWAA, bool hasUserStencilSettings, |
| GrAppliedClip* out) const final; |
| |
| private: |
| static bool PathNeedsSWRenderer(GrContext* context, |
| bool hasUserStencilSettings, |
| const GrDrawContext*, |
| const SkMatrix& viewMatrix, |
| const SkClipStack::Element* element, |
| GrPathRenderer** prOut, |
| bool needsStencil); |
| |
| // Draws the clip into the stencil buffer |
| static bool CreateStencilClipMask(GrContext*, |
| GrDrawContext*, |
| const GrReducedClip&, |
| const SkIPoint& clipSpaceToStencilOffset); |
| |
| // Creates an alpha mask of the clip. The mask is a rasterization of elements through the |
| // rect specified by clipSpaceIBounds. |
| static sk_sp<GrTexture> CreateAlphaClipMask(GrContext*, |
| const GrReducedClip&, |
| const SkVector& clipToMaskOffset); |
| |
| // Similar to createAlphaClipMask but it rasterizes in SW and uploads to the result texture. |
| static sk_sp<GrTexture> CreateSoftwareClipMask(GrTextureProvider*, |
| const GrReducedClip&, |
| const SkVector& clipToMaskOffset); |
| |
| static bool UseSWOnlyPath(GrContext*, |
| bool hasUserStencilSettings, |
| const GrDrawContext*, |
| const SkVector& clipToMaskOffset, |
| const GrReducedClip::ElementList& elements); |
| |
| static GrTexture* CreateCachedMask(int width, int height, const GrUniqueKey& key, |
| bool renderTarget); |
| |
| SkIPoint fOrigin; |
| SkAutoTUnref<const SkClipStack> fStack; |
| }; |
| |
| #endif // GrClipStackClip_DEFINED |