| Index: src/effects/SkTileImageFilter.cpp
|
| diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp
|
| index 669c234d95c7934b456cc6ba208faf8e0286fd40..db13a5967edd901d2ea3f9c917a2594f91fe7cdc 100644
|
| --- a/src/effects/SkTileImageFilter.cpp
|
| +++ b/src/effects/SkTileImageFilter.cpp
|
| @@ -8,7 +8,8 @@
|
| #include "SkTileImageFilter.h"
|
| #include "SkBitmap.h"
|
| #include "SkCanvas.h"
|
| -#include "SkDevice.h"
|
| +#include "SkSurface.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, uniqueID));
|
| }
|
|
|
| -bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
|
| +bool SkTileImageFilter::onFilterImage(Proxy* proxy, SkImage& src,
|
| const Context& ctx,
|
| - SkBitmap* dst, SkIPoint* offset) const {
|
| - SkBitmap source = src;
|
| + SkAutoTUnref<SkImage>& dst, SkIPoint* offset) const {
|
| + SkAutoTUnref<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,35 +49,43 @@ 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;
|
| }
|
|
|
| - SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(w, h));
|
| - if (NULL == device.get()) {
|
| + SkAutoTUnref<SkSurface> surface(proxy->createSurface(w, h));
|
| + if (NULL == surface) {
|
| return false;
|
| }
|
| - SkCanvas canvas(device);
|
| - SkPaint paint;
|
| - paint.setXfermodeMode(SkXfermode::kSrc_Mode);
|
| + {
|
| + SkCanvas* canvas = surface->getCanvas();
|
| + 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 = surface->newImageSnapshot(SkSurface::kYes_Budgeted);
|
| + if (NULL == image) {
|
| + return false;
|
| + }
|
| + dst.reset(image);
|
| offset->fX = dstIRect.fLeft;
|
| offset->fY = dstIRect.fTop;
|
| return true;
|
|
|