diff options
author | 2016-04-11 11:08:52 -0700 | |
---|---|---|
committer | 2016-04-11 11:08:53 -0700 | |
commit | fef28606d2c51be627be3a656581882e31945c03 (patch) | |
tree | 0005f7785577898b192ae7c469439037b31b4b35 /src/effects/SkPictureImageFilter.cpp | |
parent | 25e0a0416e5b37c1e0bef1934dc67ff62e442916 (diff) |
Switch SkPictureImageFilter over to new onFilterImage interface
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1779743002
TBR=bsalomon@google.com
Review URL: https://codereview.chromium.org/1779743002
Diffstat (limited to 'src/effects/SkPictureImageFilter.cpp')
-rw-r--r-- | src/effects/SkPictureImageFilter.cpp | 96 |
1 files changed, 58 insertions, 38 deletions
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 |