Index: src/gpu/GrBlurUtils.cpp |
diff --git a/src/gpu/GrBlurUtils.cpp b/src/gpu/GrBlurUtils.cpp |
index 0a8351fd07793ab25863b5a0fa275ceac14b1bfa..40bd6f973bc915d69767420a66c50dc68d60004b 100644 |
--- a/src/gpu/GrBlurUtils.cpp |
+++ b/src/gpu/GrBlurUtils.cpp |
@@ -28,11 +28,11 @@ static bool clip_bounds_quick_reject(const SkIRect& clipBounds, const SkIRect& r |
static bool draw_mask(GrDrawContext* drawContext, |
const GrClip& clip, |
const SkMatrix& viewMatrix, |
- const SkRect& maskRect, |
+ const SkIRect& maskRect, |
GrPaint* grp, |
GrTexture* mask) { |
SkMatrix matrix; |
- matrix.setTranslate(-maskRect.fLeft, -maskRect.fTop); |
+ matrix.setTranslate(-SkIntToScalar(maskRect.fLeft), -SkIntToScalar(maskRect.fTop)); |
matrix.postIDiv(mask->width(), mask->height()); |
grp->addCoverageFragmentProcessor(GrSimpleTextureEffect::Create(mask, matrix, |
@@ -42,7 +42,8 @@ static bool draw_mask(GrDrawContext* drawContext, |
if (!viewMatrix.invert(&inverse)) { |
return false; |
} |
- drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), maskRect, inverse); |
+ drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), |
+ SkRect::Make(maskRect), inverse); |
return true; |
} |
@@ -86,23 +87,16 @@ static bool sw_draw_with_mask_filter(GrDrawContext* drawContext, |
texture->writePixels(0, 0, desc.fWidth, desc.fHeight, desc.fConfig, |
dstM.fImage, dstM.fRowBytes); |
- SkRect maskRect = SkRect::Make(dstM.fBounds); |
- |
- return draw_mask(drawContext, clipData, viewMatrix, maskRect, grp, texture); |
+ return draw_mask(drawContext, clipData, viewMatrix, dstM.fBounds, grp, texture); |
} |
// Create a mask of 'devPath' and place the result in 'mask'. |
static sk_sp<GrTexture> create_mask_GPU(GrContext* context, |
- SkRect* maskRect, |
+ const SkIRect& maskRect, |
const SkPath& devPath, |
SkStrokeRec::InitStyle fillOrHairline, |
bool doAA, |
int sampleCnt) { |
- // This mask will ultimately be drawn as a non-AA rect (see draw_mask). |
- // Non-AA rects have a bad habit of snapping arbitrarily. Integerize here |
- // so the mask draws in a reproducible manner. |
- *maskRect = SkRect::Make(maskRect->roundOut()); |
- |
if (!doAA) { |
// Don't need MSAA if mask isn't AA |
sampleCnt = 0; |
@@ -116,8 +110,8 @@ static sk_sp<GrTexture> create_mask_GPU(GrContext* context, |
} |
sk_sp<GrDrawContext> drawContext(context->newDrawContext(SkBackingFit::kApprox, |
- SkScalarCeilToInt(maskRect->width()), |
- SkScalarCeilToInt(maskRect->height()), |
+ maskRect.width(), |
+ maskRect.height(), |
config, |
sampleCnt)); |
if (!drawContext) { |
@@ -131,13 +125,13 @@ static sk_sp<GrTexture> create_mask_GPU(GrContext* context, |
tempPaint.setCoverageSetOpXPFactory(SkRegion::kReplace_Op); |
// setup new clip |
- const SkRect clipRect = SkRect::MakeWH(maskRect->width(), maskRect->height()); |
+ const SkRect clipRect = SkRect::MakeIWH(maskRect.width(), maskRect.height()); |
GrClip clip(clipRect); |
// Draw the mask into maskTexture with the path's integerized top-left at |
// the origin using tempPaint. |
SkMatrix translate; |
- translate.setTranslate(-maskRect->fLeft, -maskRect->fTop); |
+ translate.setTranslate(-SkIntToScalar(maskRect.fLeft), -SkIntToScalar(maskRect.fTop)); |
drawContext->drawPath(clip, tempPaint, translate, devPath, GrStyle(fillOrHairline)); |
return drawContext->asTexture();; |
} |
@@ -195,6 +189,9 @@ static void draw_path_with_mask_filter(GrContext* context, |
clipBounds, |
viewMatrix, |
&maskRect)) { |
+ // This mask will ultimately be drawn as a non-AA rect (see draw_mask). |
+ // Non-AA rects have a bad habit of snapping arbitrarily. Integerize here |
+ // so the mask draws in a reproducible manner. |
SkIRect finalIRect; |
maskRect.roundOut(&finalIRect); |
if (clip_bounds_quick_reject(clipBounds, finalIRect)) { |
@@ -215,7 +212,7 @@ static void draw_path_with_mask_filter(GrContext* context, |
} |
sk_sp<GrTexture> mask(create_mask_GPU(context, |
- &maskRect, |
+ finalIRect, |
*path, |
fillOrHairline, |
paint->isAntiAlias(), |
@@ -223,10 +220,10 @@ static void draw_path_with_mask_filter(GrContext* context, |
if (mask) { |
GrTexture* filtered; |
- if (maskFilter->filterMaskGPU(mask.get(), viewMatrix, maskRect, &filtered, true)) { |
+ if (maskFilter->filterMaskGPU(mask.get(), viewMatrix, finalIRect, &filtered, true)) { |
// filterMaskGPU gives us ownership of a ref to the result |
SkAutoTUnref<GrTexture> atu(filtered); |
- if (draw_mask(drawContext, clip, viewMatrix, maskRect, paint, filtered)) { |
+ if (draw_mask(drawContext, clip, viewMatrix, finalIRect, paint, filtered)) { |
// This path is completely drawn |
return; |
} |