Skip to content

Conversation

@smfr
Copy link
Contributor

@smfr smfr commented Jan 2, 2026

bb11508

[CI Filters] Implement FEGaussianBlur in Core Image, and fix some geometry issues
https://bugs.webkit.org/show_bug.cgi?id=304854
rdar://167443665

Reviewed by Mike Wyrzykowski.

Add FEGaussianBlurCoreImageApplier, which uses a `CIGaussianBlurXY` filter so we can control
X and Y radii independently.

Testing this revealed an issue where the geometry was wrong for SVG reference filters used
in CSS. When a CSS filter chain contains both CSS and SVG filters, the entire chain is rendered
using Core Image if possible. This means that every primitive needs to use the same reference
geometry, since Core Image works in flipped coordinates, so the rect relative to which flipping
happens needs to be consistent.

To fix this, introduce the concept of an "enclosing filter region", which is the union of
the filterRegions of all the filters in the chain. This is computed by `CSSFilterRenderer`
just before applying. Each primitive can then use
`filter.flippedRectRelativeToAbsoluteEnclosingFilterRegion(result.absoluteImageRect())`
to compute the correct extent rect.

Add `BEGIN_BLOCK_OBJC_EXCEPTIONS`/`END_BLOCK_OBJC_EXCEPTIONS` around all the CI code.

