Index: src/effects/SkPictureImageFilter.cpp |
diff --git a/src/effects/SkPictureImageFilter.cpp b/src/effects/SkPictureImageFilter.cpp |
index 391af1116927aca5903923a65b28aa780e52f5ed..e181db5b8dc91c0b6cca2412ca3eeb3035fa7c5c 100644 |
--- a/src/effects/SkPictureImageFilter.cpp |
+++ b/src/effects/SkPictureImageFilter.cpp |
@@ -6,7 +6,7 @@ |
*/ |
#include "SkPictureImageFilter.h" |
-#include "SkDevice.h" |
+#include "SkSurface.h" |
#include "SkCanvas.h" |
#include "SkReadBuffer.h" |
#include "SkSurfaceProps.h" |
@@ -90,8 +90,8 @@ void SkPictureImageFilter::flatten(SkWriteBuffer& buffer) const { |
} |
} |
-bool SkPictureImageFilter::onFilterImage(Proxy* proxy, const SkBitmap&, const Context& ctx, |
- SkBitmap* result, SkIPoint* offset) const { |
+bool SkPictureImageFilter::onFilterImage(Proxy* proxy, SkImage&, const Context& ctx, |
+ SkAutoTUnref<SkImage>& result, SkIPoint* offset) const { |
if (!fPicture) { |
offset->fX = offset->fY = 0; |
return true; |
@@ -109,39 +109,44 @@ bool SkPictureImageFilter::onFilterImage(Proxy* proxy, const SkBitmap&, const Co |
return true; |
} |
- SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); |
- if (NULL == device.get()) { |
+ SkAutoTUnref<SkSurface> surface(proxy->createSurface(bounds.width(), bounds.height())); |
+ if (NULL == surface.get()) { |
return false; |
} |
if (kDeviceSpace_PictureResolution == fPictureResolution || |
0 == (ctx.ctm().getType() & ~SkMatrix::kTranslate_Mask)) { |
- drawPictureAtDeviceResolution(proxy, device.get(), bounds, ctx); |
+ drawPictureAtSurfaceResolution(proxy, surface.get(), bounds, ctx); |
} else { |
- drawPictureAtLocalResolution(proxy, device.get(), bounds, ctx); |
+ drawPictureAtLocalResolution(proxy, surface.get(), bounds, ctx); |
} |
- *result = device.get()->accessBitmap(false); |
+ SkImage* snapshot = surface->newImageSnapshot(SkSurface::kYes_Budgeted); |
+ if (NULL == snapshot) { |
+ return false; |
+ } |
+ result.reset(snapshot); |
+ |
offset->fX = bounds.fLeft; |
offset->fY = bounds.fTop; |
return true; |
} |
-void SkPictureImageFilter::drawPictureAtDeviceResolution(Proxy* proxy, SkBaseDevice* device, |
- const SkIRect& deviceBounds, |
+void SkPictureImageFilter::drawPictureAtSurfaceResolution(Proxy* proxy, SkSurface* surface, |
+ const SkIRect& surfaceBounds, |
const Context& ctx) const { |
// Pass explicit surface props, as the simplified canvas constructor discards device properties. |
// FIXME: switch back to the public constructor (and unfriend) after |
// https://code.google.com/p/skia/issues/detail?id=3142 is fixed. |
- SkCanvas canvas(device, proxy->surfaceProps(), SkCanvas::kDefault_InitFlags); |
+ SkCanvas* canvas = surface->getCanvas(); //TODO:(surface, proxy->surfaceProps(), SkCanvas::kDefault_InitFlags); |
- canvas.translate(-SkIntToScalar(deviceBounds.fLeft), -SkIntToScalar(deviceBounds.fTop)); |
- canvas.concat(ctx.ctm()); |
- canvas.drawPicture(fPicture); |
+ canvas->translate(-SkIntToScalar(surfaceBounds.fLeft), -SkIntToScalar(surfaceBounds.fTop)); |
+ canvas->concat(ctx.ctm()); |
+ canvas->drawPicture(fPicture); |
} |
-void SkPictureImageFilter::drawPictureAtLocalResolution(Proxy* proxy, SkBaseDevice* device, |
- const SkIRect& deviceBounds, |
+void SkPictureImageFilter::drawPictureAtLocalResolution(Proxy* proxy, SkSurface* surface, |
+ const SkIRect& surfaceBounds, |
const Context& ctx) const { |
SkMatrix inverseCtm; |
if (!ctx.ctm().invert(&inverseCtm)) |
@@ -151,25 +156,30 @@ void SkPictureImageFilter::drawPictureAtLocalResolution(Proxy* proxy, SkBaseDevi |
if (!localBounds.intersect(fCropRect)) |
return; |
SkIRect localIBounds = localBounds.roundOut(); |
- SkAutoTUnref<SkBaseDevice> localDevice(proxy->createDevice(localIBounds.width(), localIBounds.height())); |
+ SkAutoTUnref<SkSurface> localSurface(proxy->createSurface(localIBounds.width(), localIBounds.height())); |
+ |
// Pass explicit surface props, as the simplified canvas constructor discards device properties. |
// FIXME: switch back to the public constructor (and unfriend) after |
// https://code.google.com/p/skia/issues/detail?id=3142 is fixed. |
- SkCanvas localCanvas(localDevice, proxy->surfaceProps(), SkCanvas::kDefault_InitFlags); |
- localCanvas.translate(-SkIntToScalar(localIBounds.fLeft), -SkIntToScalar(localIBounds.fTop)); |
- localCanvas.drawPicture(fPicture); |
+ SkCanvas* localCanvas = localSurface->getCanvas(); // TODO :PROPS! |
+ localCanvas->translate(-SkIntToScalar(localIBounds.fLeft), -SkIntToScalar(localIBounds.fTop)); |
+ localCanvas->drawPicture(fPicture); |
+ |
+ SkAutoTUnref<SkImage> image(localSurface->newImageSnapshot(SkSurface::kYes_Budgeted)); |
+ if (NULL == image) { |
+ return; |
+ } |
// Pass explicit surface props, as the simplified canvas constructor discards device properties. |
// FIXME: switch back to the public constructor (and unfriend) after |
// https://code.google.com/p/skia/issues/detail?id=3142 is fixed. |
- SkCanvas canvas(device, proxy->surfaceProps(), SkCanvas::kDefault_InitFlags); |
- |
- canvas.translate(-SkIntToScalar(deviceBounds.fLeft), -SkIntToScalar(deviceBounds.fTop)); |
- canvas.concat(ctx.ctm()); |
+ SkCanvas* canvas = surface->getCanvas(); // TODO: (device, proxy->surfaceProps(), SkCanvas::kDefault_InitFlags); |
+ canvas->translate(-SkIntToScalar(surfaceBounds.fLeft), -SkIntToScalar(surfaceBounds.fTop)); |
+ canvas->concat(ctx.ctm()); |
SkPaint paint; |
paint.setFilterLevel(fFilterLevel); |
- canvas.drawBitmap(localDevice.get()->accessBitmap(false), SkIntToScalar(localIBounds.fLeft), |
+ canvas->drawImage(image, SkIntToScalar(localIBounds.fLeft), |
SkIntToScalar(localIBounds.fTop), &paint); |
//canvas.drawPicture(fPicture); |
} |