Index: src/effects/SkTileImageFilter.cpp |
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp |
index c5cf51871da4aab697086e21db0611afc3dcae1b..c99d1674636cda2e79776814c25eecf89bff1fbf 100644 |
--- a/src/effects/SkTileImageFilter.cpp |
+++ b/src/effects/SkTileImageFilter.cpp |
@@ -9,6 +9,7 @@ |
#include "SkBitmap.h" |
#include "SkCanvas.h" |
#include "SkDevice.h" |
+#include "SkImage.h" |
#include "SkReadBuffer.h" |
#include "SkWriteBuffer.h" |
#include "SkMatrix.h" |
@@ -24,13 +25,13 @@ SkTileImageFilter* SkTileImageFilter::Create(const SkRect& srcRect, const SkRect |
return SkNEW_ARGS(SkTileImageFilter, (srcRect, dstRect, input)); |
} |
-bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, |
+bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkImage* src, |
const Context& ctx, |
- SkBitmap* dst, SkIPoint* offset) const { |
- SkBitmap source = src; |
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const { |
+ SkAutoTUnref<const SkImage> source(SkRef(src)); |
SkImageFilter* input = getInput(0); |
SkIPoint srcOffset = SkIPoint::Make(0, 0); |
- if (input && !input->filterImage(proxy, src, ctx, &source, &srcOffset)) { |
+ if (input && !input->filterImage(proxy, src, ctx, source, &srcOffset)) { |
return false; |
} |
@@ -48,14 +49,14 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, |
SkIRect srcIRect; |
srcRect.roundOut(&srcIRect); |
srcIRect.offset(-srcOffset); |
- SkBitmap subset; |
- SkIRect bounds; |
- source.getBounds(&bounds); |
+ SkIRect bounds = SkIRect::MakeWH(source->width(), source->height()); |
if (!srcIRect.intersect(bounds)) { |
offset->fX = offset->fY = 0; |
return true; |
- } else if (!source.extractSubset(&subset, srcIRect)) { |
+ } |
+ SkAutoTUnref<SkImage> subset(source->newImage(srcIRect.width(), srcIRect.height(), &srcIRect)); |
+ if (!subset) { |
return false; |
} |
@@ -63,20 +64,28 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, |
if (NULL == device.get()) { |
return false; |
} |
- SkCanvas canvas(device); |
- SkPaint paint; |
- paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
+ { |
+ SkCanvas canvas(device); |
+ SkPaint paint; |
+ paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
+ |
+ SkMatrix shaderMatrix; |
+ shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX), |
+ SkIntToScalar(srcOffset.fY)); |
+ SkAutoTUnref<SkShader> shader(subset->newShader(SkShader::kRepeat_TileMode, |
+ SkShader::kRepeat_TileMode, &shaderMatrix)); |
+ |
+ paint.setShader(shader); |
+ subset.reset(NULL); |
+ canvas.translate(-dstRect.fLeft, -dstRect.fTop); |
+ canvas.drawRect(dstRect, paint); |
+ } |
- SkMatrix shaderMatrix; |
- shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX), |
- SkIntToScalar(srcOffset.fY)); |
- SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(subset, |
- SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, |
- &shaderMatrix)); |
- paint.setShader(shader); |
- canvas.translate(-dstRect.fLeft, -dstRect.fTop); |
- canvas.drawRect(dstRect, paint); |
- *dst = device->accessBitmap(false); |
+ SkImage* image = device->newImageSnapshot(); |
+ if (NULL == image) { |
+ return false; |
+ } |
+ dst.reset(image); |
offset->fX = dstIRect.fLeft; |
offset->fY = dstIRect.fTop; |
return true; |