diff options
-rw-r--r-- | gm/imagefiltersgraph.cpp | 9 | ||||
-rw-r--r-- | gm/xfermodeimagefilter.cpp | 29 | ||||
-rw-r--r-- | include/effects/SkXfermodeImageFilter.h | 18 | ||||
-rw-r--r-- | samplecode/SampleFilterFuzz.cpp | 9 | ||||
-rw-r--r-- | src/effects/SkXfermodeImageFilter.cpp | 13 | ||||
-rw-r--r-- | tests/ImageFilterTest.cpp | 33 | ||||
-rw-r--r-- | tests/SerializationTest.cpp | 3 |
7 files changed, 51 insertions, 63 deletions
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp index ee2f7bf92b..dd9c37c093 100644 --- a/gm/imagefiltersgraph.cpp +++ b/gm/imagefiltersgraph.cpp @@ -148,7 +148,7 @@ protected: SkPaint paint; paint.setImageFilter(SkXfermodeImageFilter::Make( SkXfermode::Make(SkXfermode::kSrcOver_Mode), - std::move(colorMorph))); + colorMorph.get())); DrawClippedImage(canvas, fImage.get(), paint); canvas->translate(SkIntToScalar(100), 0); @@ -165,9 +165,7 @@ protected: SkPaint paint; paint.setImageFilter( SkXfermodeImageFilter::Make(SkArithmeticMode::Make(0, SK_Scalar1, SK_Scalar1, 0), - std::move(matrixFilter), - std::move(offsetFilter), - nullptr)); + matrixFilter.get(), offsetFilter.get(), nullptr)); DrawClippedImage(canvas, fImage.get(), paint); canvas->translate(SkIntToScalar(100), 0); @@ -180,8 +178,7 @@ protected: SkImageFilter::CropRect cropRect(SkRect::MakeWH(SkIntToScalar(95), SkIntToScalar(100))); SkPaint paint; paint.setImageFilter( - SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcIn_Mode), - std::move(blur), + SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcIn_Mode), blur.get(), nullptr, &cropRect)); DrawClippedImage(canvas, fImage.get(), paint); canvas->translate(SkIntToScalar(100), 0); diff --git a/gm/xfermodeimagefilter.cpp b/gm/xfermodeimagefilter.cpp index ee6822a3f4..3293c81ba4 100644 --- a/gm/xfermodeimagefilter.cpp +++ b/gm/xfermodeimagefilter.cpp @@ -88,7 +88,7 @@ protected: sk_sp<SkImageFilter> background(SkImageSource::Make(fCheckerboard)); for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) { paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(gModes[i].fMode), - background)); + background.get())); DrawClippedBitmap(canvas, fBitmap, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -98,8 +98,7 @@ protected: } // Test arithmetic mode as image filter paint.setImageFilter(SkXfermodeImageFilter::Make( - SkArithmeticMode::Make(0, SK_Scalar1, SK_Scalar1, 0), - background)); + SkArithmeticMode::Make(0, SK_Scalar1, SK_Scalar1, 0), background.get())); DrawClippedBitmap(canvas, fBitmap, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -107,7 +106,7 @@ protected: y += fBitmap.height() + MARGIN; } // Test nullptr mode - paint.setImageFilter(SkXfermodeImageFilter::Make(nullptr, background)); + paint.setImageFilter(SkXfermodeImageFilter::Make(nullptr, background.get())); DrawClippedBitmap(canvas, fBitmap, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -127,8 +126,8 @@ protected: background)); paint.setImageFilter(SkXfermodeImageFilter::Make( SkXfermode::Make(SkXfermode::kSrcOver_Mode), - offsetBackground, - offsetForeground, + offsetBackground.get(), + offsetForeground.get(), nullptr)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; @@ -138,8 +137,8 @@ protected: } // Test offsets on Darken (uses shader blend) paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kDarken_Mode), - offsetBackground, - offsetForeground, + offsetBackground.get(), + offsetForeground.get(), nullptr)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; @@ -162,8 +161,8 @@ protected: fBitmap.height() + offsets[i][3]); SkImageFilter::CropRect rect(SkRect::Make(cropRect)); paint.setImageFilter(SkXfermodeImageFilter::Make(SkXfermode::Make(sampledModes[i]), - offsetBackground, - offsetForeground, + offsetBackground.get(), + offsetForeground.get(), &rect)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; @@ -176,7 +175,8 @@ protected: auto mode = SkXfermode::Make(SkXfermode::kScreen_Mode); SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(10, 10, 60, 60)); sk_sp<SkImageFilter> cropped(SkOffsetImageFilter::Make(0, 0, foreground, &cropRect)); - paint.setImageFilter(SkXfermodeImageFilter::Make(mode, cropped, background, nullptr)); + paint.setImageFilter(SkXfermodeImageFilter::Make(mode, cropped.get(), + background.get(), nullptr)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -184,7 +184,8 @@ protected: y += fBitmap.height() + MARGIN; } // Test small fg, large bg with Screen (uses shader blend) - paint.setImageFilter(SkXfermodeImageFilter::Make(mode, background, cropped, nullptr)); + paint.setImageFilter(SkXfermodeImageFilter::Make(mode, background.get(), + cropped.get(), nullptr)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { @@ -196,8 +197,8 @@ protected: // the region outside the foreground. mode = SkXfermode::Make(SkXfermode::kSrcIn_Mode); SkImageFilter::CropRect cropRectFull(SkRect::MakeXYWH(0, 0, 80, 80)); - paint.setImageFilter(SkXfermodeImageFilter::Make(mode, background, - cropped, &cropRectFull)); + paint.setImageFilter(SkXfermodeImageFilter::Make(mode, background.get(), + cropped.get(), &cropRectFull)); DrawClippedPaint(canvas, clipRect, paint, x, y); x += fBitmap.width() + MARGIN; if (x + fBitmap.width() > WIDTH) { diff --git a/include/effects/SkXfermodeImageFilter.h b/include/effects/SkXfermodeImageFilter.h index 268651ad24..f1e5d71070 100644 --- a/include/effects/SkXfermodeImageFilter.h +++ b/include/effects/SkXfermodeImageFilter.h @@ -21,20 +21,16 @@ class SK_API SkXfermodeImageFilter : public SkImageFilter { */ public: - static sk_sp<SkImageFilter> Make(sk_sp<SkXfermode> mode, sk_sp<SkImageFilter> background, - sk_sp<SkImageFilter> foreground, const CropRect* cropRect); - static sk_sp<SkImageFilter> Make(sk_sp<SkXfermode> mode, sk_sp<SkImageFilter> background) { - return Make(std::move(mode), std::move(background), nullptr, nullptr); + static sk_sp<SkImageFilter> Make(sk_sp<SkXfermode> mode, SkImageFilter* background, + SkImageFilter* foreground, const CropRect* cropRect); + static sk_sp<SkImageFilter> Make(sk_sp<SkXfermode> mode, SkImageFilter* background) { + return Make(std::move(mode), background, nullptr, nullptr); } - -#if defined(SK_SUPPORT_LEGACY_XFERMODE_PTR) || defined(SK_SUPPORT_LEGACY_IMAGEFILTER_PTR) +#ifdef SK_SUPPORT_LEGACY_XFERMODE_PTR static SkImageFilter* Create(SkXfermode* mode, SkImageFilter* background, SkImageFilter* foreground = NULL, const CropRect* cropRect = NULL) { - return Make(sk_ref_sp(mode), - sk_ref_sp(background), - sk_ref_sp(foreground), - cropRect).release(); + return Make(sk_ref_sp(mode), background, foreground, cropRect).release(); } #endif @@ -53,7 +49,7 @@ public: #endif protected: - SkXfermodeImageFilter(sk_sp<SkXfermode> mode, sk_sp<SkImageFilter> inputs[2], + SkXfermodeImageFilter(sk_sp<SkXfermode> mode, SkImageFilter* inputs[2], const CropRect* cropRect); void flatten(SkWriteBuffer&) const override; diff --git a/samplecode/SampleFilterFuzz.cpp b/samplecode/SampleFilterFuzz.cpp index 8d2cef091d..6413aa103f 100644 --- a/samplecode/SampleFilterFuzz.cpp +++ b/samplecode/SampleFilterFuzz.cpp @@ -595,12 +595,15 @@ static sk_sp<SkImageFilter> make_image_filter(bool canBeNull) { case DOWN_SAMPLE: filter = sk_sp<SkImageFilter>(SkDownSampleImageFilter::Create(make_scalar())); break; - case XFERMODE: + case XFERMODE: { + sk_sp<SkImageFilter> subFilter1(make_image_filter()); + sk_sp<SkImageFilter> subFilter2(make_image_filter()); filter = SkXfermodeImageFilter::Make(SkXfermode::Make(make_xfermode()), - make_image_filter(), - make_image_filter(), + subFilter1.get(), + subFilter2.get(), nullptr); break; + } case OFFSET: filter = SkOffsetImageFilter::Make(make_scalar(), make_scalar(), make_image_filter()); break; diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp index a29136a0dd..45c9f70568 100644 --- a/src/effects/SkXfermodeImageFilter.cpp +++ b/src/effects/SkXfermodeImageFilter.cpp @@ -23,25 +23,24 @@ /////////////////////////////////////////////////////////////////////////////// -sk_sp<SkImageFilter> SkXfermodeImageFilter::Make(sk_sp<SkXfermode> mode, - sk_sp<SkImageFilter> background, - sk_sp<SkImageFilter> foreground, +sk_sp<SkImageFilter> SkXfermodeImageFilter::Make(sk_sp<SkXfermode> mode, SkImageFilter* background, + SkImageFilter* foreground, const CropRect* cropRect) { - sk_sp<SkImageFilter> inputs[2] = { std::move(background), std::move(foreground) }; + SkImageFilter* inputs[2] = { background, foreground }; return sk_sp<SkImageFilter>(new SkXfermodeImageFilter(mode, inputs, cropRect)); } SkXfermodeImageFilter::SkXfermodeImageFilter(sk_sp<SkXfermode> mode, - sk_sp<SkImageFilter> inputs[2], + SkImageFilter* inputs[2], const CropRect* cropRect) - : INHERITED(inputs, 2, cropRect) + : INHERITED(2, inputs, cropRect) , fMode(std::move(mode)) {} sk_sp<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), + return Make(std::move(mode), common.getInput(0).get(), common.getInput(1).get(), &common.cropRect()); } diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp index af11bb47fd..48d3147ef9 100644 --- a/tests/ImageFilterTest.cpp +++ b/tests/ImageFilterTest.cpp @@ -231,10 +231,7 @@ public: cropRect).release()); } this->addFilter("xfermode", SkXfermodeImageFilter::Make( - SkXfermode::Make(SkXfermode::kSrc_Mode), - sk_ref_sp<SkImageFilter>(input), - sk_ref_sp<SkImageFilter>(input), - cropRect).release()); + SkXfermode::Make(SkXfermode::kSrc_Mode), input, input, cropRect).release()); } int count() const { return fFilters.count(); } SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.get(); } @@ -842,7 +839,7 @@ DEF_TEST(ImageFilterUnionBounds, reporter) { // Regardless of which order they appear in, the image filter bounds should // be combined correctly. { - sk_sp<SkImageFilter> composite(SkXfermodeImageFilter::Make(nullptr, offset)); + sk_sp<SkImageFilter> composite(SkXfermodeImageFilter::Make(nullptr, offset.get())); SkRect bounds = SkRect::MakeWH(100, 100); // Intentionally aliasing here, as that's what the real callers do. bounds = composite->computeFastBounds(bounds); @@ -850,7 +847,7 @@ DEF_TEST(ImageFilterUnionBounds, reporter) { } { sk_sp<SkImageFilter> composite(SkXfermodeImageFilter::Make(nullptr, nullptr, - offset, nullptr)); + offset.get(), nullptr)); SkRect bounds = SkRect::MakeWH(100, 100); // Intentionally aliasing here, as that's what the real callers do. bounds = composite->computeFastBounds(bounds); @@ -1280,25 +1277,21 @@ static void test_xfermode_cropped_input(SkCanvas* canvas, skiatest::Reporter* re bitmap.allocN32Pixels(1, 1); bitmap.eraseARGB(255, 255, 255, 255); - sk_sp<SkColorFilter> green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, - SkXfermode::kSrcIn_Mode)); - sk_sp<SkImageFilter> greenFilter(SkColorFilterImageFilter::Create(green.get())); + auto green(SkColorFilter::MakeModeFilter(SK_ColorGREEN, SkXfermode::kSrcIn_Mode)); + SkAutoTUnref<SkImageFilter> greenFilter(SkColorFilterImageFilter::Create(green.get())); SkImageFilter::CropRect cropRect(SkRect::MakeEmpty()); - sk_sp<SkImageFilter> croppedOut( + SkAutoTUnref<SkImageFilter> croppedOut( SkColorFilterImageFilter::Create(green.get(), nullptr, &cropRect)); // Check that an xfermode image filter whose input has been cropped out still draws the other // input. Also check that drawing with both inputs cropped out doesn't cause a GPU warning. - sk_sp<SkXfermode> mode(SkXfermode::Make(SkXfermode::kSrcOver_Mode)); - sk_sp<SkImageFilter> xfermodeNoFg(SkXfermodeImageFilter::Make(mode, greenFilter, - croppedOut, nullptr)); - sk_sp<SkImageFilter> xfermodeNoBg(SkXfermodeImageFilter::Make(mode, croppedOut, - greenFilter, nullptr)); - sk_sp<SkImageFilter> xfermodeNoFgNoBg(SkXfermodeImageFilter::Make(mode, croppedOut, - croppedOut, nullptr)); + auto mode = SkXfermode::Make(SkXfermode::kSrcOver_Mode); + auto xfermodeNoFg(SkXfermodeImageFilter::Make(mode, greenFilter, croppedOut, nullptr)); + auto xfermodeNoBg(SkXfermodeImageFilter::Make(mode, croppedOut, greenFilter, nullptr)); + auto xfermodeNoFgNoBg(SkXfermodeImageFilter::Make(mode, croppedOut, croppedOut, nullptr)); SkPaint paint; - paint.setImageFilter(std::move(xfermodeNoFg)); + paint.setImageFilter(xfermodeNoFg); canvas->drawBitmap(bitmap, 0, 0, &paint); // drawSprite uint32_t pixel; @@ -1306,12 +1299,12 @@ static void test_xfermode_cropped_input(SkCanvas* canvas, skiatest::Reporter* re canvas->readPixels(info, &pixel, 4, 0, 0); REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); - paint.setImageFilter(std::move(xfermodeNoBg)); + paint.setImageFilter(xfermodeNoBg); canvas->drawBitmap(bitmap, 0, 0, &paint); // drawSprite canvas->readPixels(info, &pixel, 4, 0, 0); REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); - paint.setImageFilter(std::move(xfermodeNoFgNoBg)); + paint.setImageFilter(xfermodeNoFgNoBg); canvas->drawBitmap(bitmap, 0, 0, &paint); // drawSprite canvas->readPixels(info, &pixel, 4, 0, 0); REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp index 9bdfe1e0e6..15b73827ae 100644 --- a/tests/SerializationTest.cpp +++ b/tests/SerializationTest.cpp @@ -248,8 +248,7 @@ static void TestBitmapSerialization(const SkBitmap& validBitmap, sk_sp<SkImageFilter> invalidBitmapSource(SkImageSource::Make(std::move(invalidImage))); sk_sp<SkImageFilter> xfermodeImageFilter( SkXfermodeImageFilter::Make(SkXfermode::Make(SkXfermode::kSrcOver_Mode), - std::move(invalidBitmapSource), - std::move(validBitmapSource), nullptr)); + invalidBitmapSource.get(), validBitmapSource.get(), nullptr)); SkAutoTUnref<SkImageFilter> deserializedFilter( TestFlattenableSerialization<SkImageFilter>( |