@@ -6,6 +6,7 @@ import 'dart:typed_data';
66
77import 'package:ui/ui.dart' as ui;
88
9+ import '../color_filter.dart' ;
910import '../util.dart' ;
1011import 'canvaskit_api.dart' ;
1112import 'image_filter.dart' ;
@@ -56,7 +57,7 @@ class ManagedSkColorFilter extends ManagedSkiaObject<SkColorFilter> {
5657/// [ManagedSkiaObject] that manages a skia image filter.
5758abstract class CkColorFilter
5859 implements CkManagedSkImageFilterConvertible {
59- const CkColorFilter (this .creator );
60+ const CkColorFilter ();
6061
6162 /// Called by [ManagedSkiaObject.createDefault] and
6263 /// [ManagedSkiaObject.resurrect] to create a new [SkImageFilter] , when this
@@ -72,14 +73,10 @@ abstract class CkColorFilter
7273 @override
7374 ManagedSkiaObject <SkImageFilter > get imageFilter =>
7475 CkColorFilterImageFilter (colorFilter: this );
75-
76- /// Convert the CkColorFilter back into a ui.ColorFilter.
77- /// Used in [CkPaint] .
78- final ui.ColorFilter creator;
7976}
8077
8178class CkBlendModeColorFilter extends CkColorFilter {
82- const CkBlendModeColorFilter (super .creator, this .color, this .blendMode);
79+ const CkBlendModeColorFilter (this .color, this .blendMode);
8380
8481 final ui.Color color;
8582 final ui.BlendMode blendMode;
@@ -132,7 +129,7 @@ class CkBlendModeColorFilter extends CkColorFilter {
132129}
133130
134131class CkMatrixColorFilter extends CkColorFilter {
135- const CkMatrixColorFilter (super .creator, this .matrix);
132+ const CkMatrixColorFilter (this .matrix);
136133
137134 final List <double > matrix;
138135
@@ -175,7 +172,7 @@ class CkMatrixColorFilter extends CkColorFilter {
175172}
176173
177174class CkLinearToSrgbGammaColorFilter extends CkColorFilter {
178- const CkLinearToSrgbGammaColorFilter (super .creator );
175+ const CkLinearToSrgbGammaColorFilter ();
179176 @override
180177 SkColorFilter _initRawColorFilter () =>
181178 canvasKit.ColorFilter .MakeLinearToSRGBGamma ();
@@ -191,7 +188,7 @@ class CkLinearToSrgbGammaColorFilter extends CkColorFilter {
191188}
192189
193190class CkSrgbToLinearGammaColorFilter extends CkColorFilter {
194- const CkSrgbToLinearGammaColorFilter (super .creator );
191+ const CkSrgbToLinearGammaColorFilter ();
195192 @override
196193 SkColorFilter _initRawColorFilter () =>
197194 canvasKit.ColorFilter .MakeSRGBToLinearGamma ();
@@ -207,7 +204,7 @@ class CkSrgbToLinearGammaColorFilter extends CkColorFilter {
207204}
208205
209206class CkComposeColorFilter extends CkColorFilter {
210- const CkComposeColorFilter (super .creator, this .outer, this .inner);
207+ const CkComposeColorFilter (this .outer, this .inner);
211208 final ManagedSkColorFilter ? outer;
212209 final ManagedSkColorFilter inner;
213210
@@ -230,3 +227,30 @@ class CkComposeColorFilter extends CkColorFilter {
230227 @override
231228 String toString () => 'ColorFilter.compose($outer , $inner )' ;
232229}
230+
231+ /// Convert the current [ColorFilter] to a CkColorFilter.
232+ ///
233+ /// This workaround allows ColorFilter to be const constructbile and
234+ /// efficiently comparable, so that widgets can check for ColorFilter equality to
235+ /// avoid repainting.
236+ CkColorFilter ? createCkColorFilter (EngineColorFilter colorFilter) {
237+ switch (colorFilter.type) {
238+ case ColorFilterType .mode:
239+ if (colorFilter.color == null || colorFilter.blendMode == null ) {
240+ return null ;
241+ }
242+ return CkBlendModeColorFilter (colorFilter.color! , colorFilter.blendMode! );
243+ case ColorFilterType .matrix:
244+ if (colorFilter.matrix == null ) {
245+ return null ;
246+ }
247+ assert (colorFilter.matrix! .length == 20 , 'Color Matrix must have 20 entries.' );
248+ return CkMatrixColorFilter (colorFilter.matrix! );
249+ case ColorFilterType .linearToSrgbGamma:
250+ return const CkLinearToSrgbGammaColorFilter ();
251+ case ColorFilterType .srgbToLinearGamma:
252+ return const CkSrgbToLinearGammaColorFilter ();
253+ default :
254+ throw StateError ('Unknown mode $colorFilter .type for ColorFilter.' );
255+ }
256+ }
0 commit comments