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