22// Use of this source code is governed by a BSD-style license that can be
33// found in the LICENSE file.
44
5- import 'dart:ffi' ;
65import 'dart:typed_data' ;
76
87import 'package:ui/src/engine.dart' ;
98import 'package:ui/src/engine/skwasm/skwasm_impl.dart' ;
109import 'package:ui/ui.dart' as ui;
1110
12- class SkwasmImageFilter extends SkwasmObjectWrapper <RawImageFilter >implements SceneImageFilter {
13- SkwasmImageFilter ._ (ImageFilterHandle handle): super (handle, _registry);
11+ abstract class SkwasmImageFilter extends SkwasmObjectWrapper <RawImageFilter >implements SceneImageFilter {
12+ SkwasmImageFilter (ImageFilterHandle handle): super (handle, _registry);
1413
1514factory SkwasmImageFilter .blur ({
1615double sigmaX= 0.0 ,
1716double sigmaY= 0.0 ,
1817 ui.TileMode tileMode= ui.TileMode .clamp,
19- })=> SkwasmImageFilter ._( imageFilterCreateBlur ( sigmaX, sigmaY, tileMode.index) );
18+ })=> SkwasmBlurFilter ( sigmaX, sigmaY, tileMode);
2019
2120factory SkwasmImageFilter .dilate ({
2221double radiusX= 0.0 ,
2322double radiusY= 0.0 ,
24- })=> SkwasmImageFilter ._( imageFilterCreateDilate ( radiusX, radiusY) );
23+ })=> SkwasmDilateFilter ( radiusX, radiusY);
2524
2625factory SkwasmImageFilter .erode ({
2726double radiusX= 0.0 ,
2827double radiusY= 0.0 ,
29- })=> SkwasmImageFilter ._( imageFilterCreateErode ( radiusX, radiusY) );
28+ })=> SkwasmErodeFilter ( radiusX, radiusY);
3029
3130factory SkwasmImageFilter .matrix (
3231Float64List matrix4, {
3332 ui.FilterQuality filterQuality= ui.FilterQuality .low
34- })=> withStackScope ((StackScope scope)=> SkwasmImageFilter ._(imageFilterCreateMatrix (
35- scope.convertMatrix4toSkMatrix (matrix4),
36- filterQuality.index
37- )));
33+ })=> SkwasmMatrixFilter (matrix4, filterQuality);
3834
3935factory SkwasmImageFilter .fromColorFilter (SkwasmColorFilter filter)=>
40- SkwasmImageFilter ._( imageFilterCreateFromColorFilter ( filter.handle) );
36+ SkwasmColorImageFilter ( filter);
4137
4238factory SkwasmImageFilter .fromUiFilter (ui.ImageFilter filter) {
4339if (filteris ui.ColorFilter ) {
@@ -54,11 +50,10 @@ class SkwasmImageFilter extends SkwasmObjectWrapper<RawImageFilter> implements S
5450factory SkwasmImageFilter .compose (
5551 ui.ImageFilter outer,
5652 ui.ImageFilter inner,
57- ) {
58- final SkwasmImageFilter nativeOuter= SkwasmImageFilter .fromUiFilter (outer);
59- final SkwasmImageFilter nativeInner= SkwasmImageFilter .fromUiFilter (inner);
60- return SkwasmImageFilter ._(imageFilterCompose (nativeOuter.handle, nativeInner.handle));
61- }
53+ )=> SkwasmComposedImageFilter (
54+ SkwasmImageFilter .fromUiFilter (outer),
55+ SkwasmImageFilter .fromUiFilter (inner),
56+ );
6257
6358static final SkwasmFinalizationRegistry <RawImageFilter > _registry=
6459SkwasmFinalizationRegistry <RawImageFilter >(imageFilterDispose);
@@ -71,32 +66,161 @@ class SkwasmImageFilter extends SkwasmObjectWrapper<RawImageFilter> implements S
7166 });
7267}
7368
74- class SkwasmColorFilter extends SkwasmObjectWrapper <RawColorFilter > {
75- SkwasmColorFilter ._(ColorFilterHandle handle): super (handle, _registry);
69+ class SkwasmBlurFilter extends SkwasmImageFilter {
70+ SkwasmBlurFilter (
71+ this .sigmaX,
72+ this .sigmaY,
73+ this .tileMode,
74+ ): super (imageFilterCreateBlur (sigmaX, sigmaY, tileMode.index));
75+
76+ final double sigmaX;
77+ final double sigmaY;
78+ ui.TileMode tileMode;
79+
80+ @override
81+ String toString ()=> 'ImageFilter.blur($sigmaX , $sigmaY , ${tileModeString (tileMode )})' ;
82+ }
83+
84+ class SkwasmDilateFilter extends SkwasmImageFilter {
85+ SkwasmDilateFilter (
86+ this .radiusX,
87+ this .radiusY,
88+ ): super (imageFilterCreateDilate (radiusX, radiusY));
89+
90+ final double radiusX;
91+ final double radiusY;
92+
93+ @override
94+ String toString ()=> 'ImageFilter.dilate($radiusX , $radiusY )' ;
95+ }
96+
97+ class SkwasmErodeFilter extends SkwasmImageFilter {
98+ SkwasmErodeFilter (
99+ this .radiusX,
100+ this .radiusY,
101+ ): super (imageFilterCreateErode (radiusX, radiusY));
102+
103+ final double radiusX;
104+ final double radiusY;
105+
106+ @override
107+ String toString ()=> 'ImageFilter.erode($radiusX , $radiusY )' ;
108+ }
109+
110+ class SkwasmMatrixFilter extends SkwasmImageFilter {
111+ SkwasmMatrixFilter (
112+ this .matrix4,
113+ this .filterQuality,
114+ ): super (withStackScope ((StackScope scope)=> imageFilterCreateMatrix (
115+ scope.convertMatrix4toSkMatrix (matrix4),
116+ filterQuality.index,
117+ )));
118+
119+ final Float64List matrix4;
120+ final ui.FilterQuality filterQuality;
121+
122+ @override
123+ String toString ()=> 'ImageFilter.matrix($matrix4 , $filterQuality )' ;
124+ }
125+
126+ class SkwasmColorImageFilter extends SkwasmImageFilter {
127+ SkwasmColorImageFilter (
128+ this .filter,
129+ ): super (imageFilterCreateFromColorFilter (filter.handle));
130+
131+ final SkwasmColorFilter filter;
132+
133+ @override
134+ String toString ()=> filter.toString ();
135+ }
136+
137+ class SkwasmComposedImageFilter extends SkwasmImageFilter {
138+ SkwasmComposedImageFilter (
139+ this .outer,
140+ this .inner,
141+ ): super (imageFilterCompose (outer.handle, inner.handle));
142+
143+ final SkwasmImageFilter outer;
144+ final SkwasmImageFilter inner;
145+
146+ @override
147+ String toString ()=> 'ImageFilter.compose($outer , $inner )' ;
148+ }
149+
150+ abstract class SkwasmColorFilter extends SkwasmObjectWrapper <RawColorFilter > {
151+ SkwasmColorFilter (ColorFilterHandle handle): super (handle, _registry);
76152
77153factory SkwasmColorFilter .fromEngineColorFilter (EngineColorFilter colorFilter)=>
78154switch (colorFilter.type) {
79- ColorFilterType .mode=> SkwasmColorFilter ._(colorFilterCreateMode (
80- colorFilter.color! .value,
81- colorFilter.blendMode! .index,
82- )),
83- ColorFilterType .linearToSrgbGamma=> SkwasmColorFilter ._(colorFilterCreateLinearToSRGBGamma ()),
84- ColorFilterType .srgbToLinearGamma=> SkwasmColorFilter ._(colorFilterCreateSRGBToLinearGamma ()),
85- ColorFilterType .matrix=> withStackScope ((StackScope scope) {
86- final Pointer <Float > nativeMatrix= scope.convertDoublesToNative (colorFilter.matrix! );
87- return SkwasmColorFilter ._(colorFilterCreateMatrix (nativeMatrix));
88- }),
155+ ColorFilterType .mode=> SkwasmModeColorFilter (colorFilter.color! , colorFilter.blendMode! ),
156+ ColorFilterType .linearToSrgbGamma=> SkwasmLinearToSrgbGammaColorFilter (),
157+ ColorFilterType .srgbToLinearGamma=> SkwasmSrgbToLinearGammaColorFilter (),
158+ ColorFilterType .matrix=> SkwasmMatrixColorFilter (colorFilter.matrix! ),
89159 };
90160
91161factory SkwasmColorFilter .composed (
92162SkwasmColorFilter outer,
93163SkwasmColorFilter inner,
94- )=> SkwasmColorFilter ._( colorFilterCompose ( outer.handle , inner.handle) );
164+ )=> SkwasmComposedColorFilter ( outer, inner);
95165
96166static final SkwasmFinalizationRegistry <RawColorFilter > _registry=
97167SkwasmFinalizationRegistry <RawColorFilter >(colorFilterDispose);
98168}
99169
170+ class SkwasmModeColorFilter extends SkwasmColorFilter {
171+ SkwasmModeColorFilter (
172+ this .color,
173+ this .blendMode,
174+ ): super (colorFilterCreateMode (
175+ color.value,
176+ blendMode.index,
177+ ));
178+
179+ final ui.Color color;
180+ final ui.BlendMode blendMode;
181+
182+ @override
183+ String toString ()=> 'ColorFilter.mode($color , $blendMode )' ;
184+ }
185+
186+ class SkwasmLinearToSrgbGammaColorFilter extends SkwasmColorFilter {
187+ SkwasmLinearToSrgbGammaColorFilter (): super (colorFilterCreateLinearToSRGBGamma ());
188+
189+ @override
190+ String toString ()=> 'ColorFilter.linearToSrgbGamma()' ;
191+ }
192+
193+ class SkwasmSrgbToLinearGammaColorFilter extends SkwasmColorFilter {
194+ SkwasmSrgbToLinearGammaColorFilter (): super (colorFilterCreateSRGBToLinearGamma ());
195+
196+ @override
197+ String toString ()=> 'ColorFilter.srgbToLinearGamma()' ;
198+ }
199+
200+ class SkwasmMatrixColorFilter extends SkwasmColorFilter {
201+ SkwasmMatrixColorFilter (this .matrix): super (withStackScope ((StackScope scope)=>
202+ colorFilterCreateMatrix (scope.convertDoublesToNative (matrix))
203+ ));
204+
205+ final List <double > matrix;
206+
207+ @override
208+ String toString ()=> 'ColorFilter.matrix($matrix )' ;
209+ }
210+
211+ class SkwasmComposedColorFilter extends SkwasmColorFilter {
212+ SkwasmComposedColorFilter (
213+ this .outer,
214+ this .inner,
215+ ): super (colorFilterCompose (outer.handle, inner.handle));
216+
217+ final SkwasmColorFilter outer;
218+ final SkwasmColorFilter inner;
219+
220+ @override
221+ String toString ()=> 'ColorFilter.compose($outer , $inner )' ;
222+ }
223+
100224class SkwasmMaskFilter extends SkwasmObjectWrapper <RawMaskFilter > {
101225SkwasmMaskFilter ._(MaskFilterHandle handle): super (handle, _registry);
102226