Index: src/gpu/SkGpuDevice.cpp |
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp |
index a3d2cc3db1b9c6e212e55b2c0c21fb33b745c371..a97e42ece0d12072ff7056e7f8fd2bd3120ed62f 100644 |
--- a/src/gpu/SkGpuDevice.cpp |
+++ b/src/gpu/SkGpuDevice.cpp |
@@ -639,18 +639,22 @@ bool draw_mask(GrContext* context, |
return true; |
} |
+static bool clip_bounds_quick_reject(const SkIRect& clipBounds, const SkIRect& rect) { |
+ return clipBounds.isEmpty() || rect.isEmpty() || !SkIRect::Intersects(clipBounds, rect); |
+} |
+ |
bool draw_with_mask_filter(GrContext* context, |
GrRenderTarget* rt, |
const GrClip& clipData, |
const SkMatrix& viewMatrix, |
const SkPath& devPath, |
SkMaskFilter* filter, |
- const SkRegion& clip, |
+ const SkIRect& clipBounds, |
GrPaint* grp, |
SkPaint::Style style) { |
SkMask srcM, dstM; |
- if (!SkDraw::DrawToMask(devPath, &clip.getBounds(), filter, &viewMatrix, &srcM, |
+ if (!SkDraw::DrawToMask(devPath, &clipBounds, filter, &viewMatrix, &srcM, |
SkMask::kComputeBoundsAndRenderImage_CreateMode, style)) { |
return false; |
} |
@@ -662,7 +666,7 @@ bool draw_with_mask_filter(GrContext* context, |
// this will free-up dstM when we're done (allocated in filterMask()) |
SkAutoMaskFreeImage autoDst(dstM.fImage); |
- if (clip.quickReject(dstM.fBounds)) { |
+ if (clip_bounds_quick_reject(clipBounds, dstM.fBounds)) { |
return false; |
} |
@@ -747,6 +751,13 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
CHECK_SHOULD_DRAW(draw); |
GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPath", fContext); |
+ return this->internalDrawPath(origSrcPath, paint, *draw.fMatrix, prePathMatrix, |
+ draw.fClip->getBounds(), pathIsMutable); |
+} |
+ |
+void SkGpuDevice::internalDrawPath(const SkPath& origSrcPath, const SkPaint& paint, |
+ const SkMatrix& origViewMatrix, const SkMatrix* prePathMatrix, |
+ const SkIRect& clipBounds, bool pathIsMutable) { |
SkASSERT(!pathIsMutable || origSrcPath.isVolatile()); |
GrStrokeInfo strokeInfo(paint); |
@@ -759,7 +770,7 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
SkTLazy<SkPath> effectPath; |
SkPathEffect* pathEffect = paint.getPathEffect(); |
- SkMatrix viewMatrix = *draw.fMatrix; |
+ SkMatrix viewMatrix = origViewMatrix; |
if (prePathMatrix) { |
// stroking and path effects are supposed to be applied *after* the prePathMatrix. |
@@ -819,12 +830,12 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
SkRect maskRect; |
if (paint.getMaskFilter()->canFilterMaskGPU(devPathPtr->getBounds(), |
- draw.fClip->getBounds(), |
+ clipBounds, |
viewMatrix, |
&maskRect)) { |
SkIRect finalIRect; |
maskRect.roundOut(&finalIRect); |
- if (draw.fClip->quickReject(finalIRect)) { |
+ if (clip_bounds_quick_reject(clipBounds, finalIRect)) { |
// clipped out |
return; |
} |
@@ -874,7 +885,7 @@ void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
SkPaint::Style style = stroke.isHairlineStyle() ? SkPaint::kStroke_Style : |
SkPaint::kFill_Style; |
draw_with_mask_filter(fContext, fRenderTarget, fClip, viewMatrix, *devPathPtr, |
- paint.getMaskFilter(), *draw.fClip, &grPaint, style); |
+ paint.getMaskFilter(), clipBounds, &grPaint, style); |
return; |
} |