Index: src/effects/SkTileImageFilter.cpp |
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp |
index 73e5304adb3db2f8a0a87908a5f3e1b0c0d76030..3f0e17564bac0cda8feb7869e231478475910e02 100644 |
--- a/src/effects/SkTileImageFilter.cpp |
+++ b/src/effects/SkTileImageFilter.cpp |
@@ -19,8 +19,8 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, const S |
SkBitmap* dst, SkIPoint* offset) { |
SkBitmap source = src; |
SkImageFilter* input = getInput(0); |
- SkIPoint localOffset = SkIPoint::Make(0, 0); |
- if (input && !input->filterImage(proxy, src, ctm, &source, &localOffset)) { |
+ SkIPoint srcOffset = SkIPoint::Make(0, 0); |
+ if (input && !input->filterImage(proxy, src, ctm, &source, &srcOffset)) { |
return false; |
} |
@@ -36,9 +36,11 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, const S |
ctm.mapRect(&srcRect, fSrcRect); |
SkIRect srcIRect; |
srcRect.roundOut(&srcIRect); |
+ srcIRect.offset(-srcOffset); |
SkBitmap subset; |
SkIRect bounds; |
source.getBounds(&bounds); |
+ |
if (!srcIRect.intersect(bounds)) { |
return true; |
} else if (!source.extractSubset(&subset, srcIRect)) { |
@@ -55,10 +57,16 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, const S |
SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(subset, |
SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode)); |
+ SkMatrix shaderMatrix; |
+ shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX), |
+ SkIntToScalar(srcOffset.fY)); |
+ shader->setLocalMatrix(shaderMatrix); |
paint.setShader(shader); |
- dstRect.offset(SkIntToScalar(localOffset.fX), SkIntToScalar(localOffset.fY)); |
+ canvas.translate(-dstRect.fLeft, -dstRect.fTop); |
canvas.drawRect(dstRect, paint); |
*dst = device->accessBitmap(false); |
+ offset->fX = dstRect.fLeft; |
+ offset->fY = dstRect.fTop; |
return true; |
} |