Index: src/effects/SkTestImageFilters.cpp |
diff --git a/src/effects/SkTestImageFilters.cpp b/src/effects/SkTestImageFilters.cpp |
index 4858eb26f61154019f21986ce5b5c67a4dd43ce3..bc14bcd9cac2928dab9cb169965753f703394ada 100755 |
--- a/src/effects/SkTestImageFilters.cpp |
+++ b/src/effects/SkTestImageFilters.cpp |
@@ -5,32 +5,16 @@ |
#include "SkReadBuffer.h" |
#include "SkWriteBuffer.h" |
-// Simple helper canvas that "takes ownership" of the provided device, so that |
-// when this canvas goes out of scope, so will its device. Could be replaced |
-// with the following: |
-// |
-// SkCanvas canvas(device); |
-// SkAutoTUnref<SkBaseDevice> aur(device); |
-// |
-class OwnDeviceCanvas : public SkCanvas { |
-public: |
- OwnDeviceCanvas(SkBaseDevice* device) : SkCanvas(device) { |
- SkSafeUnref(device); |
- } |
-}; |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-bool SkDownSampleImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, |
+bool SkDownSampleImageFilter::onFilterImage(Proxy* proxy, const SkImage* src, |
const Context&, |
- SkBitmap* result, SkIPoint*) const { |
+ SkAutoTUnref<const SkImage>& result, SkIPoint*) const { |
SkScalar scale = fScale; |
if (scale > SK_Scalar1 || scale <= 0) { |
return false; |
} |
- int dstW = SkScalarRoundToInt(src.width() * scale); |
- int dstH = SkScalarRoundToInt(src.height() * scale); |
+ int dstW = SkScalarRoundToInt(src->width() * scale); |
+ int dstH = SkScalarRoundToInt(src->height() * scale); |
if (dstW < 1) { |
dstW = 1; |
} |
@@ -38,35 +22,43 @@ bool SkDownSampleImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, |
dstH = 1; |
} |
- SkBitmap tmp; |
+ SkAutoTUnref<const SkImage> tmp; |
// downsample |
{ |
- SkBaseDevice* dev = proxy->createDevice(dstW, dstH); |
- if (NULL == dev) { |
+ SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstW, dstH)); |
+ if (NULL == device) { |
return false; |
} |
- OwnDeviceCanvas canvas(dev); |
+ SkCanvas canvas(device); |
SkPaint paint; |
paint.setFilterQuality(kLow_SkFilterQuality); |
canvas.scale(scale, scale); |
- canvas.drawBitmap(src, 0, 0, &paint); |
- tmp = dev->accessBitmap(false); |
+ canvas.drawImage(src, 0, 0, &paint); |
+ |
+ tmp.reset(device->newImageSnapshot()); |
+ if (NULL == tmp) { |
+ return false; |
+ } |
} |
// upscale |
{ |
- SkBaseDevice* dev = proxy->createDevice(src.width(), src.height()); |
- if (NULL == dev) { |
+ SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(src->width(), src->height())); |
+ if (NULL == device) { |
return false; |
} |
- OwnDeviceCanvas canvas(dev); |
- |
- SkRect r = SkRect::MakeWH(SkIntToScalar(src.width()), |
- SkIntToScalar(src.height())); |
- canvas.drawBitmapRect(tmp, NULL, r, NULL); |
- *result = dev->accessBitmap(false); |
+ SkCanvas canvas(device); |
+ SkScalar scaleX = SkIntToScalar(src->width()) / SkIntToScalar(dstW); |
+ SkScalar scaleY = SkIntToScalar(src->height()) / SkIntToScalar(dstH); |
+ canvas.scale(scaleX, scaleY); |
+ canvas.drawImage(tmp, 0, 0, NULL); |
+ SkImage* image = device->newImageSnapshot(); |
+ if (NULL == image) { |
+ return false; |
+ } |
+ result.reset(image); |
} |
return true; |
} |