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