From 0a291c7b7eea1807bd58bdaa60c258fd0ebeb257 Mon Sep 17 00:00:00 2001 From: robertphillips Date: Wed, 23 Mar 2016 05:00:01 -0700 Subject: [PATCH] Switch SkDropShaderImageFilter over to new onFilterImage interface TBR=bsalomon@google.com GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1784863003 Review URL: https://codereview.chromium.org/1784863003 --- include/effects/SkDropShadowImageFilter.h | 9 +++-- src/effects/SkDropShadowImageFilter.cpp | 59 +++++++++++++++++-------------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/include/effects/SkDropShadowImageFilter.h b/include/effects/SkDropShadowImageFilter.h index 1212c3f..e3620b0 100644 --- a/include/effects/SkDropShadowImageFilter.h +++ b/include/effects/SkDropShadowImageFilter.h @@ -5,6 +5,9 @@ * found in the LICENSE file. */ +#ifndef SkDropShadowImageFilter_DEFINED +#define SkDropShadowImageFilter_DEFINED + #include "SkColor.h" #include "SkImageFilter.h" #include "SkScalar.h" @@ -33,8 +36,8 @@ public: protected: void flatten(SkWriteBuffer&) const override; - bool onFilterImageDeprecated(Proxy*, const SkBitmap& source, const Context&, SkBitmap* result, - SkIPoint* loc) const override; + SkSpecialImage* onFilterImage(SkSpecialImage* source, const Context&, + SkIPoint* offset) const override; SkIRect onFilterNodeBounds(const SkIRect& src, const SkMatrix&, MapDirection) const override; private: @@ -47,3 +50,5 @@ private: typedef SkImageFilter INHERITED; }; + +#endif diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp index e32b89e..2ae2a12 100644 --- a/src/effects/SkDropShadowImageFilter.cpp +++ b/src/effects/SkDropShadowImageFilter.cpp @@ -7,12 +7,11 @@ #include "SkDropShadowImageFilter.h" -#include "SkBitmap.h" #include "SkBlurImageFilter.h" #include "SkCanvas.h" -#include "SkColorMatrixFilter.h" -#include "SkDevice.h" #include "SkReadBuffer.h" +#include "SkSpecialImage.h" +#include "SkSpecialSurface.h" #include "SkWriteBuffer.h" SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, @@ -25,8 +24,7 @@ SkDropShadowImageFilter::SkDropShadowImageFilter(SkScalar dx, SkScalar dy, , fSigmaX(sigmaX) , fSigmaY(sigmaY) , fColor(color) - , fShadowMode(shadowMode) -{ + , fShadowMode(shadowMode) { } SkFlattenable* SkDropShadowImageFilter::CreateProc(SkReadBuffer& buffer) { @@ -53,48 +51,57 @@ void SkDropShadowImageFilter::flatten(SkWriteBuffer& buffer) const { buffer.writeInt(static_cast(fShadowMode)); } -bool SkDropShadowImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitmap& source, - const Context& ctx, - SkBitmap* result, SkIPoint* offset) const { - SkBitmap src = source; - SkIPoint srcOffset = SkIPoint::Make(0, 0); - if (!this->filterInputDeprecated(0, proxy, source, ctx, &src, &srcOffset)) - return false; +SkSpecialImage* SkDropShadowImageFilter::onFilterImage(SkSpecialImage* source, const Context& ctx, + SkIPoint* offset) const { + SkIPoint inputOffset = SkIPoint::Make(0, 0); + SkAutoTUnref input(this->filterInput(0, source, ctx, &inputOffset)); + if (!input) { + return nullptr; + } - SkIRect srcBounds = src.bounds(); - srcBounds.offset(srcOffset); + const SkIRect inputBounds = SkIRect::MakeXYWH(inputOffset.x(), inputOffset.y(), + input->width(), input->height()); SkIRect bounds; - if (!this->applyCropRect(ctx, srcBounds, &bounds)) { - return false; + if (!this->applyCropRect(ctx, inputBounds, &bounds)) { + return nullptr; } - SkAutoTUnref device(proxy->createDevice(bounds.width(), bounds.height())); - if (nullptr == device.get()) { - return false; + const SkImageInfo info = SkImageInfo::MakeN32(bounds.width(), bounds.height(), + kPremul_SkAlphaType); + sk_sp surf(source->makeSurface(info)); + if (!surf) { + return nullptr; } - SkCanvas canvas(device.get()); + + SkCanvas* canvas = surf->getCanvas(); + SkASSERT(canvas); + + canvas->clear(0x0); SkVector sigma = SkVector::Make(fSigmaX, fSigmaY); ctx.ctm().mapVectors(&sigma, 1); sigma.fX = SkMaxScalar(0, sigma.fX); sigma.fY = SkMaxScalar(0, sigma.fY); + SkAutoTUnref blurFilter(SkBlurImageFilter::Create(sigma.fX, sigma.fY)); SkPaint paint; paint.setImageFilter(blurFilter.get()); paint.setColorFilter(SkColorFilter::MakeModeFilter(fColor, SkXfermode::kSrcIn_Mode)); paint.setXfermodeMode(SkXfermode::kSrcOver_Mode); + SkVector offsetVec = SkVector::Make(fDx, fDy); ctx.ctm().mapVectors(&offsetVec, 1); - canvas.translate(SkIntToScalar(srcOffset.fX - bounds.fLeft), - SkIntToScalar(srcOffset.fY - bounds.fTop)); - canvas.drawBitmap(src, offsetVec.fX, offsetVec.fY, &paint); + + canvas->translate(SkIntToScalar(inputOffset.fX - bounds.fLeft), + SkIntToScalar(inputOffset.fY - bounds.fTop)); + input->draw(canvas, offsetVec.fX, offsetVec.fY, &paint); + if (fShadowMode == kDrawShadowAndForeground_ShadowMode) { - canvas.drawBitmap(src, 0, 0); + input->draw(canvas, 0, 0, nullptr); } - *result = device->accessBitmap(false); offset->fX = bounds.fLeft; offset->fY = bounds.fTop; - return true; + return surf->makeImageSnapshot().release(); } SkRect SkDropShadowImageFilter::computeFastBounds(const SkRect& src) const { -- 2.7.4