| /* |
| * 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 "src/core/SkClipStack.h" |
| #include "src/gpu/GrClip.h" |
| #include "src/gpu/GrReducedClip.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 SkISize& dimensions, |
| const SkClipStack* stack = nullptr, |
| const SkMatrixProvider* matrixProvider = nullptr) |
| : fDeviceSize(dimensions) |
| , fStack(stack) |
| , fMatrixProvider(matrixProvider) {} |
| |
| SkIRect getConservativeBounds() const final; |
| Effect apply(GrRecordingContext*, GrSurfaceDrawContext*, const GrDrawOp* opBeingClipped, |
| GrAAType aaType, GrAppliedClip* out, SkRect* bounds) const final; |
| PreClipResult preApply(const SkRect& drawBounds, GrAA aa) const final; |
| |
| sk_sp<GrTextureProxy> testingOnly_createClipMask(GrRecordingContext*) const; |
| static const char kMaskTestTag[]; |
| |
| private: |
| bool applyClipMask(GrRecordingContext*, GrSurfaceDrawContext*, const GrReducedClip&, |
| GrAppliedClip*) const; |
| |
| // Creates an alpha mask of the clip. The mask is a rasterization of elements through the |
| // rect specified by clipSpaceIBounds. |
| GrSurfaceProxyView createAlphaClipMask(GrRecordingContext*, const GrReducedClip&) const; |
| |
| // Similar to createAlphaClipMask but it rasterizes in SW and uploads to the result texture. |
| GrSurfaceProxyView createSoftwareClipMask(GrRecordingContext*, const GrReducedClip&, |
| GrSurfaceDrawContext*) const; |
| |
| static bool UseSWOnlyPath(GrRecordingContext*, |
| const GrSurfaceDrawContext*, |
| const GrReducedClip&); |
| |
| // SkClipStack does not track device bounds explicitly, but it will refine these device bounds |
| // as clip elements are added to the stack. |
| SkISize fDeviceSize; |
| const SkClipStack* fStack; |
| const SkMatrixProvider* fMatrixProvider; // for applying clip shaders |
| }; |
| |
| #endif // GrClipStackClip_DEFINED |