aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2016-04-11 11:08:52 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-11 11:08:53 -0700
commitfef28606d2c51be627be3a656581882e31945c03 (patch)
tree0005f7785577898b192ae7c469439037b31b4b35
parent25e0a0416e5b37c1e0bef1934dc67ff62e442916 (diff)
Switch SkPictureImageFilter over to new onFilterImage interface
-rw-r--r--include/effects/SkPictureImageFilter.h11
-rw-r--r--src/effects/SkPictureImageFilter.cpp96
2 files changed, 65 insertions, 42 deletions
diff --git a/include/effects/SkPictureImageFilter.h b/include/effects/SkPictureImageFilter.h
index 59097ddf59..c3f9435d61 100644
--- a/include/effects/SkPictureImageFilter.h
+++ b/include/effects/SkPictureImageFilter.h
@@ -79,17 +79,20 @@ protected:
* @param SkReadBuffer Serialized picture data.
*/
void flatten(SkWriteBuffer&) const override;
- bool onFilterImageDeprecated(Proxy*, const SkBitmap& src, const Context&, SkBitmap* result,
- SkIPoint* offset) const override;
+ sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&,
+ SkIPoint* offset) const override;
private:
explicit SkPictureImageFilter(sk_sp<SkPicture> picture);
SkPictureImageFilter(sk_sp<SkPicture> picture, const SkRect& cropRect,
PictureResolution, SkFilterQuality);
- void drawPictureAtDeviceResolution(SkBaseDevice*, const SkIRect& deviceBounds,
+ void drawPictureAtDeviceResolution(SkCanvas* canvas,
+ const SkIRect& deviceBounds,
const Context&) const;
- void drawPictureAtLocalResolution(Proxy*, SkBaseDevice*, const SkIRect& deviceBounds,
+ void drawPictureAtLocalResolution(SkSpecialImage* source,
+ SkCanvas*,
+ const SkIRect& deviceBounds,
const Context&) const;
sk_sp<SkPicture> fPicture;
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp
index 2dff41a8d7..623be2b822 100644
--- a/src/effects/SkPictureImageFilter.cpp
+++ b/src/effects/SkPictureImageFilter.cpp
@@ -6,10 +6,11 @@
*/
#include "SkPictureImageFilter.h"
-#include "SkDevice.h"
+
#include "SkCanvas.h"
#include "SkReadBuffer.h"
-#include "SkSurfaceProps.h"
+#include "SkSpecialImage.h"
+#include "SkSpecialSurface.h"
#include "SkWriteBuffer.h"
#include "SkValidationUtils.h"
@@ -80,55 +81,55 @@ void SkPictureImageFilter::flatten(SkWriteBuffer& buffer) const {
}
}
-bool SkPictureImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitmap&,
- const Context& ctx,
- SkBitmap* result, SkIPoint* offset) const {
+sk_sp<SkSpecialImage> SkPictureImageFilter::onFilterImage(SkSpecialImage* source,
+ const Context& ctx,
+ SkIPoint* offset) const {
if (!fPicture) {
- offset->fX = offset->fY = 0;
- return true;
+ return nullptr;
}
SkRect floatBounds;
ctx.ctm().mapRect(&floatBounds, fCropRect);
SkIRect bounds = floatBounds.roundOut();
if (!bounds.intersect(ctx.clipBounds())) {
- return false;
+ return nullptr;
}
- if (bounds.isEmpty()) {
- offset->fX = offset->fY = 0;
- return true;
- }
+ SkASSERT(!bounds.isEmpty());
- SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height()));
- if (nullptr == device.get()) {
- return false;
+ SkImageInfo info = SkImageInfo::MakeN32(bounds.width(), bounds.height(), kPremul_SkAlphaType);
+ sk_sp<SkSpecialSurface> surf(source->makeSurface(info));
+ if (!surf) {
+ return nullptr;
}
- if (kDeviceSpace_PictureResolution == fPictureResolution ||
+ SkCanvas* canvas = surf->getCanvas();
+ SkASSERT(canvas);
+
+ canvas->clear(0x0);
+
+ if (kDeviceSpace_PictureResolution == fPictureResolution ||
0 == (ctx.ctm().getType() & ~SkMatrix::kTranslate_Mask)) {
- this->drawPictureAtDeviceResolution(device.get(), bounds, ctx);
+ this->drawPictureAtDeviceResolution(canvas, bounds, ctx);
} else {
- this->drawPictureAtLocalResolution(proxy, device.get(), bounds, ctx);
+ this->drawPictureAtLocalResolution(source, canvas, bounds, ctx);
}
- *result = device.get()->accessBitmap(false);
offset->fX = bounds.fLeft;
offset->fY = bounds.fTop;
- return true;
+ return surf->makeImageSnapshot();
}
-void SkPictureImageFilter::drawPictureAtDeviceResolution(SkBaseDevice* device,
+void SkPictureImageFilter::drawPictureAtDeviceResolution(SkCanvas* canvas,
const SkIRect& deviceBounds,
const Context& ctx) const {
- SkCanvas canvas(device);
-
- canvas.translate(-SkIntToScalar(deviceBounds.fLeft), -SkIntToScalar(deviceBounds.fTop));
- canvas.concat(ctx.ctm());
- canvas.drawPicture(fPicture);
+ canvas->translate(-SkIntToScalar(deviceBounds.fLeft), -SkIntToScalar(deviceBounds.fTop));
+ canvas->concat(ctx.ctm());
+ canvas->drawPicture(fPicture);
}
-void SkPictureImageFilter::drawPictureAtLocalResolution(Proxy* proxy, SkBaseDevice* device,
+void SkPictureImageFilter::drawPictureAtLocalResolution(SkSpecialImage* source,
+ SkCanvas* canvas,
const SkIRect& deviceBounds,
const Context& ctx) const {
SkMatrix inverseCtm;
@@ -142,20 +143,39 @@ void SkPictureImageFilter::drawPictureAtLocalResolution(Proxy* proxy, SkBaseDevi
return;
}
SkIRect localIBounds = localBounds.roundOut();
- SkAutoTUnref<SkBaseDevice> localDevice(proxy->createDevice(localIBounds.width(), localIBounds.height()));
- SkCanvas localCanvas(localDevice);
- localCanvas.translate(-SkIntToScalar(localIBounds.fLeft), -SkIntToScalar(localIBounds.fTop));
- localCanvas.drawPicture(fPicture);
+ sk_sp<SkSpecialImage> localImg;
+ {
+ const SkImageInfo info = SkImageInfo::MakeN32(localIBounds.width(), localIBounds.height(),
+ kPremul_SkAlphaType);
+
+ sk_sp<SkSpecialSurface> localSurface(source->makeSurface(info));
+ if (!localSurface) {
+ return;
+ }
+
+ SkCanvas* localCanvas = localSurface->getCanvas();
+ SkASSERT(localCanvas);
+
+ localCanvas->translate(-SkIntToScalar(localIBounds.fLeft),
+ -SkIntToScalar(localIBounds.fTop));
+ localCanvas->drawPicture(fPicture);
- SkCanvas canvas(device);
+ localImg = localSurface->makeImageSnapshot();
+ SkASSERT(localImg);
+ }
+
+ {
+ canvas->translate(-SkIntToScalar(deviceBounds.fLeft), -SkIntToScalar(deviceBounds.fTop));
+ canvas->concat(ctx.ctm());
+ SkPaint paint;
+ paint.setFilterQuality(fFilterQuality);
- canvas.translate(-SkIntToScalar(deviceBounds.fLeft), -SkIntToScalar(deviceBounds.fTop));
- canvas.concat(ctx.ctm());
- SkPaint paint;
- paint.setFilterQuality(fFilterQuality);
- canvas.drawBitmap(localDevice.get()->accessBitmap(false), SkIntToScalar(localIBounds.fLeft),
- SkIntToScalar(localIBounds.fTop), &paint);
+ localImg->draw(canvas,
+ SkIntToScalar(localIBounds.fLeft),
+ SkIntToScalar(localIBounds.fTop),
+ &paint);
+ }
}
#ifndef SK_IGNORE_TO_STRING