Add SkImageFilters::Blend rename for Xfermode filter
This better matches SkShaders::Blend and SkColorFilters::Blend factories.
Bug: skia:9310
Change-Id: I02a3fe488a446b803df96518caacff1fdf536e9f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/324623
Commit-Queue: Michael Ludwig <michaelludwig@google.com>
Reviewed-by: Florin Malita <fmalita@chromium.org>
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index a7e970d..29f7b88 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -9,6 +9,11 @@
* <insert new release notes here>
+ * Add new SkImageFilters::Blend factory function, in place of the now deprecated
+ SkImageFilters::Xfermode factory function. Behavior is identical, but name better matches
+ conventions in SkShader and SkColorFilter.
+ https://review.skia.org/324623
+
* SkImageFilters::Foo() factory functions now accept SkIRect, SkRect, and optional SkIRect* or
SkRect*, instead of previously just the optional SkIRect*. Internally, the crop rects are stored
as floats to allow for fractional crops to be defined in the local coordinate system (before
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp
index 9ec4daa..f35bc17 100644
--- a/bench/ImageFilterDAGBench.cpp
+++ b/bench/ImageFilterDAGBench.cpp
@@ -149,7 +149,7 @@
auto offset1 = SkImageFilters::Offset(100.0f, 100.0f, blur);
auto offset2 = SkImageFilters::Offset(-100.0f, -100.0f, blur);
auto xfermode =
- SkImageFilters::Xfermode(SkBlendMode::kSrcIn, offset1, offset2, nullptr);
+ SkImageFilters::Blend(SkBlendMode::kSrcIn, offset1, offset2, nullptr);
SkPaint paint;
paint.setImageFilter(xfermode);
diff --git a/fuzz/FuzzCanvas.cpp b/fuzz/FuzzCanvas.cpp
index 95eb9da..0f9a367 100644
--- a/fuzz/FuzzCanvas.cpp
+++ b/fuzz/FuzzCanvas.cpp
@@ -785,8 +785,8 @@
}
sk_sp<SkImageFilter> bg = make_fuzz_imageFilter(fuzz, depth - 1);
sk_sp<SkImageFilter> fg = make_fuzz_imageFilter(fuzz, depth - 1);
- return SkImageFilters::Xfermode(blendMode, std::move(bg), std::move(fg),
- useCropRect ? &cropRect : nullptr);
+ return SkImageFilters::Blend(blendMode, std::move(bg), std::move(fg),
+ useCropRect ? &cropRect : nullptr);
}
case 24: {
sk_sp<SkShader> shader = make_fuzz_shader(fuzz, depth - 1);
diff --git a/gm/crbug_905548.cpp b/gm/crbug_905548.cpp
index 2406e8f..bbf2eac 100644
--- a/gm/crbug_905548.cpp
+++ b/gm/crbug_905548.cpp
@@ -28,7 +28,7 @@
auto blurred = SkImageFilters::Blur(15, 15, imageSource);
auto eroded = SkImageFilters::Erode(0, 0, blurred);
- auto blended = SkImageFilters::Xfermode(SkBlendMode::kDstOut, eroded, imageSource, nullptr);
+ auto blended = SkImageFilters::Blend(SkBlendMode::kDstOut, eroded, imageSource, nullptr);
SkPaint paint;
paint.setImageFilter(blended);
diff --git a/gm/imagefilters.cpp b/gm/imagefilters.cpp
index d35d205..329ccea 100644
--- a/gm/imagefilters.cpp
+++ b/gm/imagefilters.cpp
@@ -257,7 +257,7 @@
// If edge detector sees the mask filter, it'll have alpha and then blend with the original
// image; otherwise the mask filter will apply late (incorrectly) and none of the original
// image will be visible.
- sk_sp<SkImageFilter> edgeBlend = SkImageFilters::Xfermode(SkBlendMode::kSrcOver,
+ sk_sp<SkImageFilter> edgeBlend = SkImageFilters::Blend(SkBlendMode::kSrcOver,
SkImageFilters::Image(image), edgeDetector);
SkPaint testMaskPaint;
@@ -266,8 +266,8 @@
SkPaint expectedMaskPaint;
expectedMaskPaint.setImageFilter(SkImageFilters::Compose(edgeBlend,
- SkImageFilters::Xfermode(SkBlendMode::kSrcIn,
- SkImageFilters::Shader(alphaMaskShader))));
+ SkImageFilters::Blend(SkBlendMode::kSrcIn,
+ SkImageFilters::Shader(alphaMaskShader))));
canvas->save();
canvas->translate(0, image->height());
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 6ed23e1..6c47388 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -71,8 +71,8 @@
sk_sp<SkImageFilter> colorMorph(SkImageFilters::ColorFilter(std::move(matrixFilter),
std::move(morph)));
SkPaint paint;
- paint.setImageFilter(SkImageFilters::Xfermode(SkBlendMode::kSrcOver,
- std::move(colorMorph)));
+ paint.setImageFilter(SkImageFilters::Blend(SkBlendMode::kSrcOver,
+ std::move(colorMorph)));
DrawClippedImage(canvas, fImage.get(), paint);
canvas->translate(SkIntToScalar(100), 0);
@@ -100,7 +100,7 @@
SkIRect cropRect = SkIRect::MakeWH(95, 100);
SkPaint paint;
paint.setImageFilter(
- SkImageFilters::Xfermode(SkBlendMode::kSrcIn, std::move(blur), nullptr, &cropRect));
+ SkImageFilters::Blend(SkBlendMode::kSrcIn, std::move(blur), nullptr, &cropRect));
DrawClippedImage(canvas, fImage.get(), paint);
canvas->translate(SkIntToScalar(100), 0);
}
diff --git a/gm/imagefilterstransformed.cpp b/gm/imagefilterstransformed.cpp
index d2a0622..4a4dda9 100644
--- a/gm/imagefilterstransformed.cpp
+++ b/gm/imagefilterstransformed.cpp
@@ -135,7 +135,7 @@
sk_sp<SkImageFilter> filters[] = {
nullptr,
SkImageFilters::Blur(6, 0, nullptr),
- SkImageFilters::Xfermode(SkBlendMode::kSrcOver, nullptr),
+ SkImageFilters::Blend(SkBlendMode::kSrcOver, nullptr),
};
for (auto& filter : filters) {
diff --git a/gm/imagemakewithfilter.cpp b/gm/imagemakewithfilter.cpp
index 958b1d0..03b214f 100644
--- a/gm/imagemakewithfilter.cpp
+++ b/gm/imagemakewithfilter.cpp
@@ -98,9 +98,9 @@
nullptr, cropRect);
}
-static sk_sp<SkImageFilter> xfermode_factory(sk_sp<SkImage> auxImage, const SkIRect* cropRect) {
+static sk_sp<SkImageFilter> blend_factory(sk_sp<SkImage> auxImage, const SkIRect* cropRect) {
sk_sp<SkImageFilter> background = SkImageFilters::Image(std::move(auxImage));
- return SkImageFilters::Xfermode(
+ return SkImageFilters::Blend(
SkBlendMode::kModulate, std::move(background), nullptr, cropRect);
}
@@ -233,7 +233,7 @@
erode_factory,
displacement_factory,
arithmetic_factory,
- xfermode_factory,
+ blend_factory,
convolution_factory,
matrix_factory,
alpha_threshold_factory,
@@ -249,7 +249,7 @@
"Erode",
"Displacement",
"Arithmetic",
- "Xfer Mode",
+ "Xfer Mode", // "blend"
"Convolution",
"Matrix Xform",
"Alpha Threshold",
diff --git a/gm/xfermodeimagefilter.cpp b/gm/xfermodeimagefilter.cpp
index 5f69249..efd2a62 100644
--- a/gm/xfermodeimagefilter.cpp
+++ b/gm/xfermodeimagefilter.cpp
@@ -92,7 +92,7 @@
int x = 0, y = 0;
sk_sp<SkImageFilter> background(SkImageFilters::Image(fCheckerboard));
for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
- paint.setImageFilter(SkImageFilters::Xfermode(gModes[i], background));
+ paint.setImageFilter(SkImageFilters::Blend(gModes[i], background));
DrawClippedBitmap(canvas, fBitmap, paint, x, y);
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
@@ -109,7 +109,7 @@
y += fBitmap.height() + MARGIN;
}
// Test nullptr mode
- paint.setImageFilter(SkImageFilters::Xfermode(SkBlendMode::kSrcOver, background));
+ paint.setImageFilter(SkImageFilters::Blend(SkBlendMode::kSrcOver, background));
DrawClippedBitmap(canvas, fBitmap, paint, x, y);
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
@@ -123,7 +123,7 @@
sk_sp<SkImageFilter> foreground(SkImageFilters::Image(std::move(bitmapImage)));
sk_sp<SkImageFilter> offsetForeground(SkImageFilters::Offset(4, -4, foreground));
sk_sp<SkImageFilter> offsetBackground(SkImageFilters::Offset(4, 4, background));
- paint.setImageFilter(SkImageFilters::Xfermode(
+ paint.setImageFilter(SkImageFilters::Blend(
SkBlendMode::kSrcOver, offsetBackground, offsetForeground));
DrawClippedPaint(canvas, clipRect, paint, x, y);
x += fBitmap.width() + MARGIN;
@@ -132,7 +132,7 @@
y += fBitmap.height() + MARGIN;
}
// Test offsets on Darken (uses shader blend)
- paint.setImageFilter(SkImageFilters::Xfermode(
+ paint.setImageFilter(SkImageFilters::Blend(
SkBlendMode::kDarken, offsetBackground, offsetForeground));
DrawClippedPaint(canvas, clipRect, paint, x, y);
x += fBitmap.width() + MARGIN;
@@ -153,8 +153,8 @@
offsets[i][1],
fBitmap.width() + offsets[i][2],
fBitmap.height() + offsets[i][3]);
- paint.setImageFilter(SkImageFilters::Xfermode(sampledModes[i], offsetBackground,
- offsetForeground, &cropRect));
+ paint.setImageFilter(SkImageFilters::Blend(sampledModes[i], offsetBackground,
+ offsetForeground, &cropRect));
DrawClippedPaint(canvas, clipRect, paint, x, y);
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
@@ -165,8 +165,7 @@
// Test small bg, large fg with Screen (uses shader blend)
SkIRect cropRect = SkIRect::MakeXYWH(10, 10, 60, 60);
sk_sp<SkImageFilter> cropped(SkImageFilters::Offset(0, 0, foreground, &cropRect));
- paint.setImageFilter(SkImageFilters::Xfermode(SkBlendMode::kScreen, cropped, background,
- nullptr));
+ paint.setImageFilter(SkImageFilters::Blend(SkBlendMode::kScreen, cropped, background));
DrawClippedPaint(canvas, clipRect, paint, x, y);
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
@@ -174,8 +173,7 @@
y += fBitmap.height() + MARGIN;
}
// Test small fg, large bg with Screen (uses shader blend)
- paint.setImageFilter(SkImageFilters::Xfermode(SkBlendMode::kScreen, background, cropped,
- nullptr));
+ paint.setImageFilter(SkImageFilters::Blend(SkBlendMode::kScreen, background, cropped));
DrawClippedPaint(canvas, clipRect, paint, x, y);
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
@@ -186,8 +184,8 @@
// This tests that SkXfermodeImageFilter correctly applies the compositing mode to
// the region outside the foreground.
SkIRect cropRectFull = SkIRect::MakeXYWH(0, 0, 80, 80);
- paint.setImageFilter(SkImageFilters::Xfermode(SkBlendMode::kSrcIn, background, cropped,
- &cropRectFull));
+ paint.setImageFilter(SkImageFilters::Blend(SkBlendMode::kSrcIn, background, cropped,
+ &cropRectFull));
DrawClippedPaint(canvas, clipRect, paint, x, y);
x += fBitmap.width() + MARGIN;
if (x + fBitmap.width() > WIDTH) {
diff --git a/include/effects/SkImageFilters.h b/include/effects/SkImageFilters.h
index 4093e1c..0295c0d 100644
--- a/include/effects/SkImageFilters.h
+++ b/include/effects/SkImageFilters.h
@@ -82,6 +82,17 @@
const CropRect& cropRect = {});
/**
+ * This filter takes an SkBlendMode and uses it to composite the two filters together.
+ * @param mode The blend mode that defines the compositing operation
+ * @param background The Dst pixels used in blending, if null the source bitmap is used.
+ * @param foreground The Src pixels used in blending, if null the source bitmap is used.
+ * @cropRect Optional rectangle to crop input and output.
+ */
+ static sk_sp<SkImageFilter> Blend(SkBlendMode mode, sk_sp<SkImageFilter> background,
+ sk_sp<SkImageFilter> foreground = nullptr,
+ const CropRect& cropRect = {});
+
+ /**
* Create a filter that blurs its input by the separate X and Y sigmas. The provided tile mode
* is used when the blur kernel goes outside the input image.
* @param sigmaX The Gaussian sigma value for blurring along the X axis.
@@ -316,13 +327,18 @@
/**
* This filter takes an SkBlendMode and uses it to composite the two filters together.
+ * @param mode The blend mode that defines the compositing operation
* @param background The Dst pixels used in blending, if null the source bitmap is used.
* @param foreground The Src pixels used in blending, if null the source bitmap is used.
* @cropRect Optional rectangle to crop input and output.
+ *
+ * DEPRECATED: Prefer the more idiomatic Blend function
*/
- static sk_sp<SkImageFilter> Xfermode(SkBlendMode, sk_sp<SkImageFilter> background,
+ static sk_sp<SkImageFilter> Xfermode(SkBlendMode mode, sk_sp<SkImageFilter> background,
sk_sp<SkImageFilter> foreground = nullptr,
- const CropRect& cropRect = {});
+ const CropRect& cropRect = {}) {
+ return Blend(mode, std::move(background), std::move(foreground), cropRect);
+ }
// Morphology filter effects
diff --git a/modules/skottie/src/effects/GlowStyles.cpp b/modules/skottie/src/effects/GlowStyles.cpp
index 76a6f8c..5cc2e9d 100644
--- a/modules/skottie/src/effects/GlowStyles.cpp
+++ b/modules/skottie/src/effects/GlowStyles.cpp
@@ -113,7 +113,7 @@
if (fType == Type::kInnerGlow) {
// Inner glows draw on top of, and are masked with, the source.
- f = SkImageFilters::Xfermode(SkBlendMode::kDstIn, std::move(f));
+ f = SkImageFilters::Blend(SkBlendMode::kDstIn, std::move(f));
std::swap(source, f);
}
diff --git a/modules/skottie/src/effects/ShadowStyles.cpp b/modules/skottie/src/effects/ShadowStyles.cpp
index 6e0b7be..2323418 100644
--- a/modules/skottie/src/effects/ShadowStyles.cpp
+++ b/modules/skottie/src/effects/ShadowStyles.cpp
@@ -92,7 +92,7 @@
if (fType == Type::kInnerShadow) {
// Inner shadows draw on top of, and are masked with, the source.
- f = SkImageFilters::Xfermode(SkBlendMode::kDstIn, std::move(f));
+ f = SkImageFilters::Blend(SkBlendMode::kDstIn, std::move(f));
std::swap(source, f);
}
diff --git a/src/effects/imagefilters/SkImageFilters.cpp b/src/effects/imagefilters/SkImageFilters.cpp
index 76be542..8e5b567 100644
--- a/src/effects/imagefilters/SkImageFilters.cpp
+++ b/src/effects/imagefilters/SkImageFilters.cpp
@@ -86,6 +86,13 @@
std::move(foreground), &r);
}
+sk_sp<SkImageFilter> SkImageFilters::Blend(
+ SkBlendMode mode, sk_sp<SkImageFilter> background, sk_sp<SkImageFilter> foreground,
+ const CropRect& cropRect) {
+ SkImageFilter::CropRect r = to_legacy_crop_rect(cropRect);
+ return SkXfermodeImageFilter::Make(mode, std::move(background), std::move(foreground), &r);
+}
+
sk_sp<SkImageFilter> SkImageFilters::Blur(
SkScalar sigmaX, SkScalar sigmaY, SkTileMode tileMode, sk_sp<SkImageFilter> input,
const CropRect& cropRect) {
@@ -195,13 +202,6 @@
return SkTileImageFilter::Make(src, dst, std::move(input));
}
-sk_sp<SkImageFilter> SkImageFilters::Xfermode(
- SkBlendMode mode, sk_sp<SkImageFilter> background, sk_sp<SkImageFilter> foreground,
- const CropRect& cropRect) {
- SkImageFilter::CropRect r = to_legacy_crop_rect(cropRect);
- return SkXfermodeImageFilter::Make(mode, std::move(background), std::move(foreground), &r);
-}
-
// Morphology filter effects
sk_sp<SkImageFilter> SkImageFilters::Dilate(
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
index b6c7b1c..c40fb09 100644
--- a/tests/ImageFilterTest.cpp
+++ b/tests/ImageFilterTest.cpp
@@ -215,7 +215,7 @@
this->addFilter("paint and blur", SkImageFilters::Blur(
kBlurSigma, kBlurSigma, std::move(paintFilter), cropRect));
}
- this->addFilter("xfermode", SkImageFilters::Xfermode(
+ this->addFilter("blend", SkImageFilters::Blend(
SkBlendMode::kSrc, input, input, cropRect));
}
int count() const { return fFilters.count(); }
@@ -981,15 +981,15 @@
// Regardless of which order they appear in, the image filter bounds should
// be combined correctly.
{
- sk_sp<SkImageFilter> composite(SkImageFilters::Xfermode(SkBlendMode::kSrcOver, offset));
+ sk_sp<SkImageFilter> composite(SkImageFilters::Blend(SkBlendMode::kSrcOver, offset));
SkRect bounds = SkRect::MakeIWH(100, 100);
// Intentionally aliasing here, as that's what the real callers do.
bounds = composite->computeFastBounds(bounds);
REPORTER_ASSERT(reporter, bounds == SkRect::MakeIWH(150, 100));
}
{
- sk_sp<SkImageFilter> composite(SkImageFilters::Xfermode(SkBlendMode::kSrcOver, nullptr,
- offset, nullptr));
+ sk_sp<SkImageFilter> composite(SkImageFilters::Blend(SkBlendMode::kSrcOver, nullptr,
+ offset, nullptr));
SkRect bounds = SkRect::MakeIWH(100, 100);
// Intentionally aliasing here, as that's what the real callers do.
bounds = composite->computeFastBounds(bounds);
@@ -1372,14 +1372,14 @@
SkIRect cropRect = SkIRect::MakeEmpty();
sk_sp<SkImageFilter> croppedOut(SkImageFilters::ColorFilter(green, nullptr, &cropRect));
- // Check that an xfermode image filter whose input has been cropped out still draws the other
+ // Check that an blend 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.
SkBlendMode mode = SkBlendMode::kSrcOver;
- sk_sp<SkImageFilter> xfermodeNoFg(SkImageFilters::Xfermode(
+ sk_sp<SkImageFilter> xfermodeNoFg(SkImageFilters::Blend(
mode, greenFilter, croppedOut, nullptr));
- sk_sp<SkImageFilter> xfermodeNoBg(SkImageFilters::Xfermode(
+ sk_sp<SkImageFilter> xfermodeNoBg(SkImageFilters::Blend(
mode, croppedOut, greenFilter, nullptr));
- sk_sp<SkImageFilter> xfermodeNoFgNoBg(SkImageFilters::Xfermode(
+ sk_sp<SkImageFilter> xfermodeNoFgNoBg(SkImageFilters::Blend(
mode, croppedOut, croppedOut, nullptr));
SkPaint paint;
@@ -1728,7 +1728,7 @@
clipBounds.setXYWH(0, 0, 170, 100);
subset.setXYWH(0, 0, 160, 90);
- filter = SkImageFilters::Xfermode(SkBlendMode::kSrc, nullptr);
+ filter = SkImageFilters::Blend(SkBlendMode::kSrc, nullptr);
result = sourceImage->makeWithFilter(rContext, filter.get(), subset, clipBounds,
&outSubset, &offset);
REPORTER_ASSERT(reporter, result);
@@ -1831,8 +1831,8 @@
// The value of this variable doesn't matter because we use inputs with fixed bounds.
SkIRect src = SkIRect::MakeXYWH(11, 22, 33, 44);
for (int i = 0; i < kModeCount; ++i) {
- sk_sp<SkImageFilter> xfermode(SkImageFilters::Xfermode(static_cast<SkBlendMode>(i),
- background, foreground, nullptr));
+ sk_sp<SkImageFilter> xfermode(SkImageFilters::Blend(static_cast<SkBlendMode>(i),
+ background, foreground, nullptr));
auto bounds = xfermode->filterBounds(src, SkMatrix::I(),
SkImageFilter::kForward_MapDirection, nullptr);
REPORTER_ASSERT(reporter, bounds == expectedBounds[i]);
@@ -1841,7 +1841,7 @@
// Test empty intersection.
sk_sp<SkImageFilter> background2(new FixedBoundsImageFilter(SkIRect::MakeXYWH(0, 0, 20, 20)));
sk_sp<SkImageFilter> foreground2(new FixedBoundsImageFilter(SkIRect::MakeXYWH(40, 40, 50, 50)));
- sk_sp<SkImageFilter> xfermode(SkImageFilters::Xfermode(
+ sk_sp<SkImageFilter> xfermode(SkImageFilters::Blend(
SkBlendMode::kSrcIn, std::move(background2), std::move(foreground2), nullptr));
auto bounds = xfermode->filterBounds(src, SkMatrix::I(),
SkImageFilter::kForward_MapDirection, nullptr);
diff --git a/tests/SerializationTest.cpp b/tests/SerializationTest.cpp
index c3ec64a..5a58f6d 100644
--- a/tests/SerializationTest.cpp
+++ b/tests/SerializationTest.cpp
@@ -276,9 +276,9 @@
sk_sp<SkImage> invalidImage(SkImage::MakeFromBitmap(invalidBitmap));
sk_sp<SkImageFilter> invalidBitmapSource(SkImageFilters::Image(std::move(invalidImage)));
sk_sp<SkImageFilter> xfermodeImageFilter(
- SkImageFilters::Xfermode(SkBlendMode::kSrcOver,
- std::move(invalidBitmapSource),
- std::move(validBitmapSource), nullptr));
+ SkImageFilters::Blend(SkBlendMode::kSrcOver,
+ std::move(invalidBitmapSource),
+ std::move(validBitmapSource), nullptr));
sk_sp<SkImageFilter> deserializedFilter(
TestFlattenableSerialization<SkImageFilter>(