@@ -10,7 +10,6 @@ import 'package:ui/ui.dart' as ui;
10
10
import '../util.dart' ;
11
11
import 'canvaskit_api.dart' ;
12
12
import 'color_filter.dart' ;
13
- import 'native_memory.dart' ;
14
13
15
14
typedef SkImageFilterBorrow = void Function (SkImageFilter );
16
15
@@ -22,7 +21,12 @@ typedef SkImageFilterBorrow = void Function(SkImageFilter);
22
21
///
23
22
/// Currently implemented by [CkImageFilter] and [CkColorFilter] .
24
23
abstract 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);
26
30
27
31
Matrix4 get transform;
28
32
}
@@ -56,22 +60,15 @@ abstract class CkImageFilter implements CkManagedSkImageFilterConvertible {
56
60
}
57
61
58
62
class 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 ._();
63
64
64
65
final CkColorFilter colorFilter;
65
66
66
- late final UniqueRef <SkImageFilter > _ref;
67
-
68
67
@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 ();
75
72
}
76
73
77
74
@override
@@ -93,7 +90,14 @@ class CkColorFilterImageFilter extends CkImageFilter {
93
90
class _CkBlurImageFilter extends CkImageFilter {
94
91
_CkBlurImageFilter (
95
92
{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) {
97
101
/// Return the identity matrix when both sigmaX and sigmaY are 0. Replicates
98
102
/// effect of applying no filter
99
103
final SkImageFilter skImageFilter;
@@ -110,18 +114,9 @@ class _CkBlurImageFilter extends CkImageFilter {
110
114
null ,
111
115
);
112
116
}
113
- _ref = UniqueRef <SkImageFilter >(this , skImageFilter, 'ImageFilter.blur' );
114
- }
115
-
116
- final double sigmaX;
117
- final double sigmaY;
118
- final ui.TileMode tileMode;
119
117
120
- late final UniqueRef <SkImageFilter > _ref;
121
-
122
- @override
123
- void imageFilter (SkImageFilterBorrow borrow) {
124
- borrow (_ref.nativeObject);
118
+ borrow (skImageFilter);
119
+ skImageFilter.delete ();
125
120
}
126
121
127
122
@override
@@ -149,25 +144,22 @@ class _CkMatrixImageFilter extends CkImageFilter {
149
144
{required Float64List matrix, required this .filterQuality})
150
145
: matrix = Float64List .fromList (matrix),
151
146
_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 ._();
161
148
162
149
final Float64List matrix;
163
150
final ui.FilterQuality filterQuality;
164
151
final Matrix4 _transform;
165
152
166
- late final UniqueRef <SkImageFilter > _ref;
167
-
168
153
@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 ();
171
163
}
172
164
173
165
@override
@@ -192,23 +184,20 @@ class _CkMatrixImageFilter extends CkImageFilter {
192
184
193
185
class _CkDilateImageFilter extends CkImageFilter {
194
186
_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 ._();
203
188
204
189
final double radiusX;
205
190
final double radiusY;
206
191
207
- late final UniqueRef <SkImageFilter > _ref;
208
-
209
192
@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 ();
212
201
}
213
202
214
203
@override
@@ -232,23 +221,20 @@ class _CkDilateImageFilter extends CkImageFilter {
232
221
233
222
class _CkErodeImageFilter extends CkImageFilter {
234
223
_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 ._();
243
225
244
226
final double radiusX;
245
227
final double radiusY;
246
228
247
- late final UniqueRef <SkImageFilter > _ref;
248
-
249
229
@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 ();
252
238
}
253
239
254
240
@override
@@ -272,27 +258,23 @@ class _CkErodeImageFilter extends CkImageFilter {
272
258
273
259
class _CkComposeImageFilter extends CkImageFilter {
274
260
_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 ._();
287
262
288
263
final CkImageFilter outer;
289
264
final CkImageFilter inner;
290
265
291
- late final UniqueRef <SkImageFilter > _ref;
292
-
293
266
@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
+ });
296
278
}
297
279
298
280
@override
0 commit comments