diff options
author | robertphillips <robertphillips@google.com> | 2016-03-30 13:34:16 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-30 13:34:17 -0700 |
commit | 2238c9dbca4b791edc512957728a18ce14d55912 (patch) | |
tree | 684102215b697506f7c2dce012bb89183467e208 | |
parent | 3243143f25f4ccba632847574cf8e1a8ee0fe0f2 (diff) |
Update SkMergeImageFilter to sk_sp
TBR=reed@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1847583002
Review URL: https://codereview.chromium.org/1847583002
28 files changed, 141 insertions, 131 deletions
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp index d66d287e18..5fdf95b06d 100644 --- a/bench/ImageFilterDAGBench.cpp +++ b/bench/ImageFilterDAGBench.cpp @@ -11,12 +11,10 @@ #include "SkCanvas.h" #include "SkMergeImageFilter.h" -enum { kNumInputs = 5 }; // Exercise a blur filter connected to 5 inputs of the same merge filter. // This bench shows an improvement in performance once cacheing of re-used // nodes is implemented, since the DAG is no longer flattened to a tree. - class ImageFilterDAGBench : public Benchmark { public: ImageFilterDAGBench() {} @@ -27,21 +25,23 @@ protected: } void onDraw(int loops, SkCanvas* canvas) override { + const SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400)); + for (int j = 0; j < loops; j++) { - SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f)); - SkImageFilter* inputs[kNumInputs]; + sk_sp<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f)); + sk_sp<SkImageFilter> inputs[kNumInputs]; for (int i = 0; i < kNumInputs; ++i) { - inputs[i] = blur.get(); + inputs[i] = blur; } - SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(inputs, kNumInputs)); SkPaint paint; - paint.setImageFilter(merge); - SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400)); + paint.setImageFilter(SkMergeImageFilter::Make(inputs, kNumInputs)); canvas->drawRect(rect, paint); } } private: + static const int kNumInputs = 5; + typedef Benchmark INHERITED; }; diff --git a/bench/MergeBench.cpp b/bench/MergeBench.cpp index e1f7d97b5e..061a4d36f3 100644 --- a/bench/MergeBench.cpp +++ b/bench/MergeBench.cpp @@ -16,6 +16,41 @@ #define FILTER_WIDTH_LARGE SkIntToScalar(256) #define FILTER_HEIGHT_LARGE SkIntToScalar(256) +static sk_sp<SkImage> make_bitmap() { + sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(80, 80)); + surface->getCanvas()->clear(0x00000000); + SkPaint paint; + paint.setAntiAlias(true); + paint.setColor(0xFF884422); + paint.setTextSize(SkIntToScalar(96)); + const char* str = "g"; + surface->getCanvas()->drawText(str, strlen(str), 15, 55, paint); + return surface->makeImageSnapshot(); +} + +static sk_sp<SkImage> make_checkerboard() { + sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(80, 80)); + SkCanvas* canvas = surface->getCanvas(); + canvas->clear(0x00000000); + SkPaint darkPaint; + darkPaint.setColor(0xFF804020); + SkPaint lightPaint; + lightPaint.setColor(0xFF244484); + for (int y = 0; y < 80; y += 16) { + for (int x = 0; x < 80; x += 16) { + canvas->save(); + canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); + canvas->drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); + canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); + canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); + canvas->drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); + canvas->restore(); + } + } + + return surface->makeImageSnapshot(); +} + class MergeBench : public Benchmark { public: MergeBench(bool small) : fIsSmall(small), fInitialized(false) { } @@ -27,8 +62,8 @@ protected: void onDelayedSetup() override { if (!fInitialized) { - make_bitmap(); - make_checkerboard(); + fImage = make_bitmap(); + fCheckerboard = make_checkerboard(); fInitialized = true; } } @@ -37,52 +72,17 @@ protected: SkRect r = fIsSmall ? SkRect::MakeWH(FILTER_WIDTH_SMALL, FILTER_HEIGHT_SMALL) : SkRect::MakeWH(FILTER_WIDTH_LARGE, FILTER_HEIGHT_LARGE); SkPaint paint; - paint.setImageFilter(mergeBitmaps())->unref(); + paint.setImageFilter(this->mergeBitmaps()); for (int i = 0; i < loops; i++) { canvas->drawRect(r, paint); } } private: - SkImageFilter* mergeBitmaps() { - SkAutoTUnref<SkImageFilter> first(SkImageSource::Create(fCheckerboard.get())); - SkAutoTUnref<SkImageFilter> second(SkImageSource::Create(fImage.get())); - return SkMergeImageFilter::Create(first, second); - } - - void make_bitmap() { - auto surface(SkSurface::MakeRasterN32Premul(80, 80)); - surface->getCanvas()->clear(0x00000000); - SkPaint paint; - paint.setAntiAlias(true); - paint.setColor(0xFF884422); - paint.setTextSize(SkIntToScalar(96)); - const char* str = "g"; - surface->getCanvas()->drawText(str, strlen(str), 15, 55, paint); - fImage = surface->makeImageSnapshot(); - } - - void make_checkerboard() { - auto surface(SkSurface::MakeRasterN32Premul(80, 80)); - SkCanvas* canvas = surface->getCanvas(); - canvas->clear(0x00000000); - SkPaint darkPaint; - darkPaint.setColor(0xFF804020); - SkPaint lightPaint; - lightPaint.setColor(0xFF244484); - for (int y = 0; y < 80; y += 16) { - for (int x = 0; x < 80; x += 16) { - canvas->save(); - canvas->translate(SkIntToScalar(x), SkIntToScalar(y)); - canvas->drawRect(SkRect::MakeXYWH(0, 0, 8, 8), darkPaint); - canvas->drawRect(SkRect::MakeXYWH(8, 0, 8, 8), lightPaint); - canvas->drawRect(SkRect::MakeXYWH(0, 8, 8, 8), lightPaint); - canvas->drawRect(SkRect::MakeXYWH(8, 8, 8, 8), darkPaint); - canvas->restore(); - } - } - - fCheckerboard = surface->makeImageSnapshot(); + sk_sp<SkImageFilter> mergeBitmaps() { + sk_sp<SkImageFilter> first(SkImageSource::Create(fCheckerboard.get())); + sk_sp<SkImageFilter> second(SkImageSource::Create(fImage.get())); + return SkMergeImageFilter::Make(std::move(first), std::move(second)); } bool fIsSmall; diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp index d580243453..4a5f5e5977 100644 --- a/gm/imagefiltersbase.cpp +++ b/gm/imagefiltersbase.cpp @@ -91,7 +91,7 @@ static IdentityImageFilter::Registrar gReg1; SkFlattenable* IdentityImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); - return IdentityImageFilter::Create(common.getInput(0)); + return IdentityImageFilter::Create(common.getInput(0).get()); } #ifndef SK_IGNORE_TO_STRING diff --git a/gm/imagefilterscropped.cpp b/gm/imagefilterscropped.cpp index b06761d80c..612990984a 100644 --- a/gm/imagefilterscropped.cpp +++ b/gm/imagefilterscropped.cpp @@ -122,7 +122,7 @@ protected: SkAutoTUnref<SkImageFilter> offset(SkOffsetImageFilter::Create( SkIntToScalar(-10), SkIntToScalar(-10))); - SkAutoTUnref<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf.get(), offset.get())); + sk_sp<SkImageFilter> cfOffset(SkColorFilterImageFilter::Create(cf.get(), offset.get())); SkAutoTUnref<SkImageFilter> erodeX(SkErodeImageFilter::Create(8, 0, nullptr, &cropRect)); SkAutoTUnref<SkImageFilter> erodeY(SkErodeImageFilter::Create(0, 8, nullptr, &cropRect)); @@ -139,7 +139,8 @@ protected: SkErodeImageFilter::Create(8, 0, erodeY, &cropRect), SkErodeImageFilter::Create(0, 8, erodeX, &cropRect), SkErodeImageFilter::Create(8, 8, nullptr, &cropRect), - SkMergeImageFilter::Create(nullptr, cfOffset.get(), SkXfermode::kSrcOver_Mode, &cropRect), + SkMergeImageFilter::Make(nullptr, std::move(cfOffset), + SkXfermode::kSrcOver_Mode, &cropRect).release(), SkBlurImageFilter::Create(8.0f, 8.0f, nullptr, &bogusRect), SkColorFilterImageFilter::Create(cf.get(), nullptr, &bogusRect), }; diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp index 53343bc3d0..e7abdcfc0f 100644 --- a/gm/imagefiltersgraph.cpp +++ b/gm/imagefiltersgraph.cpp @@ -88,7 +88,7 @@ SkFlattenable* SimpleOffsetFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkScalar dx = buffer.readScalar(); SkScalar dy = buffer.readScalar(); - return Create(dx, dy, common.getInput(0)); + return Create(dx, dy, common.getInput(0).get()); } #ifndef SK_IGNORE_TO_STRING @@ -118,15 +118,16 @@ protected: void onDraw(SkCanvas* canvas) override { canvas->clear(SK_ColorBLACK); { - SkAutoTUnref<SkImageFilter> bitmapSource(SkImageSource::Create(fImage.get())); - auto cf(SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mode)); - SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f, bitmapSource)); - SkAutoTUnref<SkImageFilter> erode(SkErodeImageFilter::Create(4, 4, blur)); - SkAutoTUnref<SkImageFilter> color(SkColorFilterImageFilter::Create(cf.get(), erode)); - SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(blur, color)); + sk_sp<SkImageFilter> bitmapSource(SkImageSource::Create(fImage.get())); + sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED, + SkXfermode::kSrcIn_Mode)); + sk_sp<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f, bitmapSource.get())); + sk_sp<SkImageFilter> erode(SkErodeImageFilter::Create(4, 4, blur.get())); + sk_sp<SkImageFilter> color(SkColorFilterImageFilter::Create(cf.get(), erode.get())); + sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(blur, color)); SkPaint paint; - paint.setImageFilter(merge); + paint.setImageFilter(std::move(merge)); canvas->drawPaint(paint); canvas->translate(SkIntToScalar(100), 0); } diff --git a/gm/testimagefilters.cpp b/gm/testimagefilters.cpp index 2380b3438e..c4bddbf4e8 100644 --- a/gm/testimagefilters.cpp +++ b/gm/testimagefilters.cpp @@ -47,7 +47,7 @@ static SkImageFilter* make4() { static SkImageFilter* make5() { sk_sp<SkImageFilter> first(SkOffsetImageFilter::Create(SkIntToScalar(16), SkIntToScalar(16))); sk_sp<SkImageFilter> second(SkDownSampleImageFilter::Create(SK_Scalar1 / 5)); - return SkMergeImageFilter::Create(first.get(), second.get()); + return SkMergeImageFilter::Make(std::move(first), std::move(second)).release(); } static SkImageFilter* make6() { @@ -58,7 +58,7 @@ static SkImageFilter* make6() { sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode)); sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Create(cf.get())); - return SkMergeImageFilter::Create(compose.get(), blue.get()); + return SkMergeImageFilter::Make(std::move(compose), std::move(blue)).release(); } static SkImageFilter* make7() { @@ -69,7 +69,7 @@ static SkImageFilter* make7() { sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(0x880000FF, SkXfermode::kSrcIn_Mode)); sk_sp<SkImageFilter> blue(SkColorFilterImageFilter::Create(cf.get())); - return SkMergeImageFilter::Create(compose.get(), blue.get()); + return SkMergeImageFilter::Make(std::move(compose), std::move(blue)).release(); } static void draw0(SkCanvas* canvas) { diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index d39d97857a..d1b1483386 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -293,9 +293,6 @@ public: protected: class Common { public: - Common() {} - ~Common(); - /** * Attempt to unflatten the cropRect and the expected number of input filters. * If any number of input filters is valid, pass -1. @@ -308,9 +305,9 @@ protected: const CropRect& cropRect() const { return fCropRect; } int inputCount() const { return fInputs.count(); } - SkImageFilter** inputs() const { return fInputs.get(); } + sk_sp<SkImageFilter>* inputs() const { return fInputs.get(); } - SkImageFilter* getInput(int index) const { return fInputs[index]; } + sk_sp<SkImageFilter> getInput(int index) const { return fInputs[index]; } // If the caller wants a copy of the inputs, call this and it will transfer ownership // of the unflattened input filters to the caller. This is just a short-cut for copying @@ -321,7 +318,7 @@ protected: private: CropRect fCropRect; // most filters accept at most 2 input-filters - SkAutoSTArray<2, SkImageFilter*> fInputs; + SkAutoSTArray<2, sk_sp<SkImageFilter>> fInputs; void allocInputs(int count); }; diff --git a/include/effects/SkMergeImageFilter.h b/include/effects/SkMergeImageFilter.h index 3bf649d97d..e85cc1f97f 100644 --- a/include/effects/SkMergeImageFilter.h +++ b/include/effects/SkMergeImageFilter.h @@ -16,30 +16,51 @@ class SK_API SkMergeImageFilter : public SkImageFilter { public: ~SkMergeImageFilter() override; - static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second, - SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode, - const CropRect* cropRect = NULL) { - SkImageFilter* inputs[2] = { first, second }; + static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> first, sk_sp<SkImageFilter> second, + SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode, + const CropRect* cropRect = nullptr) { + sk_sp<SkImageFilter> inputs[2] = { first, second }; SkXfermode::Mode modes[2] = { mode, mode }; - return new SkMergeImageFilter(inputs, 2, modes, cropRect); + return sk_sp<SkImageFilter>(new SkMergeImageFilter(inputs, 2, modes, cropRect)); } - static SkImageFilter* Create(SkImageFilter* filters[], int count, - const SkXfermode::Mode modes[] = NULL, - const CropRect* cropRect = NULL) { - return new SkMergeImageFilter(filters, count, modes, cropRect); + static sk_sp<SkImageFilter> Make(sk_sp<SkImageFilter> filters[], + int count, + const SkXfermode::Mode modes[] = nullptr, + const CropRect* cropRect = nullptr) { + return sk_sp<SkImageFilter>(new SkMergeImageFilter(filters, count, modes, cropRect)); } SK_TO_STRING_OVERRIDE() SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkMergeImageFilter) +#ifdef SK_SUPPORT_LEGACY_IMAGEFILTER_PTR + static SkImageFilter* Create(SkImageFilter* first, SkImageFilter* second, + SkXfermode::Mode mode = SkXfermode::kSrcOver_Mode, + const CropRect* cropRect = nullptr) { + return Make(sk_ref_sp<SkImageFilter>(first), + sk_ref_sp<SkImageFilter>(second), + mode, cropRect).release(); + } + + static SkImageFilter* Create(SkImageFilter* filters[], int count, + const SkXfermode::Mode modes[] = nullptr, + const CropRect* cropRect = nullptr) { + SkAutoTDeleteArray<sk_sp<SkImageFilter>> temp(new sk_sp<SkImageFilter>[count]); + for (int i = 0; i < count; ++i) { + temp[i] = sk_ref_sp<SkImageFilter>(filters[i]); + } + return Make(temp.get(), count, modes, cropRect).release(); + } +#endif + protected: void flatten(SkWriteBuffer&) const override; sk_sp<SkSpecialImage> onFilterImage(SkSpecialImage* source, const Context&, SkIPoint* offset) const override; private: - SkMergeImageFilter(SkImageFilter* filters[], int count, const SkXfermode::Mode modes[], + SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkXfermode::Mode modes[], const CropRect* cropRect); uint8_t* fModes; // SkXfermode::Mode diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp index 103d8c4a56..a1e8c2df7b 100644 --- a/samplecode/SampleFilterFuzz.cpp +++ b/samplecode/SampleFilterFuzz.cpp @@ -559,14 +559,11 @@ static sk_sp<SkImageFilter> make_image_filter(bool canBeNull) { make_scalar(), make_scalar())); break; - case MERGE: { - sk_sp<SkImageFilter> subFilter1(make_image_filter()); - sk_sp<SkImageFilter> subFilter2(make_image_filter()); - filter = sk_sp<SkImageFilter>(SkMergeImageFilter::Create(subFilter1.get(), - subFilter2.get(), - make_xfermode())); + case MERGE: + filter = SkMergeImageFilter::Make(make_image_filter(), + make_image_filter(), + make_xfermode()); break; - } case COLOR: { sk_sp<SkColorFilter> cf(make_color_filter()); sk_sp<SkImageFilter> subFilter(make_image_filter()); diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index e999d3aebb..3b4ad31456 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -105,22 +105,14 @@ static int32_t next_image_filter_unique_id() { return id; } -SkImageFilter::Common::~Common() { - for (int i = 0; i < fInputs.count(); ++i) { - SkSafeUnref(fInputs[i]); - } -} - void SkImageFilter::Common::allocInputs(int count) { - const size_t size = count * sizeof(SkImageFilter*); fInputs.reset(count); - sk_bzero(fInputs.get(), size); } void SkImageFilter::Common::detachInputs(SkImageFilter** inputs) { - const size_t size = fInputs.count() * sizeof(SkImageFilter*); - memcpy(inputs, fInputs.get(), size); - sk_bzero(fInputs.get(), size); + for (int i = 0; i < fInputs.count(); ++i) { + inputs[i] = fInputs[i].release(); + } } bool SkImageFilter::Common::unflatten(SkReadBuffer& buffer, int expectedCount) { @@ -135,7 +127,7 @@ bool SkImageFilter::Common::unflatten(SkReadBuffer& buffer, int expectedCount) { this->allocInputs(count); for (int i = 0; i < count; i++) { if (buffer.readBool()) { - fInputs[i] = buffer.readImageFilter(); + fInputs[i] = sk_sp<SkImageFilter>(buffer.readImageFilter()); } if (!buffer.isValid()) { return false; diff --git a/src/core/SkLocalMatrixImageFilter.cpp b/src/core/SkLocalMatrixImageFilter.cpp index d1b5715b7f..bf29bd235b 100644 --- a/src/core/SkLocalMatrixImageFilter.cpp +++ b/src/core/SkLocalMatrixImageFilter.cpp @@ -20,8 +20,7 @@ SkFlattenable* SkLocalMatrixImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkMatrix lm; buffer.readMatrix(&lm); - return SkLocalMatrixImageFilter::Make(lm, - sk_ref_sp<SkImageFilter>(common.getInput(0))).release(); + return SkLocalMatrixImageFilter::Make(lm, common.getInput(0)).release(); } void SkLocalMatrixImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/core/SkMatrixImageFilter.cpp b/src/core/SkMatrixImageFilter.cpp index ec221fdcac..b8f510f91c 100644 --- a/src/core/SkMatrixImageFilter.cpp +++ b/src/core/SkMatrixImageFilter.cpp @@ -34,7 +34,7 @@ SkFlattenable* SkMatrixImageFilter::CreateProc(SkReadBuffer& buffer) { SkMatrix matrix; buffer.readMatrix(&matrix); SkFilterQuality quality = static_cast<SkFilterQuality>(buffer.readInt()); - return Create(matrix, quality, common.getInput(0)); + return Create(matrix, quality, common.getInput(0).get()); } void SkMatrixImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp index 55dfe58b46..177a3ba5f0 100644 --- a/src/effects/SkAlphaThresholdFilter.cpp +++ b/src/effects/SkAlphaThresholdFilter.cpp @@ -269,7 +269,7 @@ SkFlattenable* SkAlphaThresholdFilterImpl::CreateProc(SkReadBuffer& buffer) { SkScalar outer = buffer.readScalar(); SkRegion rgn; buffer.readRegion(&rgn); - return SkAlphaThresholdFilter::Create(rgn, inner, outer, common.getInput(0)); + return SkAlphaThresholdFilter::Create(rgn, inner, outer, common.getInput(0).get()); } SkAlphaThresholdFilterImpl::SkAlphaThresholdFilterImpl(const SkRegion& region, diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp index 65c0aa8d0a..c7964c3218 100644 --- a/src/effects/SkBlurImageFilter.cpp +++ b/src/effects/SkBlurImageFilter.cpp @@ -46,7 +46,7 @@ SkFlattenable* SkBlurImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkScalar sigmaX = buffer.readScalar(); SkScalar sigmaY = buffer.readScalar(); - return Create(sigmaX, sigmaY, common.getInput(0), &common.cropRect()); + return Create(sigmaX, sigmaY, common.getInput(0).get(), &common.cropRect()); } void SkBlurImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp index 1da8b2ce16..beb3138c84 100644 --- a/src/effects/SkColorFilterImageFilter.cpp +++ b/src/effects/SkColorFilterImageFilter.cpp @@ -44,7 +44,7 @@ SkColorFilterImageFilter::SkColorFilterImageFilter(SkColorFilter* cf, SkFlattenable* SkColorFilterImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); sk_sp<SkColorFilter> cf(buffer.readColorFilter()); - return Create(cf.get(), common.getInput(0), &common.cropRect()); + return Create(cf.get(), common.getInput(0).get(), &common.cropRect()); } void SkColorFilterImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkComposeImageFilter.cpp b/src/effects/SkComposeImageFilter.cpp index 3cd8a9e6fd..e2a27a8312 100644 --- a/src/effects/SkComposeImageFilter.cpp +++ b/src/effects/SkComposeImageFilter.cpp @@ -60,8 +60,7 @@ SkIRect SkComposeImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& SkFlattenable* SkComposeImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); - return SkComposeImageFilter::Make(sk_ref_sp<SkImageFilter>(common.getInput(0)), - sk_ref_sp<SkImageFilter>(common.getInput(1))).release(); + return SkComposeImageFilter::Make(common.getInput(0), common.getInput(1)).release(); } #ifndef SK_IGNORE_TO_STRING diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index ec75fd0604..d054e58e51 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -200,7 +200,8 @@ SkFlattenable* SkDisplacementMapEffect::CreateProc(SkReadBuffer& buffer) { ChannelSelectorType xsel = (ChannelSelectorType)buffer.readInt(); ChannelSelectorType ysel = (ChannelSelectorType)buffer.readInt(); SkScalar scale = buffer.readScalar(); - return Create(xsel, ysel, scale, common.getInput(0), common.getInput(1), &common.cropRect()); + return Create(xsel, ysel, scale, + common.getInput(0).get(), common.getInput(1).get(), &common.cropRect()); } void SkDisplacementMapEffect::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkDropShadowImageFilter.cpp b/src/effects/SkDropShadowImageFilter.cpp index 93c11ca1bb..6e750ca74c 100644 --- a/src/effects/SkDropShadowImageFilter.cpp +++ b/src/effects/SkDropShadowImageFilter.cpp @@ -37,7 +37,7 @@ SkFlattenable* SkDropShadowImageFilter::CreateProc(SkReadBuffer& buffer) { ShadowMode shadowMode = buffer.isVersionLT(SkReadBuffer::kDropShadowMode_Version) ? kDrawShadowAndForeground_ShadowMode : static_cast<ShadowMode>(buffer.readInt()); - return Create(dx, dy, sigmaX, sigmaY, color, shadowMode, common.getInput(0), + return Create(dx, dy, sigmaX, sigmaY, color, shadowMode, common.getInput(0).get(), &common.cropRect()); } diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 92028180f6..55a1f22909 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -1215,7 +1215,7 @@ SkFlattenable* SkDiffuseLightingImageFilter::CreateProc(SkReadBuffer& buffer) { SkAutoTUnref<SkImageFilterLight> light(SkImageFilterLight::UnflattenLight(buffer)); SkScalar surfaceScale = buffer.readScalar(); SkScalar kd = buffer.readScalar(); - return Create(light, surfaceScale, kd, common.getInput(0), &common.cropRect()); + return Create(light, surfaceScale, kd, common.getInput(0).get(), &common.cropRect()); } void SkDiffuseLightingImageFilter::flatten(SkWriteBuffer& buffer) const { @@ -1358,7 +1358,7 @@ SkFlattenable* SkSpecularLightingImageFilter::CreateProc(SkReadBuffer& buffer) { SkScalar surfaceScale = buffer.readScalar(); SkScalar ks = buffer.readScalar(); SkScalar shine = buffer.readScalar(); - return Create(light, surfaceScale, ks, shine, common.getInput(0), &common.cropRect()); + return Create(light, surfaceScale, ks, shine, common.getInput(0).get(), &common.cropRect()); } void SkSpecularLightingImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index 7ec2aa21ec..bfad549485 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -285,7 +285,7 @@ SkFlattenable* SkMagnifierImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkRect src; buffer.readRect(&src); - return Create(src, buffer.readScalar(), common.getInput(0)); + return Create(src, buffer.readScalar(), common.getInput(0).get()); } void SkMagnifierImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp index 7a25f5f7eb..c8b43bbfd0 100644 --- a/src/effects/SkMatrixConvolutionImageFilter.cpp +++ b/src/effects/SkMatrixConvolutionImageFilter.cpp @@ -97,7 +97,7 @@ SkFlattenable* SkMatrixConvolutionImageFilter::CreateProc(SkReadBuffer& buffer) TileMode tileMode = (TileMode)buffer.readInt(); bool convolveAlpha = buffer.readBool(); return Create(kernelSize, kernel.get(), gain, bias, kernelOffset, tileMode, convolveAlpha, - common.getInput(0), &common.cropRect()); + common.getInput(0).get(), &common.cropRect()); } void SkMatrixConvolutionImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkMergeImageFilter.cpp b/src/effects/SkMergeImageFilter.cpp index 47d33dffb4..07b2c1cf3e 100755 --- a/src/effects/SkMergeImageFilter.cpp +++ b/src/effects/SkMergeImageFilter.cpp @@ -42,10 +42,10 @@ void SkMergeImageFilter::initModes(const SkXfermode::Mode modes[]) { } } -SkMergeImageFilter::SkMergeImageFilter(SkImageFilter* filters[], int count, +SkMergeImageFilter::SkMergeImageFilter(sk_sp<SkImageFilter> filters[], int count, const SkXfermode::Mode modes[], const CropRect* cropRect) - : INHERITED(count, filters, cropRect) { + : INHERITED(filters, count, cropRect) { SkASSERT(count >= 0); this->initModes(modes); } @@ -149,9 +149,9 @@ SkFlattenable* SkMergeImageFilter::CreateProc(SkReadBuffer& buffer) { if (!buffer.isValid()) { return nullptr; } - return Create(common.inputs(), count, modes.get(), &common.cropRect()); + return Make(common.inputs(), count, modes.get(), &common.cropRect()).release(); } - return Create(common.inputs(), count, nullptr, &common.cropRect()); + return Make(common.inputs(), count, nullptr, &common.cropRect()).release(); } void SkMergeImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index 5c36480bc8..dbb116ed22 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -76,14 +76,14 @@ SkFlattenable* SkErodeImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); const int width = buffer.readInt(); const int height = buffer.readInt(); - return Create(width, height, common.getInput(0), &common.cropRect()); + return Create(width, height, common.getInput(0).get(), &common.cropRect()); } SkFlattenable* SkDilateImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); const int width = buffer.readInt(); const int height = buffer.readInt(); - return Create(width, height, common.getInput(0), &common.cropRect()); + return Create(width, height, common.getInput(0).get(), &common.cropRect()); } #ifndef SK_IGNORE_TO_STRING diff --git a/src/effects/SkOffsetImageFilter.cpp b/src/effects/SkOffsetImageFilter.cpp index 05df229b3e..a2de25e7de 100644 --- a/src/effects/SkOffsetImageFilter.cpp +++ b/src/effects/SkOffsetImageFilter.cpp @@ -86,7 +86,7 @@ SkFlattenable* SkOffsetImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); SkPoint offset; buffer.readPoint(&offset); - return Create(offset.x(), offset.y(), common.getInput(0), &common.cropRect()); + return Create(offset.x(), offset.y(), common.getInput(0).get(), &common.cropRect()); } void SkOffsetImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkTestImageFilters.cpp b/src/effects/SkTestImageFilters.cpp index b8b0e187ed..a77f5190ff 100755 --- a/src/effects/SkTestImageFilters.cpp +++ b/src/effects/SkTestImageFilters.cpp @@ -77,7 +77,7 @@ bool SkDownSampleImageFilter::onFilterImageDeprecated(Proxy* proxy, const SkBitm SkFlattenable* SkDownSampleImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1); - return Create(buffer.readScalar(), common.getInput(0)); + return Create(buffer.readScalar(), common.getInput(0).get()); } void SkDownSampleImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp index e6b561dec4..a4129a5ad0 100644 --- a/src/effects/SkTileImageFilter.cpp +++ b/src/effects/SkTileImageFilter.cpp @@ -127,7 +127,7 @@ SkFlattenable* SkTileImageFilter::CreateProc(SkReadBuffer& buffer) { SkRect src, dst; buffer.readRect(&src); buffer.readRect(&dst); - return Create(src, dst, common.getInput(0)); + return Create(src, dst, common.getInput(0).get()); } void SkTileImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index 8cd75127ba..3b186039d0 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -40,8 +40,8 @@ SkXfermodeImageFilter::SkXfermodeImageFilter(sk_sp<SkXfermode> mode, SkFlattenable* SkXfermodeImageFilter::CreateProc(SkReadBuffer& buffer) { SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 2); sk_sp<SkXfermode> mode(buffer.readXfermode()); - return Make(std::move(mode), common.getInput(0), - common.getInput(1), &common.cropRect()).release(); + return Make(std::move(mode), common.getInput(0).get(), + common.getInput(1).get(), &common.cropRect()).release(); } void SkXfermodeImageFilter::flatten(SkWriteBuffer& buffer) const { diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp index 3cf73a8a9c..910ad46d91 100644 --- a/tests/ImageFilterTest.cpp +++ b/tests/ImageFilterTest.cpp @@ -169,11 +169,13 @@ public: SkMatrixConvolutionImageFilter::Create( kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, input, cropRect)); - this->addFilter("merge", SkMergeImageFilter::Create(input, input, SkXfermode::kSrcOver_Mode, - cropRect)); - this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Create( - paintFilterLeft.get(), paintFilterRight.get(), - SkXfermode::kSrcOver_Mode, cropRect)); + this->addFilter("merge", SkMergeImageFilter::Make(sk_ref_sp<SkImageFilter>(input), + sk_ref_sp<SkImageFilter>(input), + SkXfermode::kSrcOver_Mode, + cropRect).release()); + this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Make( + std::move(paintFilterLeft), std::move(paintFilterRight), + SkXfermode::kSrcOver_Mode, cropRect).release()); this->addFilter("offset", SkOffsetImageFilter::Create(SK_Scalar1, SK_Scalar1, input, cropRect)); this->addFilter("dilate", SkDilateImageFilter::Create(3, 2, input, cropRect)); @@ -824,8 +826,8 @@ static void test_imagefilter_merge_result_size(SkImageFilter::Proxy* proxy, greenBM.allocN32Pixels(20, 20); greenBM.eraseColor(SK_ColorGREEN); sk_sp<SkImage> greenImage(SkImage::MakeFromBitmap(greenBM)); - SkAutoTUnref<SkImageFilter> source(SkImageSource::Create(greenImage.get())); - SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(source.get(), source.get())); + sk_sp<SkImageFilter> source(SkImageSource::Create(greenImage.get())); + sk_sp<SkImageFilter> merge(SkMergeImageFilter::Make(source, source)); sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 1)); |