Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitcc8cd24

Browse files
[skwasm] FixtoString methods on Paint and ImageFilter/ColorFilter (flutter#51766)
Thisfixesflutter#141639Most of this was previously unimplemented. It turns out the reason for the hang described in the github issue was that there was a typo in the name of the `getMiterLimit` C function, so if the client actually called that method the Wasm module failed to compile, as it couldn't find an import with the misspelled name.
1 parent71b680f commitcc8cd24

File tree

4 files changed

+244
-51
lines changed

4 files changed

+244
-51
lines changed

‎lib/web_ui/lib/src/engine/skwasm/skwasm_impl/filters.dart‎

Lines changed: 153 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,38 @@
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';
65
import'dart:typed_data';
76

87
import'package:ui/src/engine.dart';
98
import'package:ui/src/engine/skwasm/skwasm_impl.dart';
109
import'package:ui/ui.dart'as ui;
1110

12-
classSkwasmImageFilterextendsSkwasmObjectWrapper<RawImageFilter>implementsSceneImageFilter {
13-
SkwasmImageFilter._(ImageFilterHandle handle):super(handle, _registry);
11+
abstractclassSkwasmImageFilterextendsSkwasmObjectWrapper<RawImageFilter>implementsSceneImageFilter {
12+
SkwasmImageFilter(ImageFilterHandle handle):super(handle, _registry);
1413

1514
factorySkwasmImageFilter.blur({
1615
double sigmaX=0.0,
1716
double sigmaY=0.0,
1817
ui.TileMode tileMode= ui.TileMode.clamp,
19-
})=>SkwasmImageFilter._(imageFilterCreateBlur(sigmaX, sigmaY, tileMode.index));
18+
})=>SkwasmBlurFilter(sigmaX, sigmaY, tileMode);
2019

2120
factorySkwasmImageFilter.dilate({
2221
double radiusX=0.0,
2322
double radiusY=0.0,
24-
})=>SkwasmImageFilter._(imageFilterCreateDilate(radiusX, radiusY));
23+
})=>SkwasmDilateFilter(radiusX, radiusY);
2524

2625
factorySkwasmImageFilter.erode({
2726
double radiusX=0.0,
2827
double radiusY=0.0,
29-
})=>SkwasmImageFilter._(imageFilterCreateErode(radiusX, radiusY));
28+
})=>SkwasmErodeFilter(radiusX, radiusY);
3029

3130
factorySkwasmImageFilter.matrix(
3231
Float64List 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

3935
factorySkwasmImageFilter.fromColorFilter(SkwasmColorFilter filter)=>
40-
SkwasmImageFilter._(imageFilterCreateFromColorFilter(filter.handle));
36+
SkwasmColorImageFilter(filter);
4137

4238
factorySkwasmImageFilter.fromUiFilter(ui.ImageFilter filter) {
4339
if (filteris ui.ColorFilter) {
@@ -54,11 +50,10 @@ class SkwasmImageFilter extends SkwasmObjectWrapper<RawImageFilter> implements S
5450
factorySkwasmImageFilter.compose(
5551
ui.ImageFilter outer,
5652
ui.ImageFilter inner,
57-
) {
58-
finalSkwasmImageFilter nativeOuter=SkwasmImageFilter.fromUiFilter(outer);
59-
finalSkwasmImageFilter nativeInner=SkwasmImageFilter.fromUiFilter(inner);
60-
returnSkwasmImageFilter._(imageFilterCompose(nativeOuter.handle, nativeInner.handle));
61-
}
53+
)=>SkwasmComposedImageFilter(
54+
SkwasmImageFilter.fromUiFilter(outer),
55+
SkwasmImageFilter.fromUiFilter(inner),
56+
);
6257

6358
staticfinalSkwasmFinalizationRegistry<RawImageFilter> _registry=
6459
SkwasmFinalizationRegistry<RawImageFilter>(imageFilterDispose);
@@ -71,32 +66,161 @@ class SkwasmImageFilter extends SkwasmObjectWrapper<RawImageFilter> implements S
7166
});
7267
}
7368

74-
classSkwasmColorFilterextendsSkwasmObjectWrapper<RawColorFilter> {
75-
SkwasmColorFilter._(ColorFilterHandle handle):super(handle, _registry);
69+
classSkwasmBlurFilterextendsSkwasmImageFilter {
70+
SkwasmBlurFilter(
71+
this.sigmaX,
72+
this.sigmaY,
73+
this.tileMode,
74+
):super(imageFilterCreateBlur(sigmaX, sigmaY, tileMode.index));
75+
76+
finaldouble sigmaX;
77+
finaldouble sigmaY;
78+
ui.TileMode tileMode;
79+
80+
@override
81+
StringtoString()=>'ImageFilter.blur($sigmaX, $sigmaY, ${tileModeString(tileMode)})';
82+
}
83+
84+
classSkwasmDilateFilterextendsSkwasmImageFilter {
85+
SkwasmDilateFilter(
86+
this.radiusX,
87+
this.radiusY,
88+
):super(imageFilterCreateDilate(radiusX, radiusY));
89+
90+
finaldouble radiusX;
91+
finaldouble radiusY;
92+
93+
@override
94+
StringtoString()=>'ImageFilter.dilate($radiusX, $radiusY)';
95+
}
96+
97+
classSkwasmErodeFilterextendsSkwasmImageFilter {
98+
SkwasmErodeFilter(
99+
this.radiusX,
100+
this.radiusY,
101+
):super(imageFilterCreateErode(radiusX, radiusY));
102+
103+
finaldouble radiusX;
104+
finaldouble radiusY;
105+
106+
@override
107+
StringtoString()=>'ImageFilter.erode($radiusX, $radiusY)';
108+
}
109+
110+
classSkwasmMatrixFilterextendsSkwasmImageFilter {
111+
SkwasmMatrixFilter(
112+
this.matrix4,
113+
this.filterQuality,
114+
):super(withStackScope((StackScope scope)=>imageFilterCreateMatrix(
115+
scope.convertMatrix4toSkMatrix(matrix4),
116+
filterQuality.index,
117+
)));
118+
119+
finalFloat64List matrix4;
120+
final ui.FilterQuality filterQuality;
121+
122+
@override
123+
StringtoString()=>'ImageFilter.matrix($matrix4, $filterQuality)';
124+
}
125+
126+
classSkwasmColorImageFilterextendsSkwasmImageFilter {
127+
SkwasmColorImageFilter(
128+
this.filter,
129+
):super(imageFilterCreateFromColorFilter(filter.handle));
130+
131+
finalSkwasmColorFilter filter;
132+
133+
@override
134+
StringtoString()=> filter.toString();
135+
}
136+
137+
classSkwasmComposedImageFilterextendsSkwasmImageFilter {
138+
SkwasmComposedImageFilter(
139+
this.outer,
140+
this.inner,
141+
):super(imageFilterCompose(outer.handle, inner.handle));
142+
143+
finalSkwasmImageFilter outer;
144+
finalSkwasmImageFilter inner;
145+
146+
@override
147+
StringtoString()=>'ImageFilter.compose($outer, $inner)';
148+
}
149+
150+
abstractclassSkwasmColorFilterextendsSkwasmObjectWrapper<RawColorFilter> {
151+
SkwasmColorFilter(ColorFilterHandle handle):super(handle, _registry);
76152

77153
factorySkwasmColorFilter.fromEngineColorFilter(EngineColorFilter colorFilter)=>
78154
switch (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-
finalPointer<Float> nativeMatrix= scope.convertDoublesToNative(colorFilter.matrix!);
87-
returnSkwasmColorFilter._(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

91161
factorySkwasmColorFilter.composed(
92162
SkwasmColorFilter outer,
93163
SkwasmColorFilter inner,
94-
)=>SkwasmColorFilter._(colorFilterCompose(outer.handle, inner.handle));
164+
)=>SkwasmComposedColorFilter(outer, inner);
95165

96166
staticfinalSkwasmFinalizationRegistry<RawColorFilter> _registry=
97167
SkwasmFinalizationRegistry<RawColorFilter>(colorFilterDispose);
98168
}
99169

170+
classSkwasmModeColorFilterextendsSkwasmColorFilter {
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+
StringtoString()=>'ColorFilter.mode($color, $blendMode)';
184+
}
185+
186+
classSkwasmLinearToSrgbGammaColorFilterextendsSkwasmColorFilter {
187+
SkwasmLinearToSrgbGammaColorFilter():super(colorFilterCreateLinearToSRGBGamma());
188+
189+
@override
190+
StringtoString()=>'ColorFilter.linearToSrgbGamma()';
191+
}
192+
193+
classSkwasmSrgbToLinearGammaColorFilterextendsSkwasmColorFilter {
194+
SkwasmSrgbToLinearGammaColorFilter():super(colorFilterCreateSRGBToLinearGamma());
195+
196+
@override
197+
StringtoString()=>'ColorFilter.srgbToLinearGamma()';
198+
}
199+
200+
classSkwasmMatrixColorFilterextendsSkwasmColorFilter {
201+
SkwasmMatrixColorFilter(this.matrix):super(withStackScope((StackScope scope)=>
202+
colorFilterCreateMatrix(scope.convertDoublesToNative(matrix))
203+
));
204+
205+
finalList<double> matrix;
206+
207+
@override
208+
StringtoString()=>'ColorFilter.matrix($matrix)';
209+
}
210+
211+
classSkwasmComposedColorFilterextendsSkwasmColorFilter {
212+
SkwasmComposedColorFilter(
213+
this.outer,
214+
this.inner,
215+
):super(colorFilterCompose(outer.handle, inner.handle));
216+
217+
finalSkwasmColorFilter outer;
218+
finalSkwasmColorFilter inner;
219+
220+
@override
221+
StringtoString()=>'ColorFilter.compose($outer, $inner)';
222+
}
223+
100224
classSkwasmMaskFilterextendsSkwasmObjectWrapper<RawMaskFilter> {
101225
SkwasmMaskFilter._(MaskFilterHandle handle):super(handle, _registry);
102226

‎lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart‎

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ import 'package:ui/ui.dart' as ui;
1111
classSkwasmPaintextendsSkwasmObjectWrapper<RawPaint>implements ui.Paint {
1212
SkwasmPaint():super(paintCreate(), _registry);
1313

14+
// Must be kept in sync with the default in paint.cc.
15+
staticconstdouble _kStrokeMiterLimitDefault=4.0;
16+
17+
// Must be kept in sync with the default in paint.cc.
18+
staticconstint _kColorDefault=0xFF000000;
19+
20+
// Must be kept in sync with the default in paint.cc.
21+
staticfinalint _kBlendModeDefault= ui.BlendMode.srcOver.index;
22+
1423
staticfinalSkwasmFinalizationRegistry<RawPaint> _registry=
1524
SkwasmFinalizationRegistry<RawPaint>(paintDispose);
1625

@@ -173,7 +182,73 @@ class SkwasmPaint extends SkwasmObjectWrapper<RawPaint> implements ui.Paint {
173182
_setEffectiveColorFilter();
174183
}
175184

176-
// TODO(yjbanov): https://github.com/flutter/flutter/issues/141639
177185
@override
178-
StringtoString()=>'Paint()';
186+
StringtoString() {
187+
String resultString='Paint()';
188+
189+
assert(() {
190+
finalStringBuffer result=StringBuffer();
191+
String semicolon='';
192+
result.write('Paint(');
193+
if (style== ui.PaintingStyle.stroke) {
194+
result.write('$style');
195+
if (strokeWidth!=0.0) {
196+
result.write(' ${strokeWidth.toStringAsFixed(1)}');
197+
}else {
198+
result.write(' hairline');
199+
}
200+
if (strokeCap!= ui.StrokeCap.butt) {
201+
result.write(' $strokeCap');
202+
}
203+
if (strokeJoin== ui.StrokeJoin.miter) {
204+
if (strokeMiterLimit!= _kStrokeMiterLimitDefault) {
205+
result.write(' $strokeJoin up to ${strokeMiterLimit.toStringAsFixed(1)}');
206+
}
207+
}else {
208+
result.write(' $strokeJoin');
209+
}
210+
semicolon='; ';
211+
}
212+
if (!isAntiAlias) {
213+
result.write('${semicolon}antialias off');
214+
semicolon='; ';
215+
}
216+
if (color!=const ui.Color(_kColorDefault)) {
217+
result.write('$semicolon$color');
218+
semicolon='; ';
219+
}
220+
if (blendMode.index!= _kBlendModeDefault) {
221+
result.write('$semicolon$blendMode');
222+
semicolon='; ';
223+
}
224+
if (colorFilter!=null) {
225+
result.write('${semicolon}colorFilter: $colorFilter');
226+
semicolon='; ';
227+
}
228+
if (maskFilter!=null) {
229+
result.write('${semicolon}maskFilter: $maskFilter');
230+
semicolon='; ';
231+
}
232+
if (filterQuality!= ui.FilterQuality.none) {
233+
result.write('${semicolon}filterQuality: $filterQuality');
234+
semicolon='; ';
235+
}
236+
if (shader!=null) {
237+
result.write('${semicolon}shader: $shader');
238+
semicolon='; ';
239+
}
240+
if (imageFilter!=null) {
241+
result.write('${semicolon}imageFilter: $imageFilter');
242+
semicolon='; ';
243+
}
244+
if (invertColors) {
245+
result.write('${semicolon}invert: $invertColors');
246+
}
247+
result.write(')');
248+
resultString= result.toString();
249+
returntrue;
250+
}());
251+
252+
return resultString;
253+
}
179254
}

‎lib/web_ui/skwasm/paint.cpp‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ SKWASM_EXPORT void paint_setMiterLimit(SkPaint* paint, SkScalar miterLimit) {
8282
paint->setStrokeMiter(miterLimit);
8383
}
8484

85-
SKWASM_EXPORT SkScalarpaint_getMiterLImit(SkPaint* paint) {
85+
SKWASM_EXPORT SkScalarpaint_getMiterLimit(SkPaint* paint) {
8686
return paint->getStrokeMiter();
8787
}
8888

‎lib/web_ui/test/ui/paint_test.dart‎

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:test/test.dart';
77
import'package:ui/ui.dart'as ui;
88

99
import'../common/test_initialization.dart';
10-
import'utils.dart';
1110

1211
voidmain() {
1312
internalBootstrapBrowserTest(()=> testMain);
@@ -49,23 +48,18 @@ Future<void> testMain() async {
4948
tileMode: ui.TileMode.mirror,
5049
);
5150

52-
if (!isSkwasm) {
53-
expect(
54-
paint.toString(),
55-
'Paint('
56-
'Color(0xaabbccdd); '
57-
'BlendMode.darken; '
58-
'colorFilter: ColorFilter.linearToSrgbGamma(); '
59-
'maskFilter: MaskFilter.blur(BlurStyle.normal, 1.7); '
60-
'filterQuality: FilterQuality.high; '
61-
'shader: Gradient(); '
62-
'imageFilter: ImageFilter.blur(1.9, 2.1, mirror); '
63-
'invert: true'
64-
')',
65-
);
66-
}else {
67-
// TODO(yjbanov): https://github.com/flutter/flutter/issues/141639
68-
expect(paint.toString(),'Paint()');
69-
}
51+
expect(
52+
paint.toString(),
53+
'Paint('
54+
'Color(0xaabbccdd); '
55+
'BlendMode.darken; '
56+
'colorFilter: ColorFilter.linearToSrgbGamma(); '
57+
'maskFilter: MaskFilter.blur(BlurStyle.normal, 1.7); '
58+
'filterQuality: FilterQuality.high; '
59+
'shader: Gradient(); '
60+
'imageFilter: ImageFilter.blur(1.9, 2.1, mirror); '
61+
'invert: true'
62+
')',
63+
);
7064
});
7165
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2026 Movatter.jp