| Index: src/gpu/GrClipMaskManager.cpp
|
| diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
|
| index fa9d189e8c384ac9d6207b68f8f53470e10b151d..303aeccc8a5ae8527c3a2ed4d04d203d87d96bf1 100644
|
| --- a/src/gpu/GrClipMaskManager.cpp
|
| +++ b/src/gpu/GrClipMaskManager.cpp
|
| @@ -126,9 +126,10 @@ GrPathRenderer* GrClipMaskManager::GetPathRenderer(GrContext* context,
|
| return pr;
|
| }
|
|
|
| -GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget)
|
| +GrClipMaskManager::GrClipMaskManager(GrDrawTarget* drawTarget, bool debugClipBatchToBounds)
|
| : fDrawTarget(drawTarget)
|
| - , fClipMode(kIgnoreClip_StencilClipMode) {
|
| + , fClipMode(kIgnoreClip_StencilClipMode)
|
| + , fDebugClipBatchToBounds(debugClipBatchToBounds) {
|
| }
|
|
|
| GrContext* GrClipMaskManager::getContext() {
|
| @@ -272,6 +273,38 @@ bool GrClipMaskManager::getAnalyticClipProcessor(const GrReducedClip::ElementLis
|
| return !failed;
|
| }
|
|
|
| +static void add_rect_to_clip(const GrClip& clip, const SkRect& devRect, GrClip* out) {
|
| + switch (clip.clipType()) {
|
| + case GrClip::kClipStack_ClipType: {
|
| + SkClipStack* stack = new SkClipStack;
|
| + *stack = *clip.clipStack();
|
| + // The stack is actually in clip space not device space.
|
| + SkRect clipRect = devRect;
|
| + SkPoint origin = { SkIntToScalar(clip.origin().fX), SkIntToScalar(clip.origin().fY) };
|
| + clipRect.offset(origin);
|
| + SkIRect iclipRect;
|
| + clipRect.roundOut(&iclipRect);
|
| + clipRect = SkRect::Make(iclipRect);
|
| + stack->clipDevRect(clipRect, SkRegion::kIntersect_Op, false);
|
| + out->setClipStack(stack, &clip.origin());
|
| + break;
|
| + }
|
| + case GrClip::kWideOpen_ClipType:
|
| + *out = GrClip(devRect);
|
| + break;
|
| + case GrClip::kIRect_ClipType: {
|
| + SkIRect intersect;
|
| + devRect.roundOut(&intersect);
|
| + if (intersect.intersect(clip.irect())) {
|
| + *out = GrClip(intersect);
|
| + } else {
|
| + *out = clip;
|
| + }
|
| + break;
|
| + }
|
| + }
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // sort out what kind of clip mask needs to be created: alpha, stencil,
|
| // scissor, or entirely software
|
| @@ -294,7 +327,13 @@ bool GrClipMaskManager::setupClipping(const GrPipelineBuilder& pipelineBuilder,
|
| SkASSERT(rt);
|
|
|
| SkIRect clipSpaceRTIBounds = SkIRect::MakeWH(rt->width(), rt->height());
|
| - const GrClip& clip = pipelineBuilder.clip();
|
| + GrClip devBoundsClip;
|
| + bool doDevBoundsClip = fDebugClipBatchToBounds && devBounds;
|
| + if (doDevBoundsClip) {
|
| + add_rect_to_clip(pipelineBuilder.clip(), *devBounds, &devBoundsClip);
|
| + }
|
| + const GrClip& clip = doDevBoundsClip ? devBoundsClip : pipelineBuilder.clip();
|
| +
|
| if (clip.isWideOpen(clipSpaceRTIBounds)) {
|
| this->setPipelineBuilderStencil(pipelineBuilder, ars);
|
| return true;
|
|
|