Switch SkDownSampleImageFilter over to new onFilterImage interface
authorrobertphillips <robertphillips@google.com>
Mon, 4 Apr 2016 12:04:45 +0000 (05:04 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 4 Apr 2016 12:04:45 +0000 (05:04 -0700)
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
src/effects/SkTestImageFilters.cpp

index 2b3ca84..943bb53 100644 (file)
@@ -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)
index e9ec7c1..f1ac33b 100755 (executable)
@@ -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) {