Chromium Code Reviews| Index: src/effects/SkTestImageFilters.cpp |
| diff --git a/src/effects/SkTestImageFilters.cpp b/src/effects/SkTestImageFilters.cpp |
| index a77f5190ffde0ed4d13db5a6ee737417b60dd7cb..34e1d000782a92d663695a42abd7a3dbeef53a9d 100755 |
| --- a/src/effects/SkTestImageFilters.cpp |
| +++ b/src/effects/SkTestImageFilters.cpp |
| @@ -7,36 +7,22 @@ |
| #include "SkTestImageFilters.h" |
| #include "SkCanvas.h" |
| -#include "SkDevice.h" |
| #include "SkReadBuffer.h" |
| +#include "SkSpecialImage.h" |
| +#include "SkSpecialSurface.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::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& src, |
| - const Context&, |
| - SkBitmap* result, SkIPoint*) const { |
| - SkScalar scale = fScale; |
| - if (scale > SK_Scalar1 || scale <= 0) { |
| - return false; |
| +sk_sp<SkSpecialImage> SkDownSampleImageFilter::onFilterImage(SkSpecialImage* source, |
| + const Context& ctx, |
| + SkIPoint* offset) const { |
| + if (fScale > SK_Scalar1 || fScale <= 0) { |
| + return nullptr; |
| } |
| - int dstW = SkScalarRoundToInt(src.width() * scale); |
| - int dstH = SkScalarRoundToInt(src.height() * scale); |
| + int dstW = SkScalarRoundToInt(source->width() * fScale); |
| + int dstH = SkScalarRoundToInt(source->height() * fScale); |
| if (dstW < 1) { |
| dstW = 1; |
| } |
| @@ -44,35 +30,46 @@ bool SkDownSampleImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitm |
| dstH = 1; |
| } |
| - SkBitmap tmp; |
| + sk_sp<SkSpecialImage> tmp; |
| // downsample |
| { |
| - SkBaseDevice* dev = proxy->createDevice(dstW, dstH); |
| - if (nullptr == dev) { |
| - return false; |
| + const SkImageInfo info = SkImageInfo::MakeN32Premul(dstW, dstH); |
| + |
| + sk_sp<SkSpecialSurface> surf(source->makeSurface(info)); |
| + if (!surf) { |
| + return nullptr; |
| } |
| - OwnDeviceCanvas canvas(dev); |
| - SkPaint paint; |
| + SkCanvas* canvas = surf->getCanvas(); |
| + SkASSERT(canvas); |
| + |
| + SkPaint paint; |
| paint.setFilterQuality(kLow_SkFilterQuality); |
| - canvas.scale(scale, scale); |
| - canvas.drawBitmap(src, 0, 0, &paint); |
| - tmp = dev->accessBitmap(false); |
| + |
| + canvas->scale(fScale, fScale); |
| + source->draw(canvas, 0, 0, &paint); |
| + |
| + tmp = surf->makeImageSnapshot(); |
| } |
| // upscale |
| { |
| - SkBaseDevice* dev = proxy->createDevice(src.width(), src.height()); |
| - if (nullptr == dev) { |
| - return false; |
| + const SkImageInfo info = SkImageInfo::MakeN32Premul(source->width(), source->height()); |
| + |
| + sk_sp<SkSpecialSurface> surf(source->makeSurface(info)); |
| + if (!surf) { |
| + return nullptr; |
| } |
| - OwnDeviceCanvas canvas(dev); |
| - canvas.drawBitmapRect(tmp, SkRect::MakeIWH(src.width(), src.height()), nullptr); |
| - *result = dev->accessBitmap(false); |
| + SkCanvas* canvas = surf->getCanvas(); |
| + SkASSERT(canvas); |
| + |
| + canvas->scale(1.0f/fScale, 1.0f/fScale); |
|
Stephen White
2016/03/31 17:50:15
SkScalarInvert, so it handles the scalar-is-double
robertphillips
2016/03/31 18:50:40
Done.
|
| + tmp->draw(canvas, 0, 0, nullptr); |
| + |
| + return surf->makeImageSnapshot(); |
| } |
| - return true; |
| } |
| SkFlattenable* SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) { |