| 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;
|
|
|