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

Commit 9b51a81

Browse files
committed
[web] Migrate Flutter Web DOM usage to JS static interop - 28.
1 parent 4bdfb6e commit 9b51a81

File tree

6 files changed

+85
-58
lines changed

6 files changed

+85
-58
lines changed

lib/web_ui/lib/src/engine/canvas_pool.dart

Lines changed: 41 additions & 46 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 'dart:html' as html;
65
import 'dart:math' as math;
76
import 'dart:typed_data';
87

@@ -46,17 +45,17 @@ import 'window.dart';
4645
/// can be reused, [CanvasPool] will move canvas(s) from pool to reusablePool
4746
/// to prevent reallocation.
4847
class CanvasPool extends _SaveStackTracking {
49-
html.CanvasRenderingContext2D? _context;
48+
DomCanvasRenderingContext2D? _context;
5049
ContextStateHandle? _contextHandle;
5150
final int _widthInBitmapPixels, _heightInBitmapPixels;
5251
// List of canvases that have been allocated and used in this paint cycle.
53-
List<html.CanvasElement>? _activeCanvasList;
52+
List<DomCanvasElement>? _activeCanvasList;
5453
// List of canvases available to reuse from prior paint cycle.
55-
List<html.CanvasElement>? _reusablePool;
54+
List<DomCanvasElement>? _reusablePool;
5655
// Current canvas element or null if marked for lazy allocation.
57-
html.CanvasElement? _canvas;
56+
DomCanvasElement? _canvas;
5857

59-
html.HtmlElement? _rootElement;
58+
DomHTMLElement? _rootElement;
6059
int _saveContextCount = 0;
6160
final double _density;
6261

@@ -65,7 +64,7 @@ class CanvasPool extends _SaveStackTracking {
6564
this._density);
6665

6766
/// Initializes canvas pool to be hosted on a surface.
68-
void mount(html.HtmlElement rootElement) {
67+
void mount(DomHTMLElement rootElement) {
6968
_rootElement = rootElement;
7069
}
7170

@@ -78,8 +77,8 @@ class CanvasPool extends _SaveStackTracking {
7877
}
7978

8079
/// Returns [CanvasRenderingContext2D] api to draw into this canvas.
81-
html.CanvasRenderingContext2D get context {
82-
html.CanvasRenderingContext2D? ctx = _context;
80+
DomCanvasRenderingContext2D get context {
81+
DomCanvasRenderingContext2D? ctx = _context;
8382
if (ctx == null) {
8483
_createCanvas();
8584
ctx = _context!;
@@ -128,7 +127,7 @@ class CanvasPool extends _SaveStackTracking {
128127
if (_canvas != null) {
129128
_restoreContextSave();
130129
_contextHandle!.reset();
131-
_activeCanvasList ??= <html.CanvasElement>[];
130+
_activeCanvasList ??= <DomCanvasElement>[];
132131
_activeCanvasList!.add(_canvas!);
133132
_canvas = null;
134133
_context = null;
@@ -139,7 +138,7 @@ class CanvasPool extends _SaveStackTracking {
139138
void _createCanvas() {
140139
bool requiresClearRect = false;
141140
bool reused = false;
142-
html.CanvasElement? canvas;
141+
DomCanvasElement? canvas;
143142
if (_canvas != null) {
144143
_canvas!.width = 0;
145144
_canvas!.height = 0;
@@ -214,13 +213,13 @@ class CanvasPool extends _SaveStackTracking {
214213
_replayClipStack();
215214
}
216215

217-
html.CanvasElement? _allocCanvas(int width, int height) {
216+
DomCanvasElement? _allocCanvas(int width, int height) {
218217
// The dartdocs for `tryCreateCanvasElement` on why we don't use the
219-
// `html.CanvasElement` constructor.
218+
// `DomCanvasElement` constructor.
220219
return tryCreateCanvasElement(
221220
(width * _density).ceil(),
222221
(height * _density).ceil(),
223-
);
222+
) as DomCanvasElement?;
224223
}
225224

226225
@override
@@ -229,7 +228,7 @@ class CanvasPool extends _SaveStackTracking {
229228

230229
if (_canvas != null) {
231230
// Restore to the state where we have only applied the scaling.
232-
final html.CanvasRenderingContext2D? ctx = _context;
231+
final DomCanvasRenderingContext2D? ctx = _context;
233232
if (ctx != null) {
234233
try {
235234
ctx.font = '';
@@ -247,7 +246,7 @@ class CanvasPool extends _SaveStackTracking {
247246

248247
int _replaySingleSaveEntry(int clipDepth, Matrix4 prevTransform,
249248
Matrix4 transform, List<SaveClipEntry>? clipStack) {
250-
final html.CanvasRenderingContext2D ctx = context;
249+
final DomCanvasRenderingContext2D ctx = context;
251250
if (clipStack != null) {
252251
for (final int clipCount = clipStack.length;
253252
clipDepth < clipCount;
@@ -306,7 +305,7 @@ class CanvasPool extends _SaveStackTracking {
306305

307306
void _replayClipStack() {
308307
// Replay save/clip stack on this canvas now.
309-
final html.CanvasRenderingContext2D ctx = context;
308+
final DomCanvasRenderingContext2D ctx = context;
310309
int clipDepth = 0;
311310
Matrix4 prevTransform = Matrix4.identity();
312311
final int len = _saveStack.length;
@@ -327,7 +326,7 @@ class CanvasPool extends _SaveStackTracking {
327326
if (_canvas != null) {
328327
_restoreContextSave();
329328
_contextHandle!.reset();
330-
_activeCanvasList ??= <html.CanvasElement>[];
329+
_activeCanvasList ??= <DomCanvasElement>[];
331330
_activeCanvasList!.add(_canvas!);
332331
_context = null;
333332
_contextHandle = null;
@@ -344,7 +343,7 @@ class CanvasPool extends _SaveStackTracking {
344343
/// that are reused from last instance can be cleanup.
345344
void endOfPaint() {
346345
if (_reusablePool != null) {
347-
for (final html.CanvasElement e in _reusablePool!) {
346+
for (final DomCanvasElement e in _reusablePool!) {
348347
if (browserEngine == BrowserEngine.webkit) {
349348
e.width = e.height = 0;
350349
}
@@ -366,7 +365,7 @@ class CanvasPool extends _SaveStackTracking {
366365
/// coordinate system, and the pixel ratio is applied such that CSS pixels are
367366
/// translated to bitmap pixels.
368367
void _initializeViewport(bool clearCanvas) {
369-
final html.CanvasRenderingContext2D ctx = context;
368+
final DomCanvasRenderingContext2D ctx = context;
370369
// Save the canvas state with top-level transforms so we can undo
371370
// any clips later when we reuse the canvas.
372371
ctx.save();
@@ -390,7 +389,7 @@ class CanvasPool extends _SaveStackTracking {
390389
EnginePlatformDispatcher.browserDevicePixelRatio * _density;
391390

392391
void _resetTransform() {
393-
final html.CanvasElement? canvas = _canvas;
392+
final DomCanvasElement? canvas = _canvas;
394393
if (canvas != null) {
395394
canvas.style.transformOrigin = '';
396395
canvas.style.transform = '';
@@ -399,7 +398,7 @@ class CanvasPool extends _SaveStackTracking {
399398

400399
/// Returns a "data://" URI containing a representation of the image in this
401400
/// canvas in PNG format.
402-
String toDataUrl() => _canvas?.toDataUrl() ?? '';
401+
String toDataUrl() => _canvas?.toDataURL('image/png') ?? '';
403402

404403
@override
405404
void save() {
@@ -498,7 +497,7 @@ class CanvasPool extends _SaveStackTracking {
498497
}
499498
}
500499

501-
void _clipRect(html.CanvasRenderingContext2D ctx, ui.Rect rect) {
500+
void _clipRect(DomCanvasRenderingContext2D ctx, ui.Rect rect) {
502501
ctx.beginPath();
503502
ctx.rect(rect.left, rect.top, rect.width, rect.height);
504503
ctx.clip();
@@ -512,7 +511,7 @@ class CanvasPool extends _SaveStackTracking {
512511
}
513512
}
514513

515-
void _clipRRect(html.CanvasRenderingContext2D ctx, ui.RRect rrect) {
514+
void _clipRRect(DomCanvasRenderingContext2D ctx, ui.RRect rrect) {
516515
final ui.Path path = ui.Path()..addRRect(rrect);
517516
_runPath(ctx, path as SurfacePath);
518517
ctx.clip();
@@ -522,7 +521,7 @@ class CanvasPool extends _SaveStackTracking {
522521
void clipPath(ui.Path path) {
523522
super.clipPath(path);
524523
if (_canvas != null) {
525-
final html.CanvasRenderingContext2D ctx = context;
524+
final DomCanvasRenderingContext2D ctx = context;
526525
_runPath(ctx, path as SurfacePath);
527526
if (path.fillType == ui.PathFillType.nonZero) {
528527
ctx.clip();
@@ -534,7 +533,7 @@ class CanvasPool extends _SaveStackTracking {
534533

535534
/// Fill a virtually infinite rect with a color and optional blendMode.
536535
void drawColor(ui.Color color, ui.BlendMode blendMode) {
537-
final html.CanvasRenderingContext2D ctx = context;
536+
final DomCanvasRenderingContext2D ctx = context;
538537
contextHandle.blendMode = blendMode;
539538
contextHandle.fillStyle = colorToCssString(color);
540539
contextHandle.strokeStyle = '';
@@ -548,7 +547,7 @@ class CanvasPool extends _SaveStackTracking {
548547

549548
/// Fill a virtually infinite rect with the color.
550549
void fill() {
551-
final html.CanvasRenderingContext2D ctx = context;
550+
final DomCanvasRenderingContext2D ctx = context;
552551
ctx.beginPath();
553552
// We can't use (0, 0, width, height) because the current transform can
554553
// cause it to not fill the entire clip.
@@ -557,7 +556,7 @@ class CanvasPool extends _SaveStackTracking {
557556

558557
/// Draws a line from [p1] to [p2].
559558
void strokeLine(ui.Offset p1, ui.Offset p2) {
560-
final html.CanvasRenderingContext2D ctx = context;
559+
final DomCanvasRenderingContext2D ctx = context;
561560
ctx.beginPath();
562561
final ui.Rect? shaderBounds = contextHandle._shaderBounds;
563562
if (shaderBounds == null) {
@@ -573,7 +572,7 @@ class CanvasPool extends _SaveStackTracking {
573572
/// Draws a set of points with given radius, lines between points or
574573
/// a polygon.
575574
void drawPoints(ui.PointMode pointMode, Float32List points, double radius) {
576-
final html.CanvasRenderingContext2D ctx = context;
575+
final DomCanvasRenderingContext2D ctx = context;
577576
final int len = points.length;
578577
final ui.Rect? shaderBounds = contextHandle._shaderBounds;
579578
final double offsetX = shaderBounds == null ? 0 : -shaderBounds.left;
@@ -611,7 +610,7 @@ class CanvasPool extends _SaveStackTracking {
611610
static Float32List _runBuffer = Float32List(PathRefIterator.kMaxBufferSize);
612611

613612
/// 'Runs' the given [path] by applying all of its commands to the canvas.
614-
void _runPath(html.CanvasRenderingContext2D ctx, SurfacePath path) {
613+
void _runPath(DomCanvasRenderingContext2D ctx, SurfacePath path) {
615614
ctx.beginPath();
616615
final Float32List p = _runBuffer;
617616
final PathRefIterator iter = PathRefIterator(path.pathRef);
@@ -668,7 +667,7 @@ class CanvasPool extends _SaveStackTracking {
668667
/// Applies path to drawing context, preparing for fill and other operations.
669668
///
670669
/// WARNING: Don't refactor _runPath/_runPathWithOffset. Latency sensitive
671-
void _runPathWithOffset(html.CanvasRenderingContext2D ctx, SurfacePath path,
670+
void _runPathWithOffset(DomCanvasRenderingContext2D ctx, SurfacePath path,
672671
double offsetX, double offsetY) {
673672
ctx.beginPath();
674673
final Float32List p = _runBuffer;
@@ -857,7 +856,7 @@ class CanvasPool extends _SaveStackTracking {
857856

858857
void _clearActiveCanvasList() {
859858
if (_activeCanvasList != null) {
860-
for (final html.CanvasElement c in _activeCanvasList!) {
859+
for (final DomCanvasElement c in _activeCanvasList!) {
861860
if (browserEngine == BrowserEngine.webkit) {
862861
c.width = c.height = 0;
863862
}
@@ -874,7 +873,7 @@ class CanvasPool extends _SaveStackTracking {
874873
/// to initialize current values.
875874
class ContextStateHandle {
876875
/// Associated canvas element context tracked by this context state.
877-
final html.CanvasRenderingContext2D context;
876+
final DomCanvasRenderingContext2D context;
878877
final CanvasPool _canvasPool;
879878
/// Dpi of context.
880879
final double density;
@@ -890,7 +889,7 @@ class ContextStateHandle {
890889
Object? _currentStrokeStyle;
891890
double _currentLineWidth = 1.0;
892891

893-
/// See [html.CanvasRenderingContext2D].
892+
/// See [DomCanvasRenderingContext2D].
894893
set blendMode(ui.BlendMode? blendMode) {
895894
if (blendMode != _currentBlendMode) {
896895
_currentBlendMode = blendMode;
@@ -899,7 +898,7 @@ class ContextStateHandle {
899898
}
900899
}
901900

902-
/// See [html.CanvasRenderingContext2D].
901+
/// See [DomCanvasRenderingContext2D].
903902
set strokeCap(ui.StrokeCap? strokeCap) {
904903
strokeCap ??= ui.StrokeCap.butt;
905904
if (strokeCap != _currentStrokeCap) {
@@ -908,15 +907,15 @@ class ContextStateHandle {
908907
}
909908
}
910909

911-
/// See [html.CanvasRenderingContext2D].
910+
/// See [DomCanvasRenderingContext2D].
912911
set lineWidth(double lineWidth) {
913912
if (lineWidth != _currentLineWidth) {
914913
_currentLineWidth = lineWidth;
915914
context.lineWidth = lineWidth;
916915
}
917916
}
918917

919-
/// See [html.CanvasRenderingContext2D].
918+
/// See [DomCanvasRenderingContext2D].
920919
set strokeJoin(ui.StrokeJoin? strokeJoin) {
921920
strokeJoin ??= ui.StrokeJoin.miter;
922921
if (strokeJoin != _currentStrokeJoin) {
@@ -925,15 +924,15 @@ class ContextStateHandle {
925924
}
926925
}
927926

928-
/// See [html.CanvasRenderingContext2D].
927+
/// See [DomCanvasRenderingContext2D].
929928
set fillStyle(Object? colorOrGradient) {
930929
if (!identical(colorOrGradient, _currentFillStyle)) {
931930
_currentFillStyle = colorOrGradient;
932931
context.fillStyle = colorOrGradient;
933932
}
934933
}
935934

936-
/// See [html.CanvasRenderingContext2D].
935+
/// See [DomCanvasRenderingContext2D].
937936
set strokeStyle(Object? colorOrGradient) {
938937
if (!identical(colorOrGradient, _currentStrokeStyle)) {
939938
_currentStrokeStyle = colorOrGradient;
@@ -984,9 +983,7 @@ class ContextStateHandle {
984983
if (paint.shader is EngineGradient) {
985984
final EngineGradient engineShader = paint.shader! as EngineGradient;
986985
final Object paintStyle =
987-
engineShader.createPaintStyle(_canvasPool.context as
988-
DomCanvasRenderingContext2D, shaderBounds,
989-
density);
986+
engineShader.createPaintStyle(_canvasPool.context, shaderBounds, density);
990987
fillStyle = paintStyle;
991988
strokeStyle = paintStyle;
992989
_shaderBounds = shaderBounds;
@@ -995,9 +992,7 @@ class ContextStateHandle {
995992
} else if (paint.shader is EngineImageShader) {
996993
final EngineImageShader imageShader = paint.shader! as EngineImageShader;
997994
final Object paintStyle =
998-
imageShader.createPaintStyle(_canvasPool.context as
999-
DomCanvasRenderingContext2D, shaderBounds,
1000-
density);
995+
imageShader.createPaintStyle(_canvasPool.context, shaderBounds, density);
1001996
fillStyle = paintStyle;
1002997
strokeStyle = paintStyle;
1003998
if (imageShader.requiresTileOffset) {
@@ -1117,7 +1112,7 @@ class ContextStateHandle {
11171112
}
11181113

11191114
/// Resets drawing context state to defaults for
1120-
/// [html.CanvasRenderingContext2D].
1115+
/// [DomCanvasRenderingContext2D].
11211116
void reset() {
11221117
context.fillStyle = '';
11231118
// Read back fillStyle/strokeStyle values from context so that input such

0 commit comments

Comments
 (0)