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