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

Commit 780c6fc

Browse files
committed
[web:canvaskit] switch to temporary SkPaint objects
1 parent 5aed693 commit 780c6fc

File tree

8 files changed

+167
-246
lines changed

8 files changed

+167
-246
lines changed

lib/web_ui/lib/painting.dart

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -325,14 +325,6 @@ abstract class Paint {
325325
factory Paint() => engine.renderer.createPaint();
326326

327327
factory Paint.from(Paint other) {
328-
// This is less efficient than copying the underlying buffer or object but
329-
// it's a reasonable default, as if a user wanted to implement a copy of a
330-
// paint object themselves they are unable to do much better than this.
331-
//
332-
// TODO(matanlurey): Web team, if important to optimize, could:
333-
// 1. Add a `engine.renderer.copyPaint` method.
334-
// 2. Use the below code as the default implementation.
335-
// 3. Have renderer-specific implementations override with optimized code.
336328
final Paint paint = Paint();
337329
paint
338330
..blendMode = other.blendMode

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

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,16 @@ class CkCanvas {
8080
CkPaint paint,
8181
) {
8282
const double toDegrees = 180 / math.pi;
83+
84+
final skPaint = paint.toSkPaint();
8385
skCanvas.drawArc(
8486
toSkRect(oval),
8587
startAngle * toDegrees,
8688
sweepAngle * toDegrees,
8789
useCenter,
88-
paint.skiaObject,
90+
skPaint,
8991
);
92+
skPaint.delete();
9093
}
9194

9295
// TODO(flar): CanvasKit does not expose sampling options available on SkCanvas.drawAtlas
@@ -98,23 +101,27 @@ class CkCanvas {
98101
Uint32List? colors,
99102
ui.BlendMode blendMode,
100103
) {
104+
final skPaint = paint.toSkPaint();
101105
skCanvas.drawAtlas(
102106
atlas.skImage,
103107
rects,
104108
rstTransforms,
105-
paint.skiaObject,
109+
skPaint,
106110
toSkBlendMode(blendMode),
107111
colors,
108112
);
113+
skPaint.delete();
109114
}
110115

111116
void drawCircle(ui.Offset c, double radius, CkPaint paint) {
117+
final skPaint = paint.toSkPaint();
112118
skCanvas.drawCircle(
113119
c.dx,
114120
c.dy,
115121
radius,
116-
paint.skiaObject,
122+
skPaint,
117123
);
124+
skPaint.delete();
118125
}
119126

120127
void drawColor(ui.Color color, ui.BlendMode blendMode) {
@@ -125,23 +132,26 @@ class CkCanvas {
125132
}
126133

127134
void drawDRRect(ui.RRect outer, ui.RRect inner, CkPaint paint) {
135+
final skPaint = paint.toSkPaint();
128136
skCanvas.drawDRRect(
129137
toSkRRect(outer),
130138
toSkRRect(inner),
131-
paint.skiaObject,
139+
skPaint,
132140
);
141+
skPaint.delete();
133142
}
134143

135144
void drawImage(CkImage image, ui.Offset offset, CkPaint paint) {
136145
final ui.FilterQuality filterQuality = paint.filterQuality;
146+
final skPaint = paint.toSkPaint();
137147
if (filterQuality == ui.FilterQuality.high) {
138148
skCanvas.drawImageCubic(
139149
image.skImage,
140150
offset.dx,
141151
offset.dy,
142152
_kMitchellNetravali_B,
143153
_kMitchellNetravali_C,
144-
paint.skiaObject,
154+
skPaint,
145155
);
146156
} else {
147157
skCanvas.drawImageOptions(
@@ -150,21 +160,23 @@ class CkCanvas {
150160
offset.dy,
151161
toSkFilterMode(filterQuality),
152162
toSkMipmapMode(filterQuality),
153-
paint.skiaObject,
163+
skPaint,
154164
);
155165
}
166+
skPaint.delete();
156167
}
157168

158169
void drawImageRect(CkImage image, ui.Rect src, ui.Rect dst, CkPaint paint) {
159170
final ui.FilterQuality filterQuality = paint.filterQuality;
171+
final skPaint = paint.toSkPaint();
160172
if (filterQuality == ui.FilterQuality.high) {
161173
skCanvas.drawImageRectCubic(
162174
image.skImage,
163175
toSkRect(src),
164176
toSkRect(dst),
165177
_kMitchellNetravali_B,
166178
_kMitchellNetravali_C,
167-
paint.skiaObject,
179+
skPaint,
168180
);
169181
} else {
170182
skCanvas.drawImageRectOptions(
@@ -173,41 +185,50 @@ class CkCanvas {
173185
toSkRect(dst),
174186
toSkFilterMode(filterQuality),
175187
toSkMipmapMode(filterQuality),
176-
paint.skiaObject,
188+
skPaint,
177189
);
178190
}
191+
skPaint.delete();
179192
}
180193

181194
void drawImageNine(
182195
CkImage image, ui.Rect center, ui.Rect dst, CkPaint paint) {
196+
final skPaint = paint.toSkPaint();
183197
skCanvas.drawImageNine(
184198
image.skImage,
185199
toSkRect(center),
186200
toSkRect(dst),
187201
toSkFilterMode(paint.filterQuality),
188-
paint.skiaObject,
202+
skPaint,
189203
);
204+
skPaint.delete();
190205
}
191206

192207
void drawLine(ui.Offset p1, ui.Offset p2, CkPaint paint) {
208+
final skPaint = paint.toSkPaint();
193209
skCanvas.drawLine(
194210
p1.dx,
195211
p1.dy,
196212
p2.dx,
197213
p2.dy,
198-
paint.skiaObject,
214+
skPaint,
199215
);
216+
skPaint.delete();
200217
}
201218

202219
void drawOval(ui.Rect rect, CkPaint paint) {
220+
final skPaint = paint.toSkPaint();
203221
skCanvas.drawOval(
204222
toSkRect(rect),
205-
paint.skiaObject,
223+
skPaint,
206224
);
225+
skPaint.delete();
207226
}
208227

209228
void drawPaint(CkPaint paint) {
210-
skCanvas.drawPaint(paint.skiaObject);
229+
final skPaint = paint.toSkPaint();
230+
skCanvas.drawPaint(skPaint);
231+
skPaint.delete();
211232
}
212233

213234
void drawParagraph(CkParagraph paragraph, ui.Offset offset) {
@@ -219,7 +240,9 @@ class CkCanvas {
219240
}
220241

221242
void drawPath(CkPath path, CkPaint paint) {
222-
skCanvas.drawPath(path.skiaObject, paint.skiaObject);
243+
final skPaint = paint.toSkPaint();
244+
skCanvas.drawPath(path.skiaObject, skPaint);
245+
skPaint.delete();
223246
}
224247

225248
void drawPicture(CkPicture picture) {
@@ -228,22 +251,28 @@ class CkCanvas {
228251
}
229252

230253
void drawPoints(CkPaint paint, ui.PointMode pointMode, Float32List points) {
254+
final skPaint = paint.toSkPaint();
231255
skCanvas.drawPoints(
232256
toSkPointMode(pointMode),
233257
points,
234-
paint.skiaObject,
258+
skPaint,
235259
);
260+
skPaint.delete();
236261
}
237262

238263
void drawRRect(ui.RRect rrect, CkPaint paint) {
264+
final skPaint = paint.toSkPaint();
239265
skCanvas.drawRRect(
240266
toSkRRect(rrect),
241-
paint.skiaObject,
267+
skPaint,
242268
);
269+
skPaint.delete();
243270
}
244271

245272
void drawRect(ui.Rect rect, CkPaint paint) {
246-
skCanvas.drawRect(toSkRect(rect), paint.skiaObject);
273+
final skPaint = paint.toSkPaint();
274+
skCanvas.drawRect(toSkRect(rect), skPaint);
275+
skPaint.delete();
247276
}
248277

249278
void drawShadow(
@@ -254,11 +283,13 @@ class CkCanvas {
254283

255284
void drawVertices(
256285
CkVertices vertices, ui.BlendMode blendMode, CkPaint paint) {
286+
final skPaint = paint.toSkPaint();
257287
skCanvas.drawVertices(
258288
vertices.skiaObject,
259289
toSkBlendMode(blendMode),
260-
paint.skiaObject,
290+
skPaint,
261291
);
292+
skPaint.delete();
262293
}
263294

264295
void restore() {
@@ -278,16 +309,20 @@ class CkCanvas {
278309
}
279310

280311
void saveLayer(ui.Rect bounds, CkPaint? paint) {
312+
final skPaint = paint?.toSkPaint();
281313
skCanvas.saveLayer(
282-
paint?.skiaObject,
314+
skPaint,
283315
toSkRect(bounds),
284316
null,
285317
null,
286318
);
319+
skPaint?.delete();
287320
}
288321

289322
void saveLayerWithoutBounds(CkPaint? paint) {
290-
skCanvas.saveLayer(paint?.skiaObject, null, null, null);
323+
final skPaint = paint?.toSkPaint();
324+
skCanvas.saveLayer(skPaint, null, null, null);
325+
skPaint?.delete();
291326
}
292327

293328
void saveLayerWithFilter(ui.Rect bounds, ui.ImageFilter filter,
@@ -299,12 +334,14 @@ class CkCanvas {
299334
convertible = filter as CkManagedSkImageFilterConvertible;
300335
}
301336
convertible.imageFilter((SkImageFilter filter) {
337+
final skPaint = paint?.toSkPaint();
302338
skCanvas.saveLayer(
303-
paint?.skiaObject,
339+
skPaint,
304340
toSkRect(bounds),
305341
filter,
306342
0,
307343
);
344+
skPaint?.delete();
308345
});
309346
}
310347

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,6 @@ CkImage scaleImage(SkImage image, int? targetWidth, int? targetHeight) {
300300
ui.Rect.fromLTWH(0, 0, targetWidth!.toDouble(), targetHeight!.toDouble()),
301301
paint,
302302
);
303-
paint.dispose();
304303

305304
final CkPicture picture = recorder.endRecording();
306305
final ui.Image finalImage = picture.toImageSync(targetWidth, targetHeight);

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ class BackdropFilterEngineLayer extends ContainerLayer
187187
// single canvas, the backdrop filter will be applied multiple times.
188188
final CkCanvas currentCanvas = paintContext.leafNodesCanvas!;
189189
currentCanvas.saveLayerWithFilter(paintBounds, _filter, paint);
190-
paint.dispose();
191190
paintChildren(paintContext);
192191
currentCanvas.restore();
193192
}
@@ -349,7 +348,6 @@ class OpacityEngineLayer extends ContainerLayer
349348
final ui.Rect saveLayerBounds = paintBounds.shift(-_offset);
350349

351350
paintContext.internalNodesCanvas.saveLayer(saveLayerBounds, paint);
352-
paint.dispose();
353351
paintChildren(paintContext);
354352
// Restore twice: once for the translate and once for the saveLayer.
355353
paintContext.internalNodesCanvas.restore();
@@ -442,7 +440,6 @@ class ImageFilterEngineLayer extends ContainerLayer
442440
final CkPaint paint = CkPaint();
443441
paint.imageFilter = _filter;
444442
paintContext.internalNodesCanvas.saveLayer(paintBounds, paint);
445-
paint.dispose();
446443
paintChildren(paintContext);
447444
paintContext.internalNodesCanvas.restore();
448445
paintContext.internalNodesCanvas.restore();
@@ -479,7 +476,6 @@ class ShaderMaskEngineLayer extends ContainerLayer
479476

480477
paintContext.leafNodesCanvas!.drawRect(
481478
ui.Rect.fromLTWH(0, 0, maskRect.width, maskRect.height), paint);
482-
paint.dispose();
483479
paintContext.leafNodesCanvas!.restore();
484480

485481
paintContext.internalNodesCanvas.restore();
@@ -547,7 +543,6 @@ class ColorFilterEngineLayer extends ContainerLayer
547543
paintChildren(paintContext);
548544
paintContext.internalNodesCanvas.restore();
549545
paintContext.internalNodesCanvas.restore();
550-
paint.dispose();
551546
}
552547
}
553548

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

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,14 @@
55
import 'package:ui/ui.dart' as ui;
66

77
import 'canvaskit_api.dart';
8-
import 'native_memory.dart';
98

10-
/// The CanvasKit implementation of [ui.MaskFilter].
11-
class CkMaskFilter {
12-
CkMaskFilter.blur(ui.BlurStyle blurStyle, double sigma)
13-
: _blurStyle = blurStyle,
14-
_sigma = sigma {
15-
final SkMaskFilter skMaskFilter = canvasKit.MaskFilter.MakeBlur(
16-
toSkBlurStyle(_blurStyle),
17-
_sigma,
18-
true,
19-
)!;
20-
_ref = UniqueRef<SkMaskFilter>(this, skMaskFilter, 'MaskFilter');
21-
}
22-
23-
final ui.BlurStyle _blurStyle;
24-
final double _sigma;
25-
26-
late final UniqueRef<SkMaskFilter> _ref;
27-
28-
SkMaskFilter get skiaObject => _ref.nativeObject;
9+
/// Creates and returns a [SkMaskFilter] that applies a blur effect.
10+
///
11+
/// It is the responsibility of the caller to delete the returned Skia object.
12+
SkMaskFilter createBlurSkMaskFilter(ui.BlurStyle blurStyle, double sigma) {
13+
return canvasKit.MaskFilter.MakeBlur(
14+
toSkBlurStyle(blurStyle),
15+
sigma,
16+
true,
17+
)!;
2918
}

0 commit comments

Comments
 (0)