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