Chromium Code Reviews| Index: src/gpu/GrClipMaskManager.cpp |
| diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp |
| index 4fd746f3fa4e9cc450740aa8ae410c7384e2d38f..340ede0d314484247d892cf66324c90ba6715e71 100644 |
| --- a/src/gpu/GrClipMaskManager.cpp |
| +++ b/src/gpu/GrClipMaskManager.cpp |
| @@ -18,6 +18,7 @@ |
| #include "GrStencilBuffer.h" |
| #include "GrSWMaskHelper.h" |
| #include "effects/GrTextureDomain.h" |
| +#include "effects/GrConvexPolyEffect.h" |
| #include "SkRasterClip.h" |
| #include "SkStrokeRec.h" |
| #include "SkTLazy.h" |
| @@ -153,9 +154,33 @@ bool GrClipMaskManager::setupClipping(const GrClipData* clipDataIn, |
| return true; |
| } |
| -#if GR_AA_CLIP |
| - // TODO: catch isRect && requiresAA and use clip planes if available rather than a mask. |
| + // If there is only one clip element and it is a convex polygon we just install an effect that |
| + // clips against the edges. |
|
robertphillips
2014/01/31 19:58:58
Will inverse filled paths work correctly?
bsalomon
2014/01/31 20:05:32
Yup, the effect factory fails.
|
| + if (1 == elements.count() && SkClipStack::Element::kPath_Type == elements.tail()->getType() && |
| + SkRegion::kReplace_Op == elements.tail()->getOp()) { |
| + const SkPath& p = elements.tail()->getPath(); |
| + bool isAA = GR_AA_CLIP && elements.tail()->isAA(); |
| + SkAutoTUnref<GrEffectRef> effect; |
| + if (rt->isMultisampled()) { |
| + // A coverage effect for AA clipping won't play nicely with MSAA. |
| + if (!isAA) { |
| + effect.reset(GrConvexPolyEffect::Create(GrConvexPolyEffect::kFillNoAA_EdgeType, p)); |
| + } |
| + } else { |
| + GrConvexPolyEffect::EdgeType type = isAA ? GrConvexPolyEffect::kFillAA_EdgeType : |
| + GrConvexPolyEffect::kFillNoAA_EdgeType; |
| + effect.reset(GrConvexPolyEffect::Create(type, p)); |
| + } |
| + if (effect) { |
| + are->set(fGpu->drawState()); |
| + fGpu->drawState()->addCoverageEffect(effect); |
| + fGpu->disableScissor(); |
| + this->setGpuStencil(); |
| + return true; |
| + } |
| + } |
| +#if GR_AA_CLIP |
| // If MSAA is enabled we can do everything in the stencil buffer. |
| if (0 == rt->numSamples() && requiresAA) { |
| GrTexture* result = NULL; |