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

Commit 0a8b615

Browse files
authored
[web] No implicit view in multi-view mode (#48505)
- No implicit view in mult-view mode. - `window.devicePixelRatio` => `EngineFlutterDisplay.instance.devicePixelRatio`. - `window.physicalSize` => `view.physicalSize`. - Remove `LayerTree.frameSize`. - `defaultRouteName` is set to `/` when there's no implicit view. - All routing operations are noops in multi-view mode. With these changes, I was able to run all examples in https://github.com/goderbauer/mvp without an implicit view.
1 parent 74d2df5 commit 0a8b615

13 files changed

Lines changed: 79 additions & 50 deletions

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import 'safe_browser_api.dart';
2626
import 'shadow.dart';
2727
import 'util.dart';
2828
import 'vector_math.dart';
29-
import 'window.dart';
3029

3130
/// Renders picture to a CanvasElement by allocating and caching 0 or more
3231
/// canvas(s) for [BitmapCanvas].
@@ -1039,7 +1038,7 @@ class ContextStateHandle {
10391038
//
10401039
// transformedShadowDelta = M*shadowDelta - M*origin.
10411040
final Float32List tempVector = Float32List(2);
1042-
tempVector[0] = kOutsideTheBoundsOffset * window.devicePixelRatio;
1041+
tempVector[0] = kOutsideTheBoundsOffset * EngineFlutterDisplay.instance.devicePixelRatio;
10431042
_canvasPool.currentTransform.transform2(tempVector);
10441043
final double shadowOffsetX = tempVector[0];
10451044
final double shadowOffsetY = tempVector[1];

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'dart:typed_data';
88
import 'package:ui/ui.dart' as ui;
99

1010
import '../color_filter.dart';
11+
import '../display.dart';
1112
import 'canvaskit_api.dart';
1213
import 'color_filter.dart';
1314
import 'image.dart';
@@ -248,7 +249,7 @@ class CkCanvas {
248249
void drawShadow(
249250
CkPath path, ui.Color color, double elevation, bool transparentOccluder) {
250251
drawSkShadow(skCanvas, path, color, elevation, transparentOccluder,
251-
ui.window.devicePixelRatio);
252+
EngineFlutterDisplay.instance.devicePixelRatio);
252253
}
253254

254255
void drawVertices(

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

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

77
import '../../engine.dart' show PlatformViewManager;
8+
import '../display.dart';
89
import '../dom.dart';
910
import '../html/path_to_svg_clip.dart';
1011
import '../platform_views/slots.dart';
1112
import '../svg.dart';
1213
import '../util.dart';
1314
import '../vector_math.dart';
14-
import '../window.dart';
1515
import 'canvas.dart';
1616
import 'embedded_views_diff.dart';
1717
import 'path.dart';
@@ -68,7 +68,7 @@ class HtmlViewEmbedder {
6868
List<OverlayGroup> _activeOverlayGroups = <OverlayGroup>[];
6969

7070
/// The size of the frame, in physical pixels.
71-
ui.Size _frameSize = ui.window.physicalSize;
71+
late ui.Size _frameSize;
7272

7373
set frameSize(ui.Size size) {
7474
_frameSize = size;
@@ -326,7 +326,7 @@ class HtmlViewEmbedder {
326326
//
327327
// HTML elements use logical (CSS) pixels, but we have been using physical
328328
// pixels, so scale down the head element to match the logical resolution.
329-
final double scale = window.devicePixelRatio;
329+
final double scale = EngineFlutterDisplay.instance.devicePixelRatio;
330330
final double inverseScale = 1 / scale;
331331
final Matrix4 scaleMatrix =
332332
Matrix4.diagonal3Values(inverseScale, inverseScale, 1);

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ class LayerTree {
2121
/// The root of the layer tree.
2222
final RootLayer rootLayer;
2323

24-
/// The size (in physical pixels) of the frame to paint this layer tree into.
25-
final ui.Size frameSize = ui.window.physicalSize;
26-
2724
/// The devicePixelRatio of the frame to paint this layer tree into.
2825
double? devicePixelRatio;
2926

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

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

88
/// A class that can rasterize [LayerTree]s into a given `sceneHost` element.
99
class Rasterizer {
10-
Rasterizer(this.sceneHost);
10+
Rasterizer(this.view);
1111

12-
final DomElement sceneHost;
12+
final EngineFlutterView view;
13+
DomElement get sceneHost => view.dom.sceneHost;
1314
final CompositorContext context = CompositorContext();
1415
final RenderCanvasFactory renderCanvasFactory = RenderCanvasFactory();
1516
late final HtmlViewEmbedder viewEmbedder =
@@ -30,12 +31,13 @@ class Rasterizer {
3031
/// Creates a new frame from this rasterizer's surface, draws the given
3132
/// [LayerTree] into it, and then submits the frame.
3233
void draw(LayerTree layerTree) {
33-
if (layerTree.frameSize.isEmpty) {
34+
final ui.Size frameSize = view.physicalSize;
35+
if (frameSize.isEmpty) {
3436
// Available drawing area is empty. Skip drawing.
3537
return;
3638
}
3739

38-
_currentFrameSize = layerTree.frameSize;
40+
_currentFrameSize = frameSize;
3941
CanvasKitRenderer.instance.offscreenSurface.acquireFrame(_currentFrameSize);
4042
viewEmbedder.frameSize = _currentFrameSize;
4143
final CkPictureRecorder pictureRecorder = CkPictureRecorder();

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import 'dart:js_interop';
66

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

9+
import '../display.dart';
910
import '../dom.dart';
10-
import '../window.dart';
1111

1212
/// A visible (on-screen) canvas that can display bitmaps produced by CanvasKit
1313
/// in the (off-screen) SkSurface which is backed by an OffscreenCanvas.
@@ -68,12 +68,13 @@ class RenderCanvas {
6868
/// match the size of the window precisely we use the most precise floating
6969
/// point value we can get.
7070
void _updateLogicalHtmlCanvasSize() {
71-
final double logicalWidth = _pixelWidth / window.devicePixelRatio;
72-
final double logicalHeight = _pixelHeight / window.devicePixelRatio;
71+
final double devicePixelRatio = EngineFlutterDisplay.instance.devicePixelRatio;
72+
final double logicalWidth = _pixelWidth / devicePixelRatio;
73+
final double logicalHeight = _pixelHeight / devicePixelRatio;
7374
final DomCSSStyleDeclaration style = canvasElement.style;
7475
style.width = '${logicalWidth}px';
7576
style.height = '${logicalHeight}px';
76-
_currentDevicePixelRatio = window.devicePixelRatio;
77+
_currentDevicePixelRatio = devicePixelRatio;
7778
}
7879

7980
/// Render the given [bitmap] with this [RenderCanvas].
@@ -112,7 +113,7 @@ class RenderCanvas {
112113
size.height.ceil() == _pixelHeight) {
113114
// The existing canvas doesn't need to be resized (unless the device pixel
114115
// ratio changed).
115-
if (window.devicePixelRatio != _currentDevicePixelRatio) {
116+
if (EngineFlutterDisplay.instance.devicePixelRatio != _currentDevicePixelRatio) {
116117
_updateLogicalHtmlCanvasSize();
117118
}
118119
return;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,7 @@ class CanvasKitRenderer implements Renderer {
400400

401401
Rasterizer _getRasterizerForView(EngineFlutterView view) {
402402
return _rasterizers.putIfAbsent(view, () {
403-
return Rasterizer(view.dom.sceneHost);
403+
return Rasterizer(view);
404404
});
405405
}
406406

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import '../html_image_codec.dart';
1717
import '../text/canvas_paragraph.dart';
1818
import '../util.dart';
1919
import '../vector_math.dart';
20-
import '../window.dart';
2120
import 'clip.dart';
2221
import 'color_filter.dart';
2322
import 'dom_canvas.dart';
@@ -1036,7 +1035,7 @@ class BitmapCanvas extends EngineCanvas {
10361035
_drawPointsPaint.color = paint.color;
10371036
_drawPointsPaint.maskFilter = paint.maskFilter;
10381037

1039-
final double dpr = ui.window.devicePixelRatio;
1038+
final double dpr = EngineFlutterDisplay.instance.devicePixelRatio;
10401039
// Use hairline (device pixel when strokeWidth is not specified).
10411040
final double strokeWidth =
10421041
paint.strokeWidth == null ? 1.0 / dpr : paint.strokeWidth!;
@@ -1077,7 +1076,7 @@ class BitmapCanvas extends EngineCanvas {
10771076
/// viewport.
10781077
ui.Rect _computeScreenBounds(Matrix4 targetTransform) {
10791078
final Matrix4 inverted = targetTransform.clone()..invert();
1080-
final double dpr = ui.window.devicePixelRatio;
1079+
final double dpr = EngineFlutterDisplay.instance.devicePixelRatio;
10811080
final double width = ui.window.physicalSize.width * dpr;
10821081
final double height = ui.window.physicalSize.height * dpr;
10831082
final Vector3 topLeft = inverted.perspectiveTransform(x: 0, y: 0, z: 0);
@@ -1457,7 +1456,7 @@ String maskFilterToCanvasFilter(ui.MaskFilter? maskFilter) {
14571456
if (maskFilter != null) {
14581457
// Multiply by device-pixel ratio because the canvas' pixel width and height
14591458
// are larger than its CSS width and height by device-pixel ratio.
1460-
return 'blur(${maskFilter.webOnlySigma * window.devicePixelRatio}px)';
1459+
return 'blur(${maskFilter.webOnlySigma * EngineFlutterDisplay.instance.devicePixelRatio}px)';
14611460
} else {
14621461
return 'none';
14631462
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import 'package:ui/ui.dart' as ui;
88
import 'package:ui/ui_web/src/ui_web.dart' as ui_web;
99

1010
import '../../engine.dart' show kProfileApplyFrame, kProfilePrerollFrame;
11+
import '../display.dart';
1112
import '../dom.dart';
1213
import '../picture.dart';
1314
import '../profiler.dart';
1415
import '../util.dart';
1516
import '../vector_math.dart';
16-
import '../window.dart';
1717
import 'backdrop_filter.dart';
1818
import 'clip.dart';
1919
import 'color_filter.dart';
@@ -113,8 +113,8 @@ class SurfaceSceneBuilder implements ui.SceneBuilder {
113113
// scene to devicepixelratio. Use identity instead since CSS uses
114114
// logical device pixels.
115115
if (!ui_web.debugEmulateFlutterTesterEnvironment) {
116-
assert(matrix4[0] == window.devicePixelRatio &&
117-
matrix4[5] == window.devicePixelRatio);
116+
assert(matrix4[0] == EngineFlutterDisplay.instance.devicePixelRatio &&
117+
matrix4[5] == EngineFlutterDisplay.instance.devicePixelRatio);
118118
}
119119
matrix = Matrix4.identity().storage;
120120
} else {

lib/web_ui/lib/src/engine/initialization.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,10 @@ Future<void> initializeEngineUi() async {
218218
_initializationState = DebugEngineInitializationState.initializingUi;
219219

220220
RawKeyboard.initialize(onMacOs: operatingSystem == OperatingSystem.macOs);
221-
ensureImplicitViewInitialized(hostElement: configuration.hostElement);
222-
ensureFlutterViewEmbedderInitialized();
221+
if (!configuration.multiViewEnabled) {
222+
ensureImplicitViewInitialized(hostElement: configuration.hostElement);
223+
ensureFlutterViewEmbedderInitialized();
224+
}
223225
_initializationState = DebugEngineInitializationState.initialized;
224226
}
225227

0 commit comments

Comments
 (0)