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

Commit 790457a

Browse files
authored
Move parts to libraries (#26054)
1 parent 5d3dde5 commit 790457a

File tree

6 files changed

+605
-529
lines changed

6 files changed

+605
-529
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/clip.dart
493493
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/color_filter.dart
494494
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/debug_canvas_reuse_overlay.dart
495495
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/image_filter.dart
496+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/offscreen_canvas.dart
496497
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/offset.dart
497498
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/opacity.dart
498499
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/painting.dart
@@ -518,6 +519,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/normalized_gradien
518519
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/shader.dart
519520
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/shader_builder.dart
520521
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/vertex_shaders.dart
522+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/webgl_context.dart
521523
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/surface.dart
522524
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/surface_stats.dart
523525
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/transform.dart

lib/web_ui/lib/src/engine.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ export 'engine/browser_detection.dart';
4141
import 'engine/html_image_codec.dart';
4242
export 'engine/html_image_codec.dart';
4343

44+
import 'engine/html/offscreen_canvas.dart';
45+
export 'engine/html/offscreen_canvas.dart';
46+
4447
import 'engine/html/painting.dart';
4548
export 'engine/html/painting.dart';
4649

@@ -83,6 +86,9 @@ export 'engine/html/shaders/shader_builder.dart';
8386
import 'engine/html/shaders/vertex_shaders.dart';
8487
export 'engine/html/shaders/vertex_shaders.dart';
8588

89+
import 'engine/html/shaders/webgl_context.dart';
90+
export 'engine/html/shaders/webgl_context.dart';
91+
8692
import 'engine/mouse_cursor.dart';
8793
export 'engine/mouse_cursor.dart';
8894

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
// Copyright 2013 The Flutter Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
import 'dart:async';
6+
import 'dart:html' as html;
7+
import 'dart:js_util' as js_util;
8+
import 'package:ui/src/engine.dart';
9+
10+
/// Polyfill for html.OffscreenCanvas that is not supported on some browsers.
11+
class OffScreenCanvas {
12+
html.OffscreenCanvas? offScreenCanvas;
13+
html.CanvasElement? canvasElement;
14+
int width;
15+
int height;
16+
static bool? _supported;
17+
18+
OffScreenCanvas(this.width, this.height) {
19+
if (OffScreenCanvas.supported) {
20+
offScreenCanvas = html.OffscreenCanvas(width, height);
21+
} else {
22+
canvasElement = html.CanvasElement(
23+
width: width,
24+
height: height,
25+
);
26+
canvasElement!.className = 'gl-canvas';
27+
final double cssWidth = width / EnginePlatformDispatcher.browserDevicePixelRatio;
28+
final double cssHeight = height / EnginePlatformDispatcher.browserDevicePixelRatio;
29+
canvasElement!.style
30+
..position = 'absolute'
31+
..width = '${cssWidth}px'
32+
..height = '${cssHeight}px';
33+
}
34+
}
35+
36+
void dispose() {
37+
offScreenCanvas = null;
38+
canvasElement = null;
39+
}
40+
41+
/// Returns CanvasRenderContext2D or OffscreenCanvasRenderingContext2D to
42+
/// paint into.
43+
Object? getContext2d() {
44+
return (offScreenCanvas != null
45+
? offScreenCanvas!.getContext('2d')
46+
: canvasElement!.getContext('2d'));
47+
}
48+
49+
/// Feature detection for transferToImageBitmap on OffscreenCanvas.
50+
bool get transferToImageBitmapSupported =>
51+
js_util.hasProperty(offScreenCanvas!, 'transferToImageBitmap');
52+
53+
/// Creates an ImageBitmap object from the most recently rendered image
54+
/// of the OffscreenCanvas.
55+
///
56+
/// !Warning API still in experimental status, feature detect before using.
57+
Object? transferToImageBitmap() {
58+
return js_util.callMethod(offScreenCanvas!, 'transferToImageBitmap',
59+
<dynamic>[]);
60+
}
61+
62+
/// Draws canvas contents to a rendering context.
63+
void transferImage(Object targetContext) {
64+
// Actual size of canvas may be larger than viewport size. Use
65+
// source/destination to draw part of the image data.
66+
js_util.callMethod(targetContext, 'drawImage',
67+
<dynamic>[offScreenCanvas ?? canvasElement!, 0, 0, width, height,
68+
0, 0, width, height]);
69+
}
70+
71+
/// Converts canvas contents to an image and returns as data url.
72+
Future<String> toDataUrl() {
73+
final Completer<String> completer = Completer<String>();
74+
if (offScreenCanvas != null) {
75+
offScreenCanvas!.convertToBlob().then((html.Blob value) {
76+
final fileReader = html.FileReader();
77+
fileReader.onLoad.listen((event) {
78+
completer.complete(js_util.getProperty(
79+
js_util.getProperty(event, 'target')!, 'result')!);
80+
});
81+
fileReader.readAsDataUrl(value);
82+
});
83+
return completer.future;
84+
} else {
85+
return Future.value(canvasElement!.toDataUrl());
86+
}
87+
}
88+
89+
/// Draws an image to canvas for both offscreen canvas canvas context2d.
90+
void drawImage(Object image, int x, int y, int width, int height) {
91+
js_util.callMethod(
92+
getContext2d()!, 'drawImage', <dynamic>[image, x, y, width, height]);
93+
}
94+
95+
/// Feature detects OffscreenCanvas.
96+
static bool get supported => _supported ??=
97+
js_util.hasProperty(html.window, 'OffscreenCanvas');
98+
}

0 commit comments

Comments
 (0)