Index: src/gpu/GrClipMaskManager.cpp |
diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp |
index da128fb5c002847d8efd794d89f4e72ebf7ade68..0d2d5b073e7c1cbdd2f2e56019b216c625883e19 100644 |
--- a/src/gpu/GrClipMaskManager.cpp |
+++ b/src/gpu/GrClipMaskManager.cpp |
@@ -137,11 +137,6 @@ GrPathRenderer* GrClipMaskManager::GetPathRenderer(GrContext* context, |
return pr; |
} |
-GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget) |
- : fDrawTarget(drawTarget) |
- , fClipMode(kIgnoreClip_StencilClipMode) { |
-} |
- |
GrContext* GrClipMaskManager::getContext() { |
return fDrawTarget->cmmAccess().context(); |
} |
@@ -288,11 +283,11 @@ bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis |
// sort out what kind of clip mask needs to be created: alpha, stencil, |
// scissor, or entirely software |
bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
- const GrClip& clip, |
+ const GrClipStackClip& clip, |
const SkRect* devBounds, |
GrAppliedClip* out) { |
- if (kRespectClip_StencilClipMode == fClipMode) { |
- fClipMode = kIgnoreClip_StencilClipMode; |
+ if (!clip.clipStack() || clip.clipStack()->isWideOpen()) { |
+ return true; |
} |
GrReducedClip::ElementList elements; |
@@ -306,59 +301,36 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
SkASSERT(rt); |
SkIRect clipSpaceRTIBounds = SkIRect::MakeWH(rt->width(), rt->height()); |
- if (clip.isWideOpen(clipSpaceRTIBounds)) { |
- return true; |
- } |
+ clipSpaceRTIBounds.offset(clip.origin()); |
- // The clip mask manager always draws with a single IRect so we special case that logic here |
- // Image filters just use a rect, so we also special case that logic |
- switch (clip.clipType()) { |
- case GrClip::kWideOpen_ClipType: |
- SkFAIL("Should have caught this with clip.isWideOpen()"); |
- return true; |
- case GrClip::kIRect_ClipType: { |
- SkIRect scissor = clip.irect(); |
- if (scissor.intersect(clipSpaceRTIBounds)) { |
- out->fScissorState.set(scissor); |
- out->fHasStencilClip = kIgnoreClip_StencilClipMode != fClipMode; |
+ SkIRect clipSpaceReduceQueryBounds; |
+#define DISABLE_DEV_BOUNDS_FOR_CLIP_REDUCTION 0 |
+ if (devBounds && !DISABLE_DEV_BOUNDS_FOR_CLIP_REDUCTION) { |
+ SkIRect devIBounds = devBounds->roundOut(); |
+ devIBounds.offset(clip.origin()); |
+ if (!clipSpaceReduceQueryBounds.intersect(clipSpaceRTIBounds, devIBounds)) { |
+ return false; |
+ } |
+ } else { |
+ clipSpaceReduceQueryBounds = clipSpaceRTIBounds; |
+ } |
+ GrReducedClip::ReduceClipStack(*clip.clipStack(), |
+ clipSpaceReduceQueryBounds, |
+ &elements, |
+ &genID, |
+ &initialState, |
+ &clipSpaceIBounds, |
+ &requiresAA); |
+ if (elements.isEmpty()) { |
+ if (GrReducedClip::kAllIn_InitialState == initialState) { |
+ if (clipSpaceIBounds == clipSpaceRTIBounds) { |
return true; |
} |
+ } else { |
return false; |
} |
- case GrClip::kClipStack_ClipType: { |
- clipSpaceRTIBounds.offset(clip.origin()); |
- SkIRect clipSpaceReduceQueryBounds; |
-#define DISABLE_DEV_BOUNDS_FOR_CLIP_REDUCTION 0 |
- if (devBounds && !DISABLE_DEV_BOUNDS_FOR_CLIP_REDUCTION) { |
- SkIRect devIBounds = devBounds->roundOut(); |
- devIBounds.offset(clip.origin()); |
- if (!clipSpaceReduceQueryBounds.intersect(clipSpaceRTIBounds, devIBounds)) { |
- return false; |
- } |
- } else { |
- clipSpaceReduceQueryBounds = clipSpaceRTIBounds; |
- } |
- GrReducedClip::ReduceClipStack(*clip.clipStack(), |
- clipSpaceReduceQueryBounds, |
- &elements, |
- &genID, |
- &initialState, |
- &clipSpaceIBounds, |
- &requiresAA); |
- if (elements.isEmpty()) { |
- if (GrReducedClip::kAllIn_InitialState == initialState) { |
- if (clipSpaceIBounds == clipSpaceRTIBounds) { |
- return true; |
- } |
- } else { |
- return false; |
- } |
- } |
- } break; |
} |
- SkASSERT(kIgnoreClip_StencilClipMode == fClipMode); // TODO: Remove fClipMode. |
- |
// An element count of 4 was chosen because of the common pattern in Blink of: |
// isect RR |
// diff RR |
@@ -452,13 +424,12 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder, |
SkIRect scissorSpaceIBounds(clipSpaceIBounds); |
scissorSpaceIBounds.offset(clipSpaceToStencilSpaceOffset); |
out->fScissorState.set(scissorSpaceIBounds); |
- SkASSERT(kRespectClip_StencilClipMode == fClipMode); // TODO: Remove fClipMode. |
out->fHasStencilClip = true; |
return true; |
} |
static bool stencil_element(GrDrawContext* dc, |
- const GrClip& clip, |
+ const GrFixedClip& clip, |
const GrUserStencilSettings* ss, |
const SkMatrix& viewMatrix, |
const SkClipStack::Element* element) { |
@@ -603,7 +574,7 @@ GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
} |
#endif |
- GrClip clip(maskSpaceIBounds); |
+ GrFixedClip clip(maskSpaceIBounds); |
// draw directly into the result with the stencil set to make the pixels affected |
// by the clip shape be non-zero. |
@@ -645,7 +616,7 @@ GrTexture* GrClipMaskManager::CreateAlphaClipMask(GrContext* context, |
paint.setAntiAlias(element->isAA()); |
paint.setCoverageSetOpXPFactory(op, false); |
- draw_element(dc.get(), GrClip::WideOpen(), paint, translate, element); |
+ draw_element(dc.get(), GrNoClip(), paint, translate, element); |
} |
} |
@@ -681,7 +652,7 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, |
// We set the current clip to the bounds so that our recursive draws are scissored to them. |
SkIRect stencilSpaceIBounds(clipSpaceIBounds); |
stencilSpaceIBounds.offset(clipSpaceToStencilOffset); |
- GrClip clip(stencilSpaceIBounds); |
+ GrFixedClip clip(stencilSpaceIBounds); |
fDrawTarget->cmmAccess().clearStencilClip(stencilSpaceIBounds, |
GrReducedClip::kAllIn_InitialState == initialState, rt); |
@@ -703,7 +674,7 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, |
bool fillInverted = false; |
// enabled at bottom of loop |
- fClipMode = kIgnoreClip_StencilClipMode; |
+ clip.enableStencilClip(false); |
// This will be used to determine whether the clip shape can be rendered into the |
// stencil with arbitrary stencil settings. |
@@ -801,7 +772,7 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, |
// now we modify the clip bit by rendering either the clip |
// element directly or a bounding rect of the entire clip. |
- fClipMode = kModifyClip_StencilClipMode; |
+ clip.enableStencilClip(true); |
for (GrUserStencilSettings const* const* pass = stencilPasses; *pass; ++pass) { |
pipelineBuilder.setUserStencil(*pass); |
@@ -832,7 +803,6 @@ bool GrClipMaskManager::createStencilClipMask(GrRenderTarget* rt, |
} |
} |
} |
- fClipMode = kRespectClip_StencilClipMode; |
return true; |
} |