Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 125bf3b

Browse files
Add ImageFilter.compose
1 parent f92946e commit 125bf3b

File tree

3 files changed

+305
-246
lines changed

3 files changed

+305
-246
lines changed

lib/web_ui/lib/src/engine/canvaskit/image_filter.dart

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ abstract class CkManagedSkImageFilterConvertible implements ui.ImageFilter {
2828
}
2929

3030
/// The CanvasKit implementation of [ui.ImageFilter].
31-
///
32-
/// Currently only supports `blur`, `matrix`, and ColorFilters.
3331
abstract class CkImageFilter implements CkManagedSkImageFilterConvertible {
3432
factory CkImageFilter.blur(
3533
{required double sigmaX,
@@ -40,6 +38,9 @@ abstract class CkImageFilter implements CkManagedSkImageFilterConvertible {
4038
factory CkImageFilter.matrix(
4139
{required Float64List matrix,
4240
required ui.FilterQuality filterQuality}) = _CkMatrixImageFilter;
41+
factory CkImageFilter.compose(
42+
{required CkImageFilter outer,
43+
required CkImageFilter inner}) = _CkComposeImageFilter;
4344

4445
CkImageFilter._();
4546

@@ -91,10 +92,9 @@ class _CkBlurImageFilter extends CkImageFilter {
9192
final SkImageFilter skImageFilter;
9293
if (sigmaX == 0 && sigmaY == 0) {
9394
skImageFilter = canvasKit.ImageFilter.MakeMatrixTransform(
94-
toSkMatrixFromFloat32(Matrix4.identity().storage),
95-
toSkFilterOptions(ui.FilterQuality.none),
96-
null
97-
);
95+
toSkMatrixFromFloat32(Matrix4.identity().storage),
96+
toSkFilterOptions(ui.FilterQuality.none),
97+
null);
9898
} else {
9999
skImageFilter = canvasKit.ImageFilter.MakeBlur(
100100
sigmaX,
@@ -156,7 +156,8 @@ class _CkMatrixImageFilter extends CkImageFilter {
156156
: matrix = Float64List.fromList(matrix),
157157
_transform = Matrix4.fromFloat32List(toMatrix32(matrix)),
158158
super._() {
159-
final SkImageFilter skImageFilter = canvasKit.ImageFilter.MakeMatrixTransform(
159+
final SkImageFilter skImageFilter =
160+
canvasKit.ImageFilter.MakeMatrixTransform(
160161
toSkMatrixFromFloat64(matrix),
161162
toSkFilterOptions(filterQuality),
162163
null,
@@ -194,3 +195,47 @@ class _CkMatrixImageFilter extends CkImageFilter {
194195
@override
195196
Matrix4 get transform => _transform;
196197
}
198+
199+
class _CkComposeImageFilter extends CkImageFilter {
200+
_CkComposeImageFilter({required this.outer, required this.inner})
201+
: super._() {
202+
outer.imageFilter((SkImageFilter outerFilter) {
203+
inner.imageFilter((SkImageFilter innerFilter) {
204+
final SkImageFilter skImageFilter = canvasKit.ImageFilter.MakeCompose(
205+
outerFilter,
206+
innerFilter,
207+
);
208+
_ref = UniqueRef<SkImageFilter>(
209+
this, skImageFilter, 'ImageFilter.compose');
210+
});
211+
});
212+
}
213+
214+
final CkImageFilter outer;
215+
final CkImageFilter inner;
216+
217+
late final UniqueRef<SkImageFilter> _ref;
218+
219+
@override
220+
void imageFilter(SkImageFilterBorrow borrow) {
221+
borrow(_ref.nativeObject);
222+
}
223+
224+
@override
225+
bool operator ==(Object other) {
226+
if (runtimeType != other.runtimeType) {
227+
return false;
228+
}
229+
return other is _CkComposeImageFilter &&
230+
other.outer == outer &&
231+
other.inner == inner;
232+
}
233+
234+
@override
235+
int get hashCode => Object.hash(outer, inner);
236+
237+
@override
238+
String toString() {
239+
return 'ImageFilter.compose($outer, $inner)';
240+
}
241+
}

0 commit comments

Comments
 (0)