aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gm/imagefiltersgraph.cpp9
-rw-r--r--gm/xfermodeimagefilter.cpp29
-rw-r--r--include/effects/SkXfermodeImageFilter.h18
-rw-r--r--samplecode/SampleFilterFuzz.cpp9
-rw-r--r--src/effects/SkXfermodeImageFilter.cpp13
-rw-r--r--tests/ImageFilterTest.cpp33
-rw-r--r--tests/SerializationTest.cpp3
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>(