* Source/WebCore/SourcesCocoa.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/graphics/coreimage/FEBlendCoreImageApplier.mm:
(WebCore::FEBlendCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEColorMatrixCoreImageApplier.mm:
(WebCore::FEColorMatrixCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEComponentTransferCoreImageApplier.mm:
* Source/WebCore/platform/graphics/coreimage/FECompositeCoreImageApplier.mm:
(WebCore::FECompositeCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEFloodCoreImageApplier.mm:
(WebCore::FEFloodCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEGaussianBlurCoreImageApplier.h:
* Source/WebCore/platform/graphics/coreimage/FEGaussianBlurCoreImageApplier.mm:
(WebCore::FEGaussianBlurCoreImageApplier::FEGaussianBlurCoreImageApplier):
(WebCore::FEGaussianBlurCoreImageApplier::supportsCoreImageRendering):
(WebCore::FEGaussianBlurCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEMorphologyCoreImageApplier.mm:
(WebCore::FEMorphologyCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FilterImageCoreImage.mm:
(WebCore::FilterImage::filterResultImageBuffer):
* Source/WebCore/platform/graphics/coreimage/SourceAlphaCoreImageApplier.mm:
(WebCore::SourceAlphaCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/SourceGraphicCoreImageApplier.mm:
(WebCore::SourceGraphicCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp:
(WebCore::FEGaussianBlur::supportedFilterRenderingModes const):
(WebCore::FEGaussianBlur::createAcceleratedApplier const):
* Source/WebCore/platform/graphics/filters/Filter.cpp:
(WebCore::Filter::Filter):
(WebCore::Filter::absoluteEnclosingFilterRegion const):
(WebCore::Filter::flippedRectRelativeToAbsoluteEnclosingFilterRegion const):
(WebCore::Filter::filterResultBuffer const):
* Source/WebCore/platform/graphics/filters/Filter.h:
(WebCore::Filter::enclosingFilterRegion const):
(WebCore::Filter::setEnclosingFilterRegion):
* Source/WebCore/platform/network/mac/WebCoreURLResponse.mm: Unified sources fix.
* Source/WebCore/rendering/CSSFilterRenderer.cpp:
(WebCore::CSSFilterRenderer::computeEnclosingFilterRegion):
* Source/WebCore/rendering/CSSFilterRenderer.h:

Canonical link: https://commits.webkit.org/305054@main

653d01d

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows Apple Internal
✅ 🧪 style ✅ 🛠 ios ✅ 🛠 mac ✅ 🛠 wpe ✅ 🛠 win ✅ 🛠 ios-apple
✅ 🧪 bindings ✅ 🛠 ios-sim ✅ 🛠 mac-AS-debug ✅ 🧪 wpe-wk2 🧪 win-tests ✅ 🛠 mac-apple
✅ 🧪 webkitperl ✅ 🧪 ios-wk2 ✅ 🧪 api-mac ✅ 🧪 api-wpe ✅ 🛠 vision-apple
✅ 🧪 ios-wk2-wpt ✅ 🧪 api-mac-debug ✅ 🛠 wpe-cairo-libwebrtc
✅ 🧪 api-ios ✅ 🧪 mac-wk1 ✅ 🛠 gtk
✅ 🛠 vision ✅ 🧪 mac-wk2 ✅ 🧪 gtk-wk2
✅ 🛠 vision-sim ✅ 🧪 mac-AS-debug-wk2 ✅ 🧪 api-gtk
✅ 🛠 🧪 merge ✅ 🧪 vision-wk2 ✅ 🧪 mac-wk2-stress ✅ 🛠 playstation
✅ 🛠 tv ✅ 🧪 mac-intel-wk2
✅ 🛠 tv-sim ✅ 🛠 mac-safer-cpp
✅ 🛠 watch
✅ 🛠 watch-sim

@smfr smfr self-assigned this Jan 2, 2026
@smfr smfr added the SVG For bugs in the SVG implementation. label Jan 2, 2026
@smfr smfr force-pushed the eng/CI-Filters-Implement-FEGaussianBlur-in-Core-Image-and-fix-some-geometry-issues branch from e41a15c to be5879e Compare January 2, 2026 18:46
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jan 2, 2026
@mwyrzykowski mwyrzykowski self-requested a review January 2, 2026 19:09
// FIXME: Support edge modes.
auto absoluteStdDeviation = filter.scaledByFilterScale(FloatSize(m_effect->stdDeviationX(), m_effect->stdDeviationY()));

auto ciFilter = [CIFilter filterWithName:@"CIGaussianBlurXY"];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should you use RetainPtr here since filterWithName says:

Creates a CIFilter object for a specific kind of filter.

so presumably an auto-released object is returned?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be a RetainPtr

@webkit-ews-buildbot
Copy link
Collaborator

Safer C++ Build #72966 (e41a15c)

❌ Found 1 failing file with 1 issue. Please address these issues before landing. See WebKit Guidelines for Safer C++ Programming.
(cc @rniwa)

@webkit-ews-buildbot
Copy link
Collaborator

Safer C++ Build #72968 (be5879e)

❌ Found 1 failing file with 1 issue. Please address these issues before landing. See WebKit Guidelines for Safer C++ Programming.
(cc @rniwa)

@smfr smfr removed the merging-blocked Applied to prevent a change from being merged label Jan 2, 2026
@smfr smfr force-pushed the eng/CI-Filters-Implement-FEGaussianBlur-in-Core-Image-and-fix-some-geometry-issues branch from be5879e to 726fb60 Compare January 2, 2026 20:11
@smfr smfr force-pushed the eng/CI-Filters-Implement-FEGaussianBlur-in-Core-Image-and-fix-some-geometry-issues branch from 726fb60 to 653d01d Compare January 2, 2026 20:15
@smfr smfr added the merge-queue Applied to send a pull request to merge-queue label Jan 2, 2026
…metry issues

https://bugs.webkit.org/show_bug.cgi?id=304854
rdar://167443665

Reviewed by Mike Wyrzykowski.

Add FEGaussianBlurCoreImageApplier, which uses a `CIGaussianBlurXY` filter so we can control
X and Y radii independently.

Testing this revealed an issue where the geometry was wrong for SVG reference filters used
in CSS. When a CSS filter chain contains both CSS and SVG filters, the entire chain is rendered
using Core Image if possible. This means that every primitive needs to use the same reference
geometry, since Core Image works in flipped coordinates, so the rect relative to which flipping
happens needs to be consistent.

To fix this, introduce the concept of an "enclosing filter region", which is the union of
the filterRegions of all the filters in the chain. This is computed by `CSSFilterRenderer`
just before applying. Each primitive can then use
`filter.flippedRectRelativeToAbsoluteEnclosingFilterRegion(result.absoluteImageRect())`
to compute the correct extent rect.

Add `BEGIN_BLOCK_OBJC_EXCEPTIONS`/`END_BLOCK_OBJC_EXCEPTIONS` around all the CI code.

* Source/WebCore/SourcesCocoa.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/graphics/coreimage/FEBlendCoreImageApplier.mm:
(WebCore::FEBlendCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEColorMatrixCoreImageApplier.mm:
(WebCore::FEColorMatrixCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEComponentTransferCoreImageApplier.mm:
* Source/WebCore/platform/graphics/coreimage/FECompositeCoreImageApplier.mm:
(WebCore::FECompositeCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEFloodCoreImageApplier.mm:
(WebCore::FEFloodCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEGaussianBlurCoreImageApplier.h:
* Source/WebCore/platform/graphics/coreimage/FEGaussianBlurCoreImageApplier.mm:
(WebCore::FEGaussianBlurCoreImageApplier::FEGaussianBlurCoreImageApplier):
(WebCore::FEGaussianBlurCoreImageApplier::supportsCoreImageRendering):
(WebCore::FEGaussianBlurCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FEMorphologyCoreImageApplier.mm:
(WebCore::FEMorphologyCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/FilterImageCoreImage.mm:
(WebCore::FilterImage::filterResultImageBuffer):
* Source/WebCore/platform/graphics/coreimage/SourceAlphaCoreImageApplier.mm:
(WebCore::SourceAlphaCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/coreimage/SourceGraphicCoreImageApplier.mm:
(WebCore::SourceGraphicCoreImageApplier::apply const):
* Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp:
(WebCore::FEGaussianBlur::supportedFilterRenderingModes const):
(WebCore::FEGaussianBlur::createAcceleratedApplier const):
* Source/WebCore/platform/graphics/filters/Filter.cpp:
(WebCore::Filter::Filter):
(WebCore::Filter::absoluteEnclosingFilterRegion const):
(WebCore::Filter::flippedRectRelativeToAbsoluteEnclosingFilterRegion const):
(WebCore::Filter::filterResultBuffer const):
* Source/WebCore/platform/graphics/filters/Filter.h:
(WebCore::Filter::enclosingFilterRegion const):
(WebCore::Filter::setEnclosingFilterRegion):
* Source/WebCore/platform/network/mac/WebCoreURLResponse.mm: Unified sources fix.
* Source/WebCore/rendering/CSSFilterRenderer.cpp:
(WebCore::CSSFilterRenderer::computeEnclosingFilterRegion):
* Source/WebCore/rendering/CSSFilterRenderer.h:

Canonical link: https://commits.webkit.org/305054@main
@webkit-commit-queue webkit-commit-queue force-pushed the eng/CI-Filters-Implement-FEGaussianBlur-in-Core-Image-and-fix-some-geometry-issues branch from 653d01d to bb11508 Compare January 2, 2026 21:59
@webkit-commit-queue
Copy link
Collaborator

Committed 305054@main (bb11508): https://commits.webkit.org/305054@main

Reviewed commits have been landed. Closing PR #56009 and removing active labels.

@webkit-commit-queue webkit-commit-queue merged commit bb11508 into WebKit:main Jan 2, 2026
@webkit-commit-queue webkit-commit-queue removed the merge-queue Applied to send a pull request to merge-queue label Jan 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

SVG For bugs in the SVG implementation.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants