diff options
author | robertphillips <robertphillips@google.com> | 2016-04-04 05:04:45 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-04 05:04:45 -0700 |
commit | 33550dab45516bbcfa5ab908c5857fb382535c44 (patch) | |
tree | a689afeafc1d030eb7e8793497014616cc8494e4 /src | |
parent | 6e7025ab13dfc4f0037233e67b4b8e18d6dfd1e1 (diff) |
Switch SkDownSampleImageFilter over to new onFilterImage interface
This will slightly change the testimagefilters GM images
TBR=reed@google.com
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1851583002
Committed: https://skia.googlesource.com/skia/+/daa9da4937b6dfc9e1047239b4afd41b1c5474d5
Review URL: https://codereview.chromium.org/1851583002
Diffstat (limited to 'src')
-rwxr-xr-x | src/effects/SkTestImageFilters.cpp | 79 |
1 files changed, 40 insertions, 39 deletions
diff --git a/src/effects/SkTestImageFilters.cpp b/src/effects/SkTestImageFilters.cpp index e9ec7c19ce..f1ac33bcd7 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,50 @@ 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.setXfermodeMode(SkXfermode::kSrcOver_Mode); 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); + + SkPaint paint; + paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); + + canvas->scale(SkScalarInvert(fScale), SkScalarInvert(fScale)); + tmp->draw(canvas, 0, 0, &paint); + + return surf->makeImageSnapshot(); } - return true; } sk_sp<SkFlattenable> SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) { |