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

Commit 90ee21e

Browse files
committed
removed creator and toRendererColorFilter method
1 parent 3164f0d commit 90ee21e

File tree

16 files changed

+128
-216
lines changed

16 files changed

+128
-216
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:ui/ui.dart' as ui;
99

1010
import '../color_filter.dart';
1111
import 'canvaskit_api.dart';
12+
import 'color_filter.dart';
1213
import 'image.dart';
1314
import 'image_filter.dart';
1415
import 'painting.dart';
@@ -293,7 +294,7 @@ class CkCanvas {
293294
[CkPaint? paint]) {
294295
final CkManagedSkImageFilterConvertible convertible;
295296
if (filter is ui.ColorFilter) {
296-
convertible = (filter as EngineColorFilter).toRendererColorFilter() as CkManagedSkImageFilterConvertible;
297+
convertible = createCkColorFilter(filter as EngineColorFilter)!;
297298
}
298299
else {
299300
convertible = filter as CkManagedSkImageFilterConvertible;
@@ -1169,8 +1170,13 @@ class CkSaveLayerWithFilterCommand extends CkPaintCommand {
11691170

11701171
@override
11711172
void apply(SkCanvas canvas) {
1172-
final CkManagedSkImageFilterConvertible convertible =
1173-
filter as CkManagedSkImageFilterConvertible;
1173+
final CkManagedSkImageFilterConvertible convertible;
1174+
if (filter is ui.ColorFilter) {
1175+
convertible = createCkColorFilter(filter as EngineColorFilter)!;
1176+
}
1177+
else {
1178+
convertible = filter as CkManagedSkImageFilterConvertible;
1179+
}
11741180
return canvas.saveLayer(
11751181
paint?.skiaObject,
11761182
toSkRect(bounds),

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

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:typed_data';
66

77
import 'package:ui/ui.dart' as ui;
88

9+
import '../color_filter.dart';
910
import '../util.dart';
1011
import 'canvaskit_api.dart';
1112
import 'image_filter.dart';
@@ -56,7 +57,7 @@ class ManagedSkColorFilter extends ManagedSkiaObject<SkColorFilter> {
5657
/// [ManagedSkiaObject] that manages a skia image filter.
5758
abstract 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

8178
class 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

134131
class 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

177174
class 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

193190
class 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

209206
class 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+
}

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

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,7 @@ class CkPaint extends ManagedSkiaObject<SkPaint> implements ui.Paint {
132132
_effectiveColorFilter = _invertColorFilter;
133133
} else {
134134
_effectiveColorFilter = ManagedSkColorFilter(
135-
CkComposeColorFilter(
136-
_effectiveColorFilter!.colorFilter.creator,
137-
_invertColorFilter,
138-
_effectiveColorFilter!
139-
)
135+
CkComposeColorFilter(_invertColorFilter, _effectiveColorFilter!)
140136
);
141137
}
142138
}
@@ -207,22 +203,22 @@ class CkPaint extends ManagedSkiaObject<SkPaint> implements ui.Paint {
207203
}
208204

209205
ui.FilterQuality _filterQuality = ui.FilterQuality.none;
206+
EngineColorFilter? _engineColorFilter;
210207

211208
@override
212-
ui.ColorFilter? get colorFilter {
213-
return _effectiveColorFilter?.colorFilter.creator;
214-
}
209+
ui.ColorFilter? get colorFilter => _engineColorFilter;
210+
215211
@override
216212
set colorFilter(ui.ColorFilter? value) {
217-
if (colorFilter == value) {
213+
if (_engineColorFilter == value) {
218214
return;
219215
}
220-
216+
_engineColorFilter = value as EngineColorFilter?;
221217
_originalColorFilter = null;
222218
if (value == null) {
223219
_effectiveColorFilter = null;
224220
} else {
225-
final CkColorFilter ckColorFilter = (value as EngineColorFilter).toRendererColorFilter() as CkColorFilter;
221+
final CkColorFilter ckColorFilter = createCkColorFilter(value)!;
226222
_effectiveColorFilter = ManagedSkColorFilter(ckColorFilter);
227223
}
228224

@@ -232,11 +228,7 @@ class CkPaint extends ManagedSkiaObject<SkPaint> implements ui.Paint {
232228
_effectiveColorFilter = _invertColorFilter;
233229
} else {
234230
_effectiveColorFilter = ManagedSkColorFilter(
235-
CkComposeColorFilter(
236-
_effectiveColorFilter!.colorFilter.creator,
237-
_invertColorFilter,
238-
_effectiveColorFilter!
239-
)
231+
CkComposeColorFilter(_invertColorFilter, _effectiveColorFilter!)
240232
);
241233
}
242234
}
@@ -270,7 +262,7 @@ class CkPaint extends ManagedSkiaObject<SkPaint> implements ui.Paint {
270262
return;
271263
}
272264
if (value is ui.ColorFilter) {
273-
_imageFilter = (value as EngineColorFilter).toRendererColorFilter() as CkManagedSkImageFilterConvertible?;
265+
_imageFilter = createCkColorFilter(value as EngineColorFilter);
274266
}
275267
else {
276268
_imageFilter = value as CkManagedSkImageFilterConvertible?;
@@ -323,12 +315,7 @@ final Float32List _invertColorMatrix = Float32List.fromList(const <double>[
323315
1.0, 1.0, 1.0, 1.0, 0
324316
]);
325317

326-
final ManagedSkColorFilter _invertColorFilter = createInvertedColorFilter(_invertColorMatrix);
327-
328-
ManagedSkColorFilter createInvertedColorFilter(Float32List invertColorMatrix) {
329-
final ui.ColorFilter creator = ui.ColorFilter.matrix(invertColorMatrix);
330-
return ManagedSkColorFilter(CkMatrixColorFilter(creator, invertColorMatrix));
331-
}
318+
final ManagedSkColorFilter _invertColorFilter = ManagedSkColorFilter(CkMatrixColorFilter(_invertColorMatrix));
332319

333320
class UniformData {
334321
const UniformData({

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

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import '../profiler.dart';
1616
import '../renderer.dart';
1717
import 'canvaskit_api.dart';
1818
import 'canvaskit_canvas.dart';
19-
import 'color_filter.dart';
2019
import 'fonts.dart';
2120
import 'image.dart';
2221
import 'image_filter.dart';
@@ -195,27 +194,6 @@ class CanvasKitRenderer implements Renderer {
195194
throw UnimplementedError('ImageFilter.compose not implemented for CanvasKit.');
196195
}
197196

198-
@override
199-
CkMatrixColorFilter createMatrixColorFilter(
200-
ui.ColorFilter creator,
201-
List<double> matrix
202-
) => CkMatrixColorFilter(creator, matrix);
203-
204-
@override
205-
CkBlendModeColorFilter createModeColorFilter(
206-
ui.ColorFilter creator,
207-
ui.Color color,
208-
ui.BlendMode blendMode
209-
) => CkBlendModeColorFilter(creator, color, blendMode);
210-
211-
@override
212-
CkLinearToSrgbGammaColorFilter createLinearToSrgbGammaColorFilter(ui.ColorFilter creator) =>
213-
CkLinearToSrgbGammaColorFilter(creator);
214-
215-
@override
216-
CkSrgbToLinearGammaColorFilter createSrgbToLinearGammaColorFilter(ui.ColorFilter creator) =>
217-
CkSrgbToLinearGammaColorFilter(creator);
218-
219197
@override
220198
Future<ui.Codec> instantiateImageCodec(
221199
Uint8List list, {

lib/web_ui/lib/src/engine/color_filter.dart

Lines changed: 19 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
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 'package:ui/src/engine/renderer.dart';
65
import 'package:ui/ui.dart' as ui;
76

87
enum ColorFilterType {
@@ -28,11 +27,9 @@ class EngineColorFilter implements ui.ColorFilter {
2827
/// The output of this filter is then composited into the background according
2928
/// to the [Paint.blendMode], using the output of this filter as the source
3029
/// and the background as the destination.
31-
const EngineColorFilter.mode(ui.Color color, ui.BlendMode blendMode)
32-
: _color = color,
33-
_blendMode = blendMode,
34-
_matrix = null,
35-
_type = ColorFilterType.mode;
30+
const EngineColorFilter.mode(ui.Color this.color, ui.BlendMode this.blendMode)
31+
: matrix = null,
32+
type = ColorFilterType.mode;
3633

3734
/// Construct a color filter that transforms a color by a 5x5 matrix, where
3835
/// the fifth row is implicitly added in an identity configuration.
@@ -94,70 +91,29 @@ class EngineColorFilter implements ui.ColorFilter {
9491
/// 0, 0, 0, 1, 0,
9592
/// ]);
9693
/// ```
97-
const EngineColorFilter.matrix(List<double> matrix)
98-
: _color = null,
99-
_blendMode = null,
100-
_matrix = matrix,
101-
_type = ColorFilterType.matrix;
94+
const EngineColorFilter.matrix(List<double> this.matrix)
95+
: color = null,
96+
blendMode = null,
97+
type = ColorFilterType.matrix;
10298

10399
/// Construct a color filter that applies the sRGB gamma curve to the RGB
104100
/// channels.
105101
const EngineColorFilter.linearToSrgbGamma()
106-
: _color = null,
107-
_blendMode = null,
108-
_matrix = null,
109-
_type = ColorFilterType.linearToSrgbGamma;
102+
: color = null,
103+
blendMode = null,
104+
matrix = null,
105+
type = ColorFilterType.linearToSrgbGamma;
110106

111107
/// Creates a color filter that applies the inverse of the sRGB gamma curve
112108
/// to the RGB channels.
113109
const EngineColorFilter.srgbToLinearGamma()
114-
: _color = null,
115-
_blendMode = null,
116-
_matrix = null,
117-
_type = ColorFilterType.srgbToLinearGamma;
110+
: color = null,
111+
blendMode = null,
112+
matrix = null,
113+
type = ColorFilterType.srgbToLinearGamma;
118114

119-
final ui.Color? _color;
120-
final ui.BlendMode? _blendMode;
121-
final List<double>? _matrix;
122-
final ColorFilterType _type;
123-
124-
/// Convert the current [ColorFilter] to either a [CkColorFilter] or [HtmlEngineColorFilter]
125-
/// depending on the renderer.
126-
///
127-
/// After calling this function and getting the renderer specific ColorFilter,
128-
/// cast the correct type on the converted ColorFilter based on the renderer backend:
129-
///
130-
/// canvaskit: [CkColorFilter]
131-
/// Html: [HtmlEngineColorFilter]
132-
///
133-
/// ## Example uses:
134-
/// ```
135-
/// CkColorFilter ckColorFilter =
136-
/// (ColorFilter.mode(Color color, BlendMode blendMode) as EngineColorFilter).toRendererColorFilter() as CkColorFilter;
137-
/// ```
138-
///
139-
/// This workaround allows ColorFilter to be const constructbile and
140-
/// efficiently comparable, so that widgets can check for ColorFilter equality to
141-
/// avoid repainting.
142-
dynamic toRendererColorFilter() {
143-
switch (_type) {
144-
case ColorFilterType.mode:
145-
if (_color == null || _blendMode == null) {
146-
return null;
147-
}
148-
return renderer.createModeColorFilter(this, _color!, _blendMode!);
149-
case ColorFilterType.matrix:
150-
if (_matrix == null) {
151-
return null;
152-
}
153-
assert(_matrix!.length == 20, 'Color Matrix must have 20 entries.');
154-
return renderer.createMatrixColorFilter(this, _matrix!);
155-
case ColorFilterType.linearToSrgbGamma:
156-
return renderer.createLinearToSrgbGammaColorFilter(this);
157-
case ColorFilterType.srgbToLinearGamma:
158-
return renderer.createSrgbToLinearGammaColorFilter(this);
159-
default:
160-
throw StateError('Unknown mode $_type for ColorFilter.');
161-
}
162-
}
115+
final ui.Color? color;
116+
final ui.BlendMode? blendMode;
117+
final List<double>? matrix;
118+
final ColorFilterType type;
163119
}

lib/web_ui/lib/src/engine/html/backdrop_filter.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class PersistedBackdropFilter extends PersistedContainerSurface
7777
void apply() {
7878
EngineImageFilter backendFilter;
7979
if (filter is ui.ColorFilter) {
80-
backendFilter = (filter as EngineColorFilter).toRendererColorFilter() as EngineHtmlColorFilter;
80+
backendFilter = createHtmlColorFilter(filter as EngineColorFilter)!;
8181
} else {
8282
backendFilter = filter as EngineImageFilter;
8383
}
@@ -135,7 +135,7 @@ class PersistedBackdropFilter extends PersistedContainerSurface
135135
/// Some blendModes do not make an svgFilter. See [EngineHtmlColorFilter.makeSvgFilter()]
136136
if (_svgFilter == null) {
137137
return;
138-
}
138+
}
139139
} else if (backendFilter is MatrixHtmlColorFilter) {
140140
_svgFilter = backendFilter.makeSvgFilter(_filterElement);
141141
}

lib/web_ui/lib/src/engine/html/bitmap_canvas.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ class BitmapCanvas extends EngineCanvas {
646646
ui.Image image, ui.Offset p, SurfacePaintData paint) {
647647
final HtmlImage htmlImage = image as HtmlImage;
648648
final ui.BlendMode? blendMode = paint.blendMode;
649-
final EngineHtmlColorFilter? colorFilter = paint.colorFilter;
649+
final EngineHtmlColorFilter? colorFilter = createHtmlColorFilter(paint.colorFilter);
650650
DomHTMLElement imgElement;
651651
if (colorFilter is ModeHtmlColorFilter) {
652652
imgElement = _createImageElementWithBlend(

lib/web_ui/lib/src/engine/html/color_filter.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ class PersistedColorFilter extends PersistedContainerSurface
7373
void apply() {
7474
flutterViewEmbedder.removeResource(_filterElement);
7575
_filterElement = null;
76-
final EngineHtmlColorFilter? engineValue =
77-
(filter as EngineColorFilter).toRendererColorFilter() as EngineHtmlColorFilter?;
76+
final EngineHtmlColorFilter? engineValue = createHtmlColorFilter(filter as EngineColorFilter);
7877
if (engineValue == null) {
7978
rootElement!.style.backgroundColor = '';
8079
childContainer?.style.visibility = 'visible';

0 commit comments

Comments
 (0)