blob: b4deb9a6dac694e63da8e82f9a9579da1432e259 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:ui/src/engine.dart';
import 'package:ui/ui.dart' as ui;
class SurfaceScene implements ui.Scene {
/// This class is created by the engine, and should not be instantiated
/// or extended directly.
///
/// To create a Scene object, use a [SceneBuilder].
SurfaceScene(this.webOnlyRootElement, {
required this.timingRecorder,
});
final DomElement? webOnlyRootElement;
final FrameTimingRecorder? timingRecorder;
/// Creates a raster image representation of the current state of the scene.
/// This is a slow operation that is performed on a background thread.
@override
Future<ui.Image> toImage(int width, int height) {
throw UnsupportedError('toImage is not supported on the Web');
}
@override
ui.Image toImageSync(int width, int height) {
throw UnsupportedError('toImageSync is not supported on the Web');
}
/// Releases the resources used by this scene.
///
/// After calling this function, the scene is cannot be used further.
@override
void dispose() {}
}
/// A surface that creates a DOM element for whole app.
class PersistedScene extends PersistedContainerSurface {
PersistedScene(PersistedScene? super.oldLayer) {
transform = Matrix4.identity();
}
@override
void recomputeTransformAndClip() {
// Must be the true DPR from the browser, nothing overridable.
// See: https://github.com/flutter/flutter/issues/143124
final double browserDpr = EngineFlutterDisplay.instance.browserDevicePixelRatio;
// The scene clip is the size of the entire window **in Logical pixels**.
//
// Even though the majority of the engine uses `physicalSize`, there are some
// bits (like the HTML renderer, or dynamic view sizing) that are implemented
// using CSS, and CSS operates in logical pixels.
//
// See also: [EngineFlutterView.resize].
final ui.Size bounds = window.physicalSize / browserDpr;
localClipBounds = ui.Rect.fromLTRB(0, 0, bounds.width, bounds.height);
projectedClip = null;
}
/// Cached inverse of transform on this node. Unlike transform, this
/// Matrix only contains local transform (not chain multiplied since root).
Matrix4? _localTransformInverse;
@override
Matrix4? get localTransformInverse =>
_localTransformInverse ??= Matrix4.identity();
@override
DomElement createElement() {
return defaultCreateElement('flt-scene');
}
@override
void apply() {}
}