@@ -10,7 +10,6 @@ import 'package:ui/ui.dart' as ui;
1010import '../util.dart' ;
1111import 'canvaskit_api.dart' ;
1212import 'color_filter.dart' ;
13- import 'native_memory.dart' ;
1413
1514typedef SkImageFilterBorrow = void Function (SkImageFilter );
1615
@@ -22,7 +21,12 @@ typedef SkImageFilterBorrow = void Function(SkImageFilter);
2221///
2322/// Currently implemented by [CkImageFilter] and [CkColorFilter] .
2423abstract class CkManagedSkImageFilterConvertible implements ui.ImageFilter {
25- void imageFilter (SkImageFilterBorrow borrow);
24+ /// Creates a temporary [SkImageFilter] , passes it to [borrow] , and then
25+ /// immediately deletes it.
26+ ///
27+ /// [SkImageFilter] objects are not kept around so that their memory is
28+ /// reclaimed immediately, rather than waiting for the GC cycle.
29+ void withSkImageFilter (SkImageFilterBorrow borrow);
2630
2731 Matrix4 get transform;
2832}
@@ -56,22 +60,15 @@ abstract class CkImageFilter implements CkManagedSkImageFilterConvertible {
5660}
5761
5862class CkColorFilterImageFilter extends CkImageFilter {
59- CkColorFilterImageFilter ({required this .colorFilter}) : super ._() {
60- final SkImageFilter skImageFilter = colorFilter.initRawImageFilter ();
61- _ref = UniqueRef <SkImageFilter >(this , skImageFilter, 'ImageFilter.color' );
62- }
63+ CkColorFilterImageFilter ({required this .colorFilter}) : super ._();
6364
6465 final CkColorFilter colorFilter;
6566
66- late final UniqueRef <SkImageFilter > _ref;
67-
6867 @override
69- void imageFilter (SkImageFilterBorrow borrow) {
70- borrow (_ref.nativeObject);
71- }
72-
73- void dispose () {
74- _ref.dispose ();
68+ void withSkImageFilter (SkImageFilterBorrow borrow) {
69+ final skImageFilter = colorFilter.initRawImageFilter ();
70+ borrow (skImageFilter);
71+ skImageFilter.delete ();
7572 }
7673
7774 @override
@@ -93,7 +90,14 @@ class CkColorFilterImageFilter extends CkImageFilter {
9390class _CkBlurImageFilter extends CkImageFilter {
9491 _CkBlurImageFilter (
9592 {required this .sigmaX, required this .sigmaY, required this .tileMode})
96- : super ._() {
93+ : super ._();
94+
95+ final double sigmaX;
96+ final double sigmaY;
97+ final ui.TileMode tileMode;
98+
99+ @override
100+ void withSkImageFilter (SkImageFilterBorrow borrow) {
97101 /// Return the identity matrix when both sigmaX and sigmaY are 0. Replicates
98102 /// effect of applying no filter
99103 final SkImageFilter skImageFilter;
@@ -110,18 +114,9 @@ class _CkBlurImageFilter extends CkImageFilter {
110114 null ,
111115 );
112116 }
113- _ref = UniqueRef <SkImageFilter >(this , skImageFilter, 'ImageFilter.blur' );
114- }
115-
116- final double sigmaX;
117- final double sigmaY;
118- final ui.TileMode tileMode;
119117
120- late final UniqueRef <SkImageFilter > _ref;
121-
122- @override
123- void imageFilter (SkImageFilterBorrow borrow) {
124- borrow (_ref.nativeObject);
118+ borrow (skImageFilter);
119+ skImageFilter.delete ();
125120 }
126121
127122 @override
@@ -149,25 +144,22 @@ class _CkMatrixImageFilter extends CkImageFilter {
149144 {required Float64List matrix, required this .filterQuality})
150145 : matrix = Float64List .fromList (matrix),
151146 _transform = Matrix4 .fromFloat32List (toMatrix32 (matrix)),
152- super ._() {
153- final SkImageFilter skImageFilter =
154- canvasKit.ImageFilter .MakeMatrixTransform (
155- toSkMatrixFromFloat64 (matrix),
156- toSkFilterOptions (filterQuality),
157- null ,
158- );
159- _ref = UniqueRef <SkImageFilter >(this , skImageFilter, 'ImageFilter.matrix' );
160- }
147+ super ._();
161148
162149 final Float64List matrix;
163150 final ui.FilterQuality filterQuality;
164151 final Matrix4 _transform;
165152
166- late final UniqueRef <SkImageFilter > _ref;
167-
168153 @override
169- void imageFilter (SkImageFilterBorrow borrow) {
170- borrow (_ref.nativeObject);
154+ void withSkImageFilter (SkImageFilterBorrow borrow) {
155+ final skImageFilter =
156+ canvasKit.ImageFilter .MakeMatrixTransform (
157+ toSkMatrixFromFloat64 (matrix),
158+ toSkFilterOptions (filterQuality),
159+ null ,
160+ );
161+ borrow (skImageFilter);
162+ skImageFilter.delete ();
171163 }
172164
173165 @override
@@ -192,23 +184,20 @@ class _CkMatrixImageFilter extends CkImageFilter {
192184
193185class _CkDilateImageFilter extends CkImageFilter {
194186 _CkDilateImageFilter ({required this .radiusX, required this .radiusY})
195- : super ._() {
196- final SkImageFilter skImageFilter = canvasKit.ImageFilter .MakeDilate (
197- radiusX,
198- radiusY,
199- null ,
200- );
201- _ref = UniqueRef <SkImageFilter >(this , skImageFilter, 'ImageFilter.dilate' );
202- }
187+ : super ._();
203188
204189 final double radiusX;
205190 final double radiusY;
206191
207- late final UniqueRef <SkImageFilter > _ref;
208-
209192 @override
210- void imageFilter (SkImageFilterBorrow borrow) {
211- borrow (_ref.nativeObject);
193+ void withSkImageFilter (SkImageFilterBorrow borrow) {
194+ final skImageFilter = canvasKit.ImageFilter .MakeDilate (
195+ radiusX,
196+ radiusY,
197+ null ,
198+ );
199+ borrow (skImageFilter);
200+ skImageFilter.delete ();
212201 }
213202
214203 @override
@@ -232,23 +221,20 @@ class _CkDilateImageFilter extends CkImageFilter {
232221
233222class _CkErodeImageFilter extends CkImageFilter {
234223 _CkErodeImageFilter ({required this .radiusX, required this .radiusY})
235- : super ._() {
236- final SkImageFilter skImageFilter = canvasKit.ImageFilter .MakeErode (
237- radiusX,
238- radiusY,
239- null ,
240- );
241- _ref = UniqueRef <SkImageFilter >(this , skImageFilter, 'ImageFilter.erode' );
242- }
224+ : super ._();
243225
244226 final double radiusX;
245227 final double radiusY;
246228
247- late final UniqueRef <SkImageFilter > _ref;
248-
249229 @override
250- void imageFilter (SkImageFilterBorrow borrow) {
251- borrow (_ref.nativeObject);
230+ void withSkImageFilter (SkImageFilterBorrow borrow) {
231+ final skImageFilter = canvasKit.ImageFilter .MakeErode (
232+ radiusX,
233+ radiusY,
234+ null ,
235+ );
236+ borrow (skImageFilter);
237+ skImageFilter.delete ();
252238 }
253239
254240 @override
@@ -272,27 +258,23 @@ class _CkErodeImageFilter extends CkImageFilter {
272258
273259class _CkComposeImageFilter extends CkImageFilter {
274260 _CkComposeImageFilter ({required this .outer, required this .inner})
275- : super ._() {
276- outer.imageFilter ((SkImageFilter outerFilter) {
277- inner.imageFilter ((SkImageFilter innerFilter) {
278- final SkImageFilter skImageFilter = canvasKit.ImageFilter .MakeCompose (
279- outerFilter,
280- innerFilter,
281- );
282- _ref = UniqueRef <SkImageFilter >(
283- this , skImageFilter, 'ImageFilter.compose' );
284- });
285- });
286- }
261+ : super ._();
287262
288263 final CkImageFilter outer;
289264 final CkImageFilter inner;
290265
291- late final UniqueRef <SkImageFilter > _ref;
292-
293266 @override
294- void imageFilter (SkImageFilterBorrow borrow) {
295- borrow (_ref.nativeObject);
267+ void withSkImageFilter (SkImageFilterBorrow borrow) {
268+ outer.withSkImageFilter ((skOuter) {
269+ inner.withSkImageFilter ((skInner) {
270+ final skImageFilter = canvasKit.ImageFilter .MakeCompose (
271+ skOuter,
272+ skInner,
273+ );
274+ borrow (skImageFilter);
275+ skImageFilter.delete ();
276+ });
277+ });
296278 }
297279
298280 @override
0 commit comments