From 33550dab45516bbcfa5ab908c5857fb382535c44 Mon Sep 17 00:00:00 2001 From: robertphillips Date: Mon, 4 Apr 2016 05:04:45 -0700 Subject: [PATCH] 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 --- include/effects/SkTestImageFilters.h | 5 ++- src/effects/SkTestImageFilters.cpp | 79 ++++++++++++++++++------------------ 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/include/effects/SkTestImageFilters.h b/include/effects/SkTestImageFilters.h index 2b3ca84..943bb53 100644 --- a/include/effects/SkTestImageFilters.h +++ b/include/effects/SkTestImageFilters.h @@ -30,8 +30,9 @@ public: protected: void flatten(SkWriteBuffer&) const override; - bool onFilterImageDeprecated(Proxy*, const SkBitmap& src, const Context&, SkBitmap* result, - SkIPoint* loc) const override; + + sk_sp onFilterImage(SkSpecialImage* source, const Context&, + SkIPoint* offset) const override; private: SkDownSampleImageFilter(SkScalar scale, SkImageFilter* input) diff --git a/src/effects/SkTestImageFilters.cpp b/src/effects/SkTestImageFilters.cpp index e9ec7c1..f1ac33b 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 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 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 tmp; // downsample { - SkBaseDevice* dev = proxy->createDevice(dstW, dstH); - if (nullptr == dev) { - return false; + const SkImageInfo info = SkImageInfo::MakeN32Premul(dstW, dstH); + + sk_sp 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 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 SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) { -- 2.7.4