NEW 215957
CoreImage Implementation of CSS Filter blur()
https://bugs.webkit.org/show_bug.cgi?id=215957
Summary CoreImage Implementation of CSS Filter blur()
frankhome61
Reported 2020-08-28 16:29:31 PDT
Implementing CSS filter blur, using CoreImage
Attachments
Patch (9.60 KB, patch)
2020-08-31 14:25 PDT, frankhome61
no flags
Patch (8.70 KB, patch)
2020-09-09 10:22 PDT, frankhome61
no flags
Patch (8.62 KB, patch)
2020-09-09 10:57 PDT, frankhome61
no flags
Patch (8.58 KB, patch)
2020-09-09 11:11 PDT, frankhome61
no flags
Work in progress (don't review yet) (8.84 KB, patch)
2020-09-09 16:32 PDT, frankhome61
no flags
Patch (Work in Progress) (8.84 KB, patch)
2020-09-10 10:06 PDT, frankhome61
frankhome61: review?
ews-feeder: commit-queue-
Valuable CSS/SVG tests (1.19 MB, application/zip)
2020-09-11 10:25 PDT, frankhome61
no flags
Radar WebKit Bug Importer
Comment 1 2020-08-28 16:30:06 PDT
frankhome61
Comment 2 2020-08-31 14:25:58 PDT
Simon Fraser (smfr)
Comment 3 2020-08-31 14:36:01 PDT
Comment on attachment 407626 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=407626&action=review > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.h:60 > static bool supportsCoreImageRendering(FilterEffect&); > static bool canRenderUsingCIFilters(FilterEffect&); > > + CIImage* feGaussianBlurImage(FilterEffect&, Vector<CIImage*>&, int); The should take a const FilterEffect& > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.h:63 > + HashMap<int, Vector<RetainPtr<CIFilter>>> m_ciFilterStorageMap; I don't like the int as the key. > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:136 > + Vector<RetainPtr<CIFilter>> cachedCIFilters = m_ciFilterStorageMap.get(traversalOrder); This line is repeated at 143. > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:138 > + FEGaussianBlur& blurEffect = static_cast<FEGaussianBlur&>(effect); downcast<>, you need to add the macros. > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:146 > + gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlurXY"]; RetainPtr<>. Can we make CIFilters without autorelease? > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:149 > + filtersToBeCached.insert(0, gaussianBlurFilter); > + m_ciFilterStorageMap.add(traversalOrder, filtersToBeCached); There's a way to do this with ensure().
Sam Weinig
Comment 4 2020-08-31 15:03:17 PDT
Comment on attachment 407626 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=407626&action=review > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.h:55 > + CIImage* connectCIFilters(FilterEffect&, int); The int parameter here should have a parameter name, as it is not clear from context what it means. >> Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:138 >> + FEGaussianBlur& blurEffect = static_cast<FEGaussianBlur&>(effect); > > downcast<>, you need to add the macros. Also probably better to do this in the caller and change the parameter to be a const FEGaussianBlur&.
frankhome61
Comment 5 2020-08-31 17:55:44 PDT
(In reply to Simon Fraser (smfr) from comment #3) > Comment on attachment 407626 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=407626&action=review > > > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.h:60 > > static bool supportsCoreImageRendering(FilterEffect&); > > static bool canRenderUsingCIFilters(FilterEffect&); > > > > + CIImage* feGaussianBlurImage(FilterEffect&, Vector<CIImage*>&, int); > > The should take a const FilterEffect& > > > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.h:63 > > + HashMap<int, Vector<RetainPtr<CIFilter>>> m_ciFilterStorageMap; > > I don't like the int as the key. > > > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:136 > > + Vector<RetainPtr<CIFilter>> cachedCIFilters = m_ciFilterStorageMap.get(traversalOrder); > > This line is repeated at 143. > > > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:138 > > + FEGaussianBlur& blurEffect = static_cast<FEGaussianBlur&>(effect); > > downcast<>, you need to add the macros. > > > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:146 > > + gaussianBlurFilter = [CIFilter filterWithName:@"CIGaussianBlurXY"]; > > RetainPtr<>. Can we make CIFilters without autorelease? Unfortunately, CIFilter can only be obtained by calling [CIFilter filterWithName:] which returns an autoreleased pointer. Same applies to obtaining the output CIImage from a given filter, fooFilter.outputImage > > > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:149 > > + filtersToBeCached.insert(0, gaussianBlurFilter); > > + m_ciFilterStorageMap.add(traversalOrder, filtersToBeCached); > > There's a way to do this with ensure().
frankhome61
Comment 6 2020-09-09 10:22:21 PDT
Simon Fraser (smfr)
Comment 7 2020-09-09 10:37:36 PDT
Comment on attachment 408337 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=408337&action=review > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:264 > + effect.setIsAlphaImage(effect.inputEffect(0)->isAlphaImage()); Is this necessary? I would expect we'd need to change any state on the FEGaussianBlur to make the CIFilter for it. > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:272 > + FloatRect outputExtent = FloatRect(gaussianBlurFilter.outputImage.extent); auto outputExtent = FloatRect { gaussianBlurFilter.outputImage.extent) }; > LayoutTests/css3/filters/effect-blur-square-expected.html:4 > + <title>CSS Filter Test: Test for Saturate short hand</title> That title seems wrong. > LayoutTests/css3/filters/effect-blur-square.html:4 > + <title>CSS Filter Test: Test for Saturate short hand</title> Nope. > LayoutTests/css3/filters/effect-blur-square.html:22 > +.container{ > + position:relative; > + width:600px; > + height:600px; > + overflow:hidden; > +} > + > +#background { > + background: red; > + left:-15px; > + right:-15px; > + top:-15px; > + bottom:-15px; > + filter: blur(10px); > + position: absolute; > +} We normally indent the CSS. No blank lines at the ends. > LayoutTests/css3/filters/effect-blur-square.html:27 > + <p>You should see a red rectangle.</p> Successful tests should never show red. You should use green.
Simon Fraser (smfr)
Comment 8 2020-09-09 10:41:20 PDT
(In reply to Simon Fraser (smfr) from comment #7) > Is this necessary? I would expect we'd need to change any state on the > FEGaussianBlur to make the CIFilter for it. I would *not* expect.
frankhome61
Comment 9 2020-09-09 10:57:06 PDT
frankhome61
Comment 10 2020-09-09 11:11:27 PDT
Simon Fraser (smfr)
Comment 11 2020-09-09 11:18:31 PDT
Comment on attachment 408348 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=408348&action=review > Source/WebCore/platform/graphics/coreimage/FilterEffectRendererCoreImage.mm:260 > +RetainPtr<CIImage> FilterEffectRendererCoreImage::imageForFEGaussianBlur(FEGaussianBlur& effect, const Vector<RetainPtr<CIImage>>& inputImages) Argument can now be const FEGaussianBlur&. > LayoutTests/css3/filters/effect-blur-square.html:21 > + .container{ > + position:relative; > + width:400px; > + height:400px; > + overflow:hidden; > + } > + > + #background { > + background: green; > + left:-25px; > + right:-25px; > + top:-25px; > + bottom:-25px; > + filter: blur(5px); > + position: absolute; > + } Be consistent with your formatting. Space after : I don't see how this test tests blurring. It would also pass if there were no filter applied.
frankhome61
Comment 12 2020-09-09 16:32:59 PDT
Created attachment 408383 [details] Work in progress (don't review yet)
frankhome61
Comment 13 2020-09-10 10:06:58 PDT
Created attachment 408455 [details] Patch (Work in Progress)
frankhome61
Comment 14 2020-09-10 10:11:56 PDT
2 tests failing on iOS and 4 tests failing on Mac-wk2. css3/filters/filters-on-svg-root.html: very minor pixel difference around the circle fast/filter-image/filter-image-blur.html: the blur amount looks different, however the render result looks different between Minibrowser vs. Safari. css3/filters/svg-blur-filter-clipped.html and css3/filters/effect-blur-square.html: cannot reproduce the result on Jazz/GoldenGate. Might be a bug in Mojave that was later fixed in Jazz. As my internship is ending in 2 days, I am leaving all relevant code & comments here in case I am not able to fix this tomorrow.
frankhome61
Comment 15 2020-09-11 10:25:15 PDT
Created attachment 408542 [details] Valuable CSS/SVG tests I have attached some valuable test html on CSS and SVG filters.
Peng Liu
Comment 16 2020-09-11 16:20:44 PDT
Comment on attachment 408455 [details] Patch (Work in Progress) View in context: https://bugs.webkit.org/attachment.cgi?id=408455&action=review > LayoutTests/css3/filters/effect-blur-square-expected.html:1 > +<!DOCTYPE html> The file name must be effect-blur-square-expected.txt?
Peng Liu
Comment 17 2020-09-11 16:23:01 PDT
Comment on attachment 408455 [details] Patch (Work in Progress) View in context: https://bugs.webkit.org/attachment.cgi?id=408455&action=review >> LayoutTests/css3/filters/effect-blur-square-expected.html:1 >> +<!DOCTYPE html> > > The file name must be effect-blur-square-expected.txt? Oh, sorry, please ignore this comment.
Note You need to log in before you can comment on or make changes to this bug.