Index: src/effects/SkGpuBlurUtils.cpp |
diff --git a/src/effects/SkGpuBlurUtils.cpp b/src/effects/SkGpuBlurUtils.cpp |
index 8ab05dd8621669caee837cb3d10875a1a0574eac..13b6b0a3bc165ffbe58f597856ea042c4e7db106 100644 |
--- a/src/effects/SkGpuBlurUtils.cpp |
+++ b/src/effects/SkGpuBlurUtils.cpp |
@@ -60,21 +60,21 @@ static void convolve_gaussian_1d(GrDrawContext* drawContext, |
texture, direction, radius, sigma, useBounds, bounds)); |
paint.addColorFragmentProcessor(conv); |
paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); |
- SkMatrix localMatrix = SkMatrix::MakeTrans(srcOffset.x(), srcOffset.y()); |
+ SkMatrix localMatrix = SkMatrix::MakeTrans(-srcOffset.x(), -srcOffset.y()); |
drawContext->fillRectWithLocalMatrix(clip, paint, SkMatrix::I(), dstRect, localMatrix); |
} |
static void convolve_gaussian_2d(GrDrawContext* drawContext, |
const GrClip& clip, |
- const SkRect& srcRect, |
+ const SkRect& dstRect, |
+ const SkPoint& srcOffset, |
GrTexture* texture, |
int radiusX, |
int radiusY, |
SkScalar sigmaX, |
SkScalar sigmaY, |
const SkRect* srcBounds) { |
- SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height()); |
- SkMatrix localMatrix = SkMatrix::MakeTrans(srcRect.x(), srcRect.y()); |
+ SkMatrix localMatrix = SkMatrix::MakeTrans(-srcOffset.x(), -srcOffset.y()); |
SkISize size = SkISize::Make(2 * radiusX + 1, 2 * radiusY + 1); |
SkIPoint kernelOffset = SkIPoint::Make(radiusX, radiusY); |
GrPaint paint; |
@@ -148,15 +148,15 @@ static void convolve_gaussian(GrDrawContext* drawContext, |
} |
if (midRect.isEmpty()) { |
// Blur radius covers srcBounds; use bounds over entire draw |
- convolve_gaussian_1d(drawContext, clip, dstRect, -srcOffset, texture, |
+ convolve_gaussian_1d(drawContext, clip, dstRect, srcOffset, texture, |
direction, radius, sigma, true, bounds); |
} else { |
// Draw right and left margins with bounds; middle without. |
- convolve_gaussian_1d(drawContext, clip, leftRect, -srcOffset, texture, |
+ convolve_gaussian_1d(drawContext, clip, leftRect, srcOffset, texture, |
direction, radius, sigma, true, bounds); |
- convolve_gaussian_1d(drawContext, clip, rightRect, -srcOffset, texture, |
+ convolve_gaussian_1d(drawContext, clip, rightRect, srcOffset, texture, |
direction, radius, sigma, true, bounds); |
- convolve_gaussian_1d(drawContext, clip, midRect, -srcOffset, texture, |
+ convolve_gaussian_1d(drawContext, clip, midRect, srcOffset, texture, |
direction, radius, sigma, false, bounds); |
} |
} |
@@ -269,6 +269,7 @@ GrTexture* GaussianBlur(GrContext* context, |
// For really small blurs (certainly no wider than 5x5 on desktop gpus) it is faster to just |
// launch a single non separable kernel vs two launches |
+ srcRect = localDstBounds; |
if (sigmaX > 0.0f && sigmaY > 0.0f && |
(2 * radiusX + 1) * (2 * radiusY + 1) <= MAX_KERNEL_SIZE) { |
// We shouldn't be scaling because this is a small size blur |
@@ -279,7 +280,7 @@ GrTexture* GaussianBlur(GrContext* context, |
if (!dstDrawContext) { |
return nullptr; |
} |
- convolve_gaussian_2d(dstDrawContext, clip, srcRect, |
+ convolve_gaussian_2d(dstDrawContext, clip, srcRect, srcOffset, |
srcTexture, radiusX, radiusY, sigmaX, sigmaY, srcBounds); |
srcDrawContext.swap(dstDrawContext); |
@@ -288,7 +289,6 @@ GrTexture* GaussianBlur(GrContext* context, |
SkTSwap(dstTexture, tempTexture); |
} else { |
- srcRect = localDstBounds; |
scale_rect(&srcRect, 1.0f / scaleFactorX, 1.0f / scaleFactorY); |
srcRect.roundOut(&srcRect); |
const SkIRect srcIRect = srcRect.roundOut(); |