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. |
+ 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; |