55import 'package:ui/ui.dart' as ui;
66
77import '../browser_detection.dart' ;
8+ import '../color_filter.dart' ;
89import '../dom.dart' ;
10+ import '../embedder.dart' ;
911import '../util.dart' ;
1012import '../vector_math.dart' ;
1113import 'shaders/shader.dart' ;
@@ -17,7 +19,7 @@ class PersistedBackdropFilter extends PersistedContainerSurface
1719 implements ui.BackdropFilterEngineLayer {
1820 PersistedBackdropFilter (PersistedBackdropFilter ? super .oldLayer, this .filter);
1921
20- final EngineImageFilter filter;
22+ final ui. ImageFilter filter;
2123
2224 /// The dedicated child container element that's separate from the
2325 /// [rootElement] is used to host child in front of [filterElement] that
@@ -26,6 +28,7 @@ class PersistedBackdropFilter extends PersistedContainerSurface
2628 DomElement ? get childContainer => _childContainer;
2729 DomElement ? _childContainer;
2830 DomElement ? _filterElement;
31+ DomElement ? _svgFilter;
2932 ui.Rect ? _activeClipBounds;
3033 // Cached inverted transform for [transform].
3134 late Matrix4 _invertedTransform;
@@ -37,6 +40,7 @@ class PersistedBackdropFilter extends PersistedContainerSurface
3740 super .adoptElements (oldSurface);
3841 _childContainer = oldSurface._childContainer;
3942 _filterElement = oldSurface._filterElement;
43+ _svgFilter = oldSurface._svgFilter;
4044 oldSurface._childContainer = null ;
4145 }
4246
@@ -62,12 +66,22 @@ class PersistedBackdropFilter extends PersistedContainerSurface
6266 // Do not detach the child container from the root. It is permanently
6367 // attached. The elements are reused together and are detached from the DOM
6468 // together.
69+ flutterViewEmbedder.removeResource (_svgFilter);
70+ _svgFilter = null ;
6571 _childContainer = null ;
6672 _filterElement = null ;
6773 }
6874
6975 @override
7076 void apply () {
77+ EngineImageFilter backendFilter;
78+ if (filter is ui.ColorFilter ) {
79+ backendFilter = createHtmlColorFilter (filter as EngineColorFilter )! ;
80+ } else {
81+ backendFilter = filter as EngineImageFilter ;
82+ }
83+ flutterViewEmbedder.removeResource (_svgFilter);
84+ _svgFilter = null ;
7185 if (_previousTransform != transform) {
7286 _invertedTransform = Matrix4 .inverted (transform! );
7387 _previousTransform = transform;
@@ -115,14 +129,24 @@ class PersistedBackdropFilter extends PersistedContainerSurface
115129 ..backgroundColor = '#000'
116130 ..opacity = '0.2' ;
117131 } else {
132+ if (backendFilter is ModeHtmlColorFilter ) {
133+ _svgFilter = backendFilter.makeSvgFilter (_filterElement);
134+ /// Some blendModes do not make an svgFilter. See [EngineHtmlColorFilter.makeSvgFilter()]
135+ if (_svgFilter == null ) {
136+ return ;
137+ }
138+ } else if (backendFilter is MatrixHtmlColorFilter ) {
139+ _svgFilter = backendFilter.makeSvgFilter (_filterElement);
140+ }
141+
118142 // CSS uses pixel radius for blur. Flutter & SVG use sigma parameters. For
119143 // Gaussian blur with standard deviation (normal distribution),
120144 // the blur will fall within 2 * sigma pixels.
121145 if (browserEngine == BrowserEngine .webkit) {
122146 setElementStyle (_filterElement! , '-webkit-backdrop-filter' ,
123- filter .filterAttribute);
147+ backendFilter .filterAttribute);
124148 }
125- setElementStyle (_filterElement! , 'backdrop-filter' , filter .filterAttribute);
149+ setElementStyle (_filterElement! , 'backdrop-filter' , backendFilter .filterAttribute);
126150 }
127151 }
128152
0 commit comments