diff options
-rw-r--r-- | include/effects/SkTestImageFilters.h | 5 | ||||
-rwxr-xr-x | 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 2b3ca84da8..943bb53356 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<SkSpecialImage> 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 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) { |