From f2be8603db23fd2685c85500bf7087edeb35e228 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 27 Sep 2022 13:03:05 -0700 Subject: [PATCH 01/34] Started porting prototype over. --- lib/web_ui/lib/geometry.dart | 4 + .../engine/skwasm/skwasm_impl/src/canvas.dart | 242 +++++++++++++++ .../engine/skwasm/skwasm_impl/src/image.dart | 43 +++ .../engine/skwasm/skwasm_impl/src/paint.dart | 109 +++++++ .../skwasm/skwasm_impl/src/paragraph.dart | 126 ++++++++ .../engine/skwasm/skwasm_impl/src/path.dart | 279 ++++++++++++++++++ .../skwasm/skwasm_impl/src/picture.dart | 51 ++++ .../skwasm_impl/src/raw/raw_canvas.dart | 104 +++++++ .../skwasm_impl/src/raw/raw_geometry.dart | 7 + .../skwasm_impl/src/raw/raw_memory.dart | 128 ++++++++ .../skwasm/skwasm_impl/src/raw/raw_paint.dart | 64 ++++ .../skwasm/skwasm_impl/src/raw/raw_path.dart | 132 +++++++++ .../skwasm_impl/src/raw/raw_picture.dart | 33 +++ .../skwasm_impl/src/raw/raw_surface.dart | 19 ++ .../skwasm/skwasm_impl/src/surface.dart | 27 ++ .../skwasm/skwasm_impl/src/vertices.dart | 25 ++ lib/web_ui/skwasm/BUILD.gn | 77 +++++ lib/web_ui/skwasm/canvas.cpp | 162 ++++++++++ lib/web_ui/skwasm/export.h | 3 + lib/web_ui/skwasm/helpers.h | 25 ++ lib/web_ui/skwasm/paint.cpp | 76 +++++ lib/web_ui/skwasm/path.cpp | 193 ++++++++++++ lib/web_ui/skwasm/picture.cpp | 34 +++ lib/web_ui/skwasm/surface.cpp | 193 ++++++++++++ lib/web_ui/skwasm/window.cpp | 0 lib/web_ui/skwasm/wrappers.h | 30 ++ 26 files changed, 2186 insertions(+) create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/image.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_geometry.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart create mode 100644 lib/web_ui/skwasm/BUILD.gn create mode 100644 lib/web_ui/skwasm/canvas.cpp create mode 100644 lib/web_ui/skwasm/export.h create mode 100644 lib/web_ui/skwasm/helpers.h create mode 100644 lib/web_ui/skwasm/paint.cpp create mode 100644 lib/web_ui/skwasm/path.cpp create mode 100644 lib/web_ui/skwasm/picture.cpp create mode 100644 lib/web_ui/skwasm/surface.cpp create mode 100644 lib/web_ui/skwasm/window.cpp create mode 100644 lib/web_ui/skwasm/wrappers.h diff --git a/lib/web_ui/lib/geometry.dart b/lib/web_ui/lib/geometry.dart index 7d17c73f14131..b4958d809f996 100644 --- a/lib/web_ui/lib/geometry.dart +++ b/lib/web_ui/lib/geometry.dart @@ -6,6 +6,10 @@ // documentation of APIs. part of ui; +double toDegrees(double radians) { + return radians * 180 / math.pi; +} + abstract class OffsetBase { const OffsetBase(this._dx, this._dy) : assert(_dx != null), diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart new file mode 100644 index 0000000000000..3a71410350be0 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart @@ -0,0 +1,242 @@ +import 'dart:ffi'; +import 'dart:typed_data'; +import 'dart:wasm'; + +import 'package:ui/ui.dart' as ui; + +import 'image.dart'; +import 'paint.dart'; +import 'paragraph.dart'; +import 'path.dart'; +import 'picture.dart'; +import 'raw/raw_canvas.dart'; +import 'raw/raw_memory.dart'; +import 'raw/raw_picture.dart'; +import 'vertices.dart'; + +class SkwasmCanvas implements ui.Canvas { + factory SkwasmCanvas(PictureRecorder recorder, [ui.Rect cullRect = ui.Rect.largest]) { + return SkwasmCanvas.fromHandle(withStackScope((StackScope s) { + return pictureRecorder_beginRecording( + recorder.handle, s.convertRect(cullRect)); + })); + } + + SkwasmCanvas.fromHandle(this._handle); + CanvasHandle _handle; + + void delete() { + canvas_destroy(_handle); + } + + void save() { + canvas_save(_handle); + } + + void saveLayer(ui.Rect? bounds, Paint paint) { + if (bounds != null) { + withStackScope((StackScope s) { + canvas_saveLayer(_handle, s.convertRect(bounds), paint.handle); + }); + } else { + canvas_saveLayer(_handle, nullptr, paint.handle); + } + } + + void restore() { + canvas_restore(_handle); + } + + int getSaveCount() { + return canvas_getSaveCount(_handle).toIntSigned(); + } + + void translate(double dx, double dy) { + canvas_translate(_handle, dx.toWasmF32(), dy.toWasmF32()); + } + + void scale(double sx, [double? sy]) { + canvas_scale(_handle, sx.toWasmF32(), (sy ?? sx).toWasmF32()); + } + + void rotate(double radians) { + canvas_rotate(_handle, ui.toDegrees(radians).toWasmF32()); + } + + void skew(double sx, double sy) { + canvas_skew(_handle, sx.toWasmF32(), sy.toWasmF32()); + } + + void transform(Float64List matrix4) { + withStackScope((StackScope s) { + canvas_transform(_handle, s.convertMatrix4toSkM44(matrix4)); + }); + } + + void clipRect(ui.Rect rect, + {ui.ClipOp clipOp = ui.ClipOp.intersect, bool doAntiAlias = true}) { + withStackScope((StackScope s) { + canvas_clipRect(_handle, s.convertRect(rect), clipOp.index.toWasmI32(), + doAntiAlias.toWasmI32()); + }); + } + + void clipRRect(ui.RRect rrect, {bool doAntialias = true}) { + withStackScope((StackScope s) { + canvas_clipRRect(_handle, s.convertRRect(rrect), doAntialias.toWasmI32()); + }); + } + + void clipPath(Path path, {bool doAntiAlias = true}) { + canvas_clipPath(_handle, path.handle, doAntiAlias.toWasmI32()); + } + + void drawColor(ui.Color color, ui.BlendMode blendMode) { + canvas_drawColor( + _handle, color.value.toWasmI32(), blendMode.index.toWasmI32()); + } + + void drawLine(ui.Offset p1, ui.Offset p2, Paint paint) { + canvas_drawLine(_handle, p1.dx.toWasmF32(), p1.dy.toWasmF32(), + p2.dx.toWasmF32(), p2.dy.toWasmF32(), paint.handle); + } + + void drawPaint(Paint paint) { + canvas_drawPaint(_handle, paint.handle); + } + + void drawRect(ui.Rect rect, Paint paint) { + withStackScope((StackScope s) { + canvas_drawRect(_handle, s.convertRect(rect), paint.handle); + }); + } + + void drawRRect(ui.RRect rrect, Paint paint) { + withStackScope((StackScope s) { + canvas_drawRRect(_handle, s.convertRRect(rrect), paint.handle); + }); + } + + void drawDRRect(ui.RRect outer, ui.RRect inner, Paint paint) { + withStackScope((StackScope s) { + canvas_drawDRRect( + _handle, s.convertRRect(outer), s.convertRRect(inner), paint.handle); + }); + } + + void drawOval(ui.Rect rect, Paint paint) { + withStackScope((StackScope s) { + canvas_drawOval(_handle, s.convertRect(rect), paint.handle); + }); + } + + void drawCircle(ui.Offset center, double radius, Paint paint) { + canvas_drawCircle(_handle, center.dx.toWasmF32(), center.dy.toWasmF32(), + radius.toWasmF32(), paint.handle); + } + + void drawArc(ui.Rect rect, double startAngle, double sweepAngle, bool useCenter, + Paint paint) { + withStackScope((StackScope s) { + canvas_drawArc( + _handle, + s.convertRect(rect), + ui.toDegrees(startAngle).toWasmF32(), + ui.toDegrees(sweepAngle).toWasmF32(), + useCenter.toWasmI32(), + paint.handle); + }); + } + + void drawPath(Path path, Paint paint) { + canvas_drawPath(_handle, path.handle, paint.handle); + } + + void drawImage(Image image, ui.Offset offset, Paint paint) { + throw UnimplementedError(); + } + + void drawImageRect(Image image, ui.Rect src, ui.Rect dst, Paint paint) { + throw UnimplementedError(); + } + + void drawImageNine(Image image, ui.Rect center, ui.Rect dst, Paint paint) { + throw UnimplementedError(); + } + + void drawPicture(Picture picture) { + canvas_drawPicture(_handle, picture.handle); + } + + void drawParagraph(Paragraph paragraph, ui.Offset offset) { + throw UnimplementedError(); + } + + void drawPoints(ui.PointMode pointMode, List points, Paint paint) { + throw UnimplementedError(); + } + + void drawRawPoints(ui.PointMode pointMode, Float32List points, Paint paint) { + throw UnimplementedError(); + } + + void drawVertices(Vertices vertices, ui.BlendMode blendMode, Paint paint) { + throw UnimplementedError(); + } + + void drawAtlas( + Image atlas, + List transforms, + List rects, + List? colors, + ui.BlendMode? blendMode, + ui.Rect? cullRect, + Paint paint, + ) { + throw UnimplementedError(); + } + + void drawRawAtlas( + Image atlas, + Float32List rstTransforms, + Float32List rects, + Int32List? colors, + ui.BlendMode? blendMode, + ui.Rect? cullRect, + Paint paint, + ) { + throw UnimplementedError(); + } + + void drawShadow( + Path path, + ui.Color color, + double elevation, + bool transparentOccluder, + ) { + throw UnimplementedError(); + } + + @override + ui.Rect getDestinationClipBounds() { + // TODO: implement getDestinationClipBounds + throw UnimplementedError(); + } + + @override + ui.Rect getLocalClipBounds() { + // TODO: implement getLocalClipBounds + throw UnimplementedError(); + } + + @override + Float64List getTransform() { + // TODO: implement getTransform + throw UnimplementedError(); + } + + @override + void restoreToCount(int count) { + // TODO: implement restoreToCount + } +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/image.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/image.dart new file mode 100644 index 0000000000000..9c7a10eea1b54 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/image.dart @@ -0,0 +1,43 @@ +import 'dart:typed_data'; + +import 'package:ui/ui.dart' as ui; + +class SkwasmImage implements ui.Image { + @override + int get width { + throw UnimplementedError(); + } + + @override + int get height { + throw UnimplementedError(); + } + + @override + Future toByteData( + {ui.ImageByteFormat format = ui.ImageByteFormat.rawRgba}) { + throw UnimplementedError(); + } + + @override + void dispose() { + throw UnimplementedError(); + } + + @override + bool get debugDisposed { + throw UnimplementedError(); + } + + @override + SkwasmImage clone() => this; + + @override + bool isCloneOf(ui.Image other) => other == this; + + @override + List? debugGetOpenHandleStackTraces() => null; + + @override + String toString() => '[$width\u00D7$height]'; +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart new file mode 100644 index 0000000000000..e216e79601093 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart @@ -0,0 +1,109 @@ +import 'dart:wasm'; + +import 'package:ui/ui.dart' as ui; +import 'raw/raw_paint.dart'; + +class SkwasmPaint implements ui.Paint { + factory SkwasmPaint() { + return SkwasmPaint._fromHandle(paint_create()); + } + + SkwasmPaint._fromHandle(this._handle); + PaintHandle _handle; + + PaintHandle get handle => _handle; + + ui.BlendMode _cachedBlendMode = ui.BlendMode.srcOver; + + @override + ui.BlendMode get blendMode { + return _cachedBlendMode; + } + + @override + set blendMode(ui.BlendMode blendMode) { + if (_cachedBlendMode != blendMode) { + paint_setBlendMode(_handle, blendMode.index.toWasmI32()); + } + } + + @override + ui.PaintingStyle get style { + return ui.PaintingStyle.values[paint_getPaintStyle(_handle).toIntSigned()]; + } + + @override + set style(ui.PaintingStyle style) { + paint_setPaintStyle(_handle, style.index.toWasmI32()); + } + + @override + double get strokeWidth { + return paint_getStrokeWidth(_handle).toDouble(); + } + + @override + set strokeWidth(double width) { + paint_setStrokeWidth(_handle, width.toWasmF32()); + } + + @override + ui.StrokeCap get strokeCap { + return ui.StrokeCap.values[paint_getStrokeCap(_handle).toIntSigned()]; + } + + @override + set strokeCap(ui.StrokeCap cap) { + paint_setStrokeCap(_handle, cap.index.toWasmI32()); + } + + @override + ui.StrokeJoin get strokeJoin { + return ui.StrokeJoin.values[paint_getStrokeJoin(_handle).toIntSigned()]; + } + + @override + set strokeJoin(ui.StrokeJoin join) { + paint_setStrokeJoin(_handle, join.index.toWasmI32()); + } + + @override + bool get isAntiAlias { + return paint_getAntiAlias(_handle).toIntSigned() != 0; + } + @override + set isAntiAlias(bool value) { + paint_setAntiAlias(_handle, value ? 1.toWasmI32() : 0.toWasmI32()); + } + + @override + ui.Color get color { + return ui.Color(paint_getColorInt(_handle).toIntSigned()); + } + + @override + set color(ui.Color color) { + paint_setColorInt(_handle, color.value.toWasmI32()); + } + + @override + ui.ColorFilter? colorFilter; + + @override + ui.FilterQuality filterQuality = ui.FilterQuality.none; + + @override + ui.ImageFilter? imageFilter; + + @override + bool invertColors = false; + + @override + ui.MaskFilter? maskFilter; + + @override + ui.Shader? shader; + + @override + double strokeMiterLimit = 0.0; +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart new file mode 100644 index 0000000000000..33873c8d426ed --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart @@ -0,0 +1,126 @@ +import 'package:ui/ui.dart' as ui; + +class SkwasmLineMetrics implements ui.LineMetrics { + factory SkwasmLineMetrics({ + required bool hardBreak, + required double ascent, + required double descent, + required double unscaledAscent, + required double height, + required double width, + required double left, + required double baseline, + required int lineNumber, + }) { + throw UnimplementedError(); + } + + @override + bool get hardBreak { + throw UnimplementedError(); + } + + @override + double get ascent { + throw UnimplementedError(); + } + + @override + double get descent { + throw UnimplementedError(); + } + + @override + double get unscaledAscent { + throw UnimplementedError(); + } + + @override + double get height { + throw UnimplementedError(); + } + + @override + double get width { + throw UnimplementedError(); + } + + @override + double get left { + throw UnimplementedError(); + } + + @override + double get baseline { + throw UnimplementedError(); + } + + @override + int get lineNumber { + throw UnimplementedError(); + } +} + +class SkwasmParagraph implements ui.Paragraph { + double get width { + throw UnimplementedError(); + } + + double get height { + throw UnimplementedError(); + } + + double get longestLine { + throw UnimplementedError(); + } + + double get minIntrinsicWidth { + throw UnimplementedError(); + } + + double get maxIntrinsicWidth { + throw UnimplementedError(); + } + + double get alphabeticBaseline { + throw UnimplementedError(); + } + + double get ideographicBaseline { + throw UnimplementedError(); + } + + bool get didExceedMaxLines { + throw UnimplementedError(); + } + + void layout(ui.ParagraphConstraints constraints) { + throw UnimplementedError(); + } + + List getBoxesForRange(int start, int end, + {ui.BoxHeightStyle boxHeightStyle = ui.BoxHeightStyle.tight, + ui.BoxWidthStyle boxWidthStyle = ui.BoxWidthStyle.tight}) { + throw UnimplementedError(); + } + + ui.TextPosition getPositionForOffset(ui.Offset offset) { + throw UnimplementedError(); + } + + ui.TextRange getWordBoundary(ui.TextPosition position) { + throw UnimplementedError(); + } + + ui.TextRange getLineBoundary(ui.TextPosition position) { + throw UnimplementedError(); + } + + List getBoxesForPlaceholders() { + throw UnimplementedError(); + } + + List computeLineMetrics() { + throw UnimplementedError(); + } +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart new file mode 100644 index 0000000000000..e770dfcc7c7a0 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart @@ -0,0 +1,279 @@ +import 'dart:ffi'; +import 'dart:typed_data'; +import 'dart:wasm'; + +import 'package:ui/src/engine.dart' as engine; +import 'package:ui/ui.dart' as ui; +import 'raw/raw_memory.dart'; +import 'raw/raw_path.dart'; + +enum PathDirection { + clockwise, + counterClockwise, +} + +enum PathArcSize { + small, + large, +} + +class SkwasmPath implements ui.Path { + factory SkwasmPath() { + return SkwasmPath._fromHandle(path_create()); + } + + factory SkwasmPath.from(SkwasmPath source) { + return SkwasmPath._fromHandle(path_copy(source._handle)); + } + + SkwasmPath._fromHandle(this._handle); + final PathHandle _handle; + + PathHandle get handle => _handle; + + void delete() { + path_destroy(_handle); + } + + @override + ui.PathFillType get fillType { + return ui.PathFillType.values[path_getFillType(_handle).toIntSigned()]; + } + + @override + set fillType(ui.PathFillType fillType) { + path_setFillType(_handle, fillType.index.toWasmI32()); + } + + @override + void moveTo(double x, double y) { + path_moveTo(_handle, x.toWasmF32(), y.toWasmF32()); + } + + @override + void relativeMoveTo(double x, double y) { + path_relativeMoveTo(_handle, x.toWasmF32(), y.toWasmF32()); + } + + @override + void lineTo(double x, double y) { + path_lineTo(_handle, x.toWasmF32(), y.toWasmF32()); + } + + @override + void relativeLineTo(double x, double y) { + path_relativeMoveTo(_handle, x.toWasmF32(), y.toWasmF32()); + } + + @override + void quadraticBezierTo(double x1, double y1, double x2, double y2) { + path_quadraticBezierTo(_handle, x1.toWasmF32(), y1.toWasmF32(), + x2.toWasmF32(), y2.toWasmF32()); + } + + @override + void relativeQuadraticBezierTo(double x1, double y1, double x2, double y2) { + path_relativeQuadraticBezierTo(_handle, x1.toWasmF32(), y1.toWasmF32(), + x2.toWasmF32(), y2.toWasmF32()); + } + + @override + void cubicTo( + double x1, double y1, double x2, double y2, double x3, double y3) { + path_cubicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), x2.toWasmF32(), + y2.toWasmF32(), x3.toWasmF32(), y3.toWasmF32()); + } + + @override + void relativeCubicTo( + double x1, double y1, double x2, double y2, double x3, double y3) { + path_relativeCubicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), + x2.toWasmF32(), y2.toWasmF32(), x3.toWasmF32(), y3.toWasmF32()); + } + + @override + void conicTo(double x1, double y1, double x2, double y2, double w) { + path_conicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), x2.toWasmF32(), + y2.toWasmF32(), w.toWasmF32()); + } + + @override + void relativeConicTo(double x1, double y1, double x2, double y2, double w) { + path_relativeConicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), + x2.toWasmF32(), y2.toWasmF32(), w.toWasmF32()); + } + + @override + void arcTo( + ui.Rect rect, double startAngle, double sweepAngle, bool forceMoveTo) { + withStackScope((StackScope s) { + final WasmI32 forceMoveToWasm = + forceMoveTo ? 1.toWasmI32() : 0.toWasmI32(); + path_arcToOval( + _handle, + s.convertRect(rect), + ui.toDegrees(startAngle).toWasmF32(), + ui.toDegrees(sweepAngle).toWasmF32(), + forceMoveToWasm); + }); + } + + @override + void arcToPoint( + ui.Offset arcEnd, { + ui.Radius radius = ui.Radius.zero, + double rotation = 0.0, + bool largeArc = false, + bool clockwise = true, + }) { + final PathArcSize arcSize = + largeArc ? PathArcSize.large : PathArcSize.small; + final PathDirection pathDirection = + clockwise ? PathDirection.clockwise : PathDirection.counterClockwise; + path_arcToRotated( + _handle, + radius.x.toWasmF32(), + radius.y.toWasmF32(), + ui.toDegrees(rotation).toWasmF32(), + arcSize.index.toWasmI32(), + pathDirection.index.toWasmI32(), + arcEnd.dx.toWasmF32(), + arcEnd.dy.toWasmF32()); + } + + @override + void relativeArcToPoint( + ui.Offset arcEndDelta, { + ui.Radius radius = ui.Radius.zero, + double rotation = 0.0, + bool largeArc = false, + bool clockwise = true, + }) { + final PathArcSize arcSize = + largeArc ? PathArcSize.large : PathArcSize.small; + final PathDirection pathDirection = + clockwise ? PathDirection.clockwise : PathDirection.counterClockwise; + path_relativeArcToRotated( + _handle, + radius.x.toWasmF32(), + radius.y.toWasmF32(), + ui.toDegrees(rotation).toWasmF32(), + arcSize.index.toWasmI32(), + pathDirection.index.toWasmI32(), + arcEndDelta.dx.toWasmF32(), + arcEndDelta.dy.toWasmF32()); + } + + @override + void addRect(ui.Rect rect) { + withStackScope((StackScope s) { + path_addRect(_handle, s.convertRect(rect)); + }); + } + + @override + void addOval(ui.Rect rect) { + withStackScope((StackScope s) { + path_addOval(_handle, s.convertRect(rect)); + }); + } + + @override + void addArc(ui.Rect rect, double startAngle, double sweepAngle) { + withStackScope((StackScope s) { + path_addArc(_handle, s.convertRect(rect), + ui.toDegrees(startAngle).toWasmF32(), ui.toDegrees(sweepAngle).toWasmF32()); + }); + } + + @override + void addPolygon(List points, bool close) { + withStackScope((StackScope s) { + final WasmI32 closeWasm = close ? 1.toWasmI32() : 0.toWasmI32(); + path_addPolygon(_handle, s.convertPointArray(points), + points.length.toWasmI32(), closeWasm); + }); + } + + @override + void addRRect(ui.RRect rrect) { + withStackScope((StackScope s) { + path_addRRect(_handle, s.convertRRect(rrect)); + }); + } + + @override + void addPath(ui.Path path, ui.Offset offset, {Float64List? matrix4}) { + _addPath(path, offset, false, matrix4: matrix4); + } + + @override + void extendWithPath(ui.Path path, ui.Offset offset, {Float64List? matrix4}) { + _addPath(path, offset, true, matrix4: matrix4); + } + + void _addPath(ui.Path path, ui.Offset offset, bool extend, {Float64List? matrix4}) { + assert(path is SkwasmPath); + withStackScope((StackScope s) { + final Pointer convertedMatrix = + s.convertMatrix4toSkMatrix(matrix4 ?? engine.Matrix4.identity().toFloat64()); + convertedMatrix[2] += offset.dx; + convertedMatrix[5] += offset.dy; + final WasmI32 extendWasm = extend ? 1.toWasmI32() : 0.toWasmI32(); + path_addPath(_handle, (path as SkwasmPath)._handle, convertedMatrix, extendWasm); + }); + } + + @override + void close() { + path_close(_handle); + } + + @override + void reset() { + path_reset(_handle); + } + + @override + bool contains(ui.Offset point) { + final WasmI32 result = + path_contains(_handle, point.dx.toWasmF32(), point.dy.toWasmF32()); + return result.toIntSigned() != 0; + } + + @override + ui.Path shift(ui.Offset offset) { + return transform( + engine.Matrix4.translationValues(offset.dx, offset.dy, 0.0).toFloat64()); + } + + @override + ui.Path transform(Float64List matrix4) { + return withStackScope((StackScope s) { + final PathHandle newPathHandle = path_copy(_handle); + path_transform(newPathHandle, s.convertMatrix4toSkMatrix(matrix4)); + return SkwasmPath._fromHandle(newPathHandle); + }); + } + + @override + ui.Rect getBounds() { + return withStackScope((StackScope s) { + final Pointer rectBuffer = s.allocFloatArray(4); + path_getBounds(_handle, rectBuffer); + return ui.Rect.fromLTRB( + rectBuffer[0], rectBuffer[1], rectBuffer[2], rectBuffer[3]); + }); + } + + static SkwasmPath combine(ui.PathOperation operation, SkwasmPath path1, SkwasmPath path2) { + return SkwasmPath._fromHandle(path_combine( + operation.index.toWasmI32(), path1._handle, path2._handle)); + } + + @override + ui.PathMetrics computeMetrics({bool forceClosed = false}) { + // TODO: implement computeMetrics + throw UnimplementedError(); + } +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart new file mode 100644 index 0000000000000..a4ede5558ad0b --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart @@ -0,0 +1,51 @@ +import 'image.dart'; +import 'raw/raw_picture.dart'; +import 'package:ui/ui.dart' as ui; + +class SkwasmPicture implements ui.Picture { + SkwasmPicture.fromHandle(this._handle); + final PictureHandle _handle; + + PictureHandle get handle => _handle; + + Future toImage(int width, int height) { + throw UnimplementedError(); + } + + void dispose() { + picture_dispose(_handle); + } + + int get approximateBytesUsed { + return picture_approxmateBytesUsed(_handle).toIntSigned(); + } + + @override + // TODO: implement debugDisposed + bool get debugDisposed => throw UnimplementedError(); + + @override + ui.Image toImageSync(int width, int height) { + // TODO: implement toImageSync + throw UnimplementedError(); + } +} + +class SkwasmPictureRecorder implements ui.PictureRecorder { + factory SkwasmPictureRecorder() { + return SkwasmPictureRecorder._fromHandle(pictureRecorder_create()); + } + + SkwasmPictureRecorder._fromHandle(this._handle); + final PictureRecorderHandle _handle; + + PictureRecorderHandle get handle => _handle; + + void delete() { + pictureRecorder_destroy(_handle); + } + + SkwasmPicture endRecording() { + return SkwasmPicture.fromHandle(pictureRecorder_endRecording(_handle)); + } +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart new file mode 100644 index 0000000000000..9464d5f106db9 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart @@ -0,0 +1,104 @@ +import 'dart:ffi'; +import 'dart:wasm'; + +import 'raw_geometry.dart'; +import 'raw_memory.dart'; +import 'raw_paint.dart'; +import 'raw_path.dart'; +import 'raw_picture.dart'; + +class CanvasWrapper extends Opaque {} + +typedef CanvasHandle = Pointer; + +typedef RawClipOp = WasmI32; + +@pragma('wasm:import', 'skwasm.canvas_destroy') +external void canvas_destroy(CanvasHandle canvas); + +@pragma('wasm:import', 'skwasm.canvas_save') +external void canvas_save(CanvasHandle canvas); + +@pragma('wasm:import', 'skwasm.canvas_saveLayer') +external void canvas_saveLayer( + CanvasHandle canvas, RawRect rect, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_restore') +external void canvas_restore(CanvasHandle canvas); + +@pragma('wasm:import', 'skwasm.canvas_getSaveCount') +external RawSize canvas_getSaveCount(CanvasHandle canvas); + +@pragma('wasm:import', 'skwasm.canvas_translate') +external void canvas_translate(CanvasHandle canvas, RawScalar dx, RawScalar dy); + +@pragma('wasm:import', 'skwasm.canvas_scale') +external void canvas_scale(CanvasHandle canvas, RawScalar sx, RawScalar sy); + +@pragma('wasm:import', 'skwasm.canvas_rotate') +external void canvas_rotate(CanvasHandle canvas, RawScalar degrees); + +@pragma('wasm:import', 'skwasm.canvas_skew') +external void canvas_skew(CanvasHandle canvas, RawScalar sx, RawScalar sy); + +@pragma('wasm:import', 'skwasm.canvas_transform') +external void canvas_transform(CanvasHandle canvas, RawMatrix44 matrix); + +@pragma('wasm:import', 'skwasm.canvas_clipRect') +external void canvas_clipRect( + CanvasHandle canvas, RawRect rect, RawClipOp op, RawBool antialias); + +@pragma('wasm:import', 'skwasm.canvas_clipRRect') +external void canvas_clipRRect( + CanvasHandle canvas, RawRRect rrect, RawBool antialias); + +@pragma('wasm:import', 'skwasm.canvas_clipPath') +external void canvas_clipPath( + CanvasHandle canvas, PathHandle path, RawBool antialias); + +@pragma('wasm:import', 'skwasm.canvas_drawColor') +external void canvas_drawColor( + CanvasHandle canvas, RawColor color, RawBlendMode blendMode); + +@pragma('wasm:import', 'skwasm.canvas_drawLine') +external void canvas_drawLine(CanvasHandle canvas, RawScalar x1, RawScalar y1, + RawScalar x2, RawScalar y2, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawPaint') +external void canvas_drawPaint(CanvasHandle canvas, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawRect') +external void canvas_drawRect( + CanvasHandle canvas, RawRect rect, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawRRect') +external void canvas_drawRRect( + CanvasHandle canvas, RawRRect rrect, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawDRRect') +external void canvas_drawDRRect( + CanvasHandle canvas, RawRRect outer, RawRRect inner, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawOval') +external void canvas_drawOval( + CanvasHandle canvas, RawRect oval, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawCircle') +external void canvas_drawCircle(CanvasHandle canvas, RawScalar x, RawScalar y, + RawScalar radius, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawArc') +external void canvas_drawArc( + CanvasHandle canvas, + RawRect rect, + RawScalar startAngleDegrees, + RawScalar sweepAngleDegrees, + RawBool useCenter, + PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawPath') +external void canvas_drawPath( + CanvasHandle canvas, PathHandle path, PaintHandle paint); + +@pragma('wasm:import', 'skwasm.canvas_drawPicture') +external void canvas_drawPicture(CanvasHandle canvas, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_geometry.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_geometry.dart new file mode 100644 index 0000000000000..ced5b0b79b6d9 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_geometry.dart @@ -0,0 +1,7 @@ +import 'dart:ffi'; + +typedef RawRect = Pointer; +typedef RawRRect = Pointer; +typedef RawPointArray = Pointer; +typedef RawMatrix33 = Pointer; +typedef RawMatrix44 = Pointer; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart new file mode 100644 index 0000000000000..a9f8c7011e13a --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart @@ -0,0 +1,128 @@ +import 'dart:convert'; +import 'dart:ffi'; +import 'dart:typed_data'; +import 'dart:wasm'; + +import 'package:ui/ui.dart' as ui; + +class Stack extends Opaque {} + +typedef StackPointer = Pointer; + +typedef RawScalar = WasmF32; +typedef RawBool = WasmI32; +typedef RawSize = WasmI32; + +/// Generic linear memory allocation +@pragma('wasm:import', 'skwasm.stackAlloc') +external Pointer stackAlloc(RawSize length); + +@pragma('wasm:import', 'skwasm.stackSave') +external StackPointer stackSave(); + +@pragma('wasm:import', 'skwasm.stackRestore') +external void stackRestore(StackPointer pointer); + +extension BoolToRawWasm on bool { + WasmI32 toWasmI32() => this ? 1.toWasmI32() : 0.toWasmI32(); +} + +class StackScope { + Pointer convertString(String string) { + final Utf8Encoder utf8Encoder = utf8.encoder; + final Uint8List encoded = utf8Encoder.convert(string); + final Pointer pointer = allocInt8Array(encoded.length + 1); + for (int i = 0; i < encoded.length; i++) { + pointer[i] = encoded[i]; + } + pointer[encoded.length] = 0; + return pointer; + } + + Pointer convertMatrix4toSkMatrix(Float64List matrix4) { + final Pointer pointer = allocFloatArray(9); + final int matrixLength = matrix4.length; + + double getVal(int index) { + return (index < matrixLength) ? matrix4[index] : 0.0; + } + + pointer[0] = getVal(0); + pointer[1] = getVal(4); + pointer[2] = getVal(12); + + pointer[3] = getVal(1); + pointer[4] = getVal(5); + pointer[5] = getVal(13); + + pointer[6] = getVal(3); + pointer[7] = getVal(7); + pointer[8] = getVal(15); + + return pointer; + } + + Pointer convertMatrix4toSkM44(Float64List matrix4) { + assert(matrix4.length == 16); + final Pointer pointer = allocFloatArray(16); + for (int i = 0; i < 16; i++) { + pointer[i] = matrix4[i]; + } + return pointer; + } + + Pointer convertRect(ui.Rect rect) { + final Pointer pointer = allocFloatArray(4); + pointer[0] = rect.left; + pointer[1] = rect.top; + pointer[2] = rect.right; + pointer[3] = rect.bottom; + return pointer; + } + + Pointer convertRRect(ui.RRect rect) { + final Pointer pointer = allocFloatArray(12); + pointer[0] = rect.left; + pointer[1] = rect.top; + pointer[2] = rect.right; + pointer[3] = rect.bottom; + + pointer[4] = rect.tlRadiusX; + pointer[5] = rect.tlRadiusY; + pointer[6] = rect.trRadiusX; + pointer[7] = rect.trRadiusY; + + pointer[8] = rect.brRadiusX; + pointer[9] = rect.brRadiusY; + pointer[10] = rect.blRadiusX; + pointer[11] = rect.blRadiusY; + + return pointer; + } + + Pointer convertPointArray(List points) { + final Pointer pointer = allocFloatArray(points.length * 2); + for (int i = 0; i < points.length; i++) { + pointer[i * 2] = points[i].dx; + pointer[i * 2 + 1] = points[i].dy; + } + return pointer; + } + + Pointer allocInt8Array(int count) { + final int length = count * sizeOf(); + return stackAlloc(length.toWasmI32()).cast(); + } + + Pointer allocFloatArray(int count) { + final int length = count * sizeOf(); + return stackAlloc(length.toWasmI32()).cast(); + } +} + +T withStackScope(T Function(StackScope scope) f) { + final StackPointer stack = stackSave(); + final T result = f(StackScope()); + stackRestore(stack); + return result; +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart new file mode 100644 index 0000000000000..daf8183666eba --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart @@ -0,0 +1,64 @@ +import 'dart:ffi'; +import 'dart:wasm'; +import 'raw_memory.dart'; + +class RawPaint extends Opaque {} + +typedef PaintHandle = Pointer; + +typedef RawBlendMode = WasmI32; +typedef RawPaintStyle = WasmI32; +typedef RawStrokeCap = WasmI32; +typedef RawStrokeJoin = WasmI32; +typedef RawColor = WasmI32; + +@pragma('wasm:import', 'skwasm.paint_create') +external PaintHandle paint_create(); + +@pragma('wasm:import', 'skwasm.paint_destroy') +external void paint_destroy(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setBlendMode') +external void paint_setBlendMode(PaintHandle paint, RawBlendMode blendMode); + +@pragma('wasm:import', 'skwasm.paint_setStyle') +external void paint_setPaintStyle(PaintHandle paint, RawPaintStyle paintStyle); + +@pragma('wasm:import', 'skwasm.paint_getStyle') +external RawPaintStyle paint_getPaintStyle(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setStrokeWidth') +external void paint_setStrokeWidth(PaintHandle paint, RawScalar strokeWidth); + +@pragma('wasm:import', 'skwasm.paint_getStrokeWidth') +external RawScalar paint_getStrokeWidth(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setStrokeCap') +external void paint_setStrokeCap(PaintHandle paint, RawStrokeCap cap); + +@pragma('wasm:import', 'skwasm.paint_getStrokeCap') +external RawStrokeCap paint_getStrokeCap(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setStrokeJoin') +external void paint_setStrokeJoin(PaintHandle paint, RawStrokeJoin join); + +@pragma('wasm:import', 'skwasm.paint_getStrokeJoin') +external RawStrokeJoin paint_getStrokeJoin(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setAntiAlias') +external void paint_setAntiAlias(PaintHandle paint, RawBool antiAlias); + +@pragma('wasm:import', 'skwasm.paint_getAntiAlias') +external RawBool paint_getAntiAlias(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setColorInt') +external void paint_setColorInt(PaintHandle paint, RawColor color); + +@pragma('wasm:import', 'skwasm.paint_getColorInt') +external RawColor paint_getColorInt(PaintHandle paint); + +@pragma('wasm:import', 'skwasm.paint_setMiterLimit') +external void paint_setMiterLimit(PaintHandle paint, RawScalar miterLimit); + +@pragma('wasm:import', 'skwasm.paint_getMiterLimit') +external RawScalar paint_getMiterLimit(PaintHandle paint); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart new file mode 100644 index 0000000000000..5013539646e27 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart @@ -0,0 +1,132 @@ +import 'dart:ffi'; +import 'dart:wasm'; + +import 'raw_geometry.dart'; +import 'raw_memory.dart'; + +class RawPath extends Opaque {} + +typedef PathHandle = Pointer; + +typedef RawPathFillType = WasmI32; +typedef RawPathDirection = WasmI32; +typedef RawArcSize = WasmI32; +typedef RawPathOperation = WasmI32; + +@pragma('wasm:import', 'skwasm.path_create') +external PathHandle path_create(); + +@pragma('wasm:import', 'skwasm.path_destroy') +external void path_destroy(PathHandle path); + +@pragma('wasm:import', 'skwasm.path_copy') +external PathHandle path_copy(PathHandle path); + +@pragma('wasm:import', 'skwasm.path_setFillType') +external void path_setFillType(PathHandle path, RawPathFillType fillType); + +@pragma('wasm:import', 'skwasm.path_getFillType') +external RawPathFillType path_getFillType(PathHandle path); + +@pragma('wasm:import', 'skwasm.path_moveTo') +external void path_moveTo(PathHandle path, RawScalar x, RawScalar y); + +@pragma('wasm:import', 'skwasm.path_relativeMoveTo') +external void path_relativeMoveTo(PathHandle path, RawScalar x, RawScalar y); + +@pragma('wasm:import', 'skwasm.path_lineTo') +external void path_lineTo(PathHandle path, RawScalar x, RawScalar y); + +@pragma('wasm:import', 'skwasm.path_lineTo') +external void path_relativeLineTo(PathHandle path, RawScalar x, RawScalar y); + +@pragma('wasm:import', 'skwasm.path_quadraticBezierTo') +external void path_quadraticBezierTo( + PathHandle path, RawScalar x1, RawScalar y1, RawScalar x2, RawScalar y2); + +@pragma('wasm:import', 'skwasm.path_relativeQuadraticBezierTo') +external void path_relativeQuadraticBezierTo( + PathHandle path, RawScalar x1, RawScalar y1, RawScalar x2, RawScalar y2); + +@pragma('wasm:import', 'skwasm.path_cubicTo') +external void path_cubicTo(PathHandle path, RawScalar x1, RawScalar y1, + RawScalar x2, RawScalar y2, RawScalar x3, RawScalar y3); + +@pragma('wasm:import', 'skwasm.path_relativeCubicTo') +external void path_relativeCubicTo(PathHandle path, RawScalar x1, RawScalar y1, + RawScalar x2, RawScalar y2, RawScalar x3, RawScalar y3); + +@pragma('wasm:import', 'skwasm.path_conicTo') +external void path_conicTo(PathHandle path, RawScalar x1, RawScalar y1, + RawScalar x2, RawScalar y2, RawScalar w); + +@pragma('wasm:import', 'skwasm.path_relativeConicTo') +external void path_relativeConicTo(PathHandle path, RawScalar x1, RawScalar y1, + RawScalar x2, RawScalar y2, RawScalar w); + +@pragma('wasm:import', 'skwasm.path_arcToOval') +external void path_arcToOval(PathHandle path, Pointer rect, + RawScalar startAngle, RawScalar sweepAngle, RawBool forceMoveto); + +@pragma('wasm:import', 'skwasm.path_arcToRotated') +external void path_arcToRotated( + PathHandle path, + RawScalar rx, + RawScalar ry, + RawScalar xAxisRotate, + RawArcSize arcSize, + RawPathDirection pathDirection, + RawScalar x, + RawScalar y); + +@pragma('wasm:import', 'skwasm.path_relativeArcToRotated') +external void path_relativeArcToRotated( + PathHandle path, + RawScalar rx, + RawScalar ry, + RawScalar xAxisRotate, + RawArcSize arcSize, + RawPathDirection pathDirection, + RawScalar x, + RawScalar y); + +@pragma('wasm:import', 'skwasm.path_addRect') +external void path_addRect(PathHandle path, RawRect oval); + +@pragma('wasm:import', 'skwasm.path_addOval') +external void path_addOval(PathHandle path, RawRect oval); + +@pragma('wasm:import', 'skwasm.path_addArc') +external void path_addArc(PathHandle path, RawRect ovalRect, + RawScalar startAngleDegrees, RawScalar sweepAngleDegrees); + +@pragma('wasm:import', 'skwasm.path_addPolygon') +external void path_addPolygon( + PathHandle path, RawPointArray points, RawSize pointCount, RawBool close); + +@pragma('wasm:import', 'skwasm.path_addRRect') +external void path_addRRect( + PathHandle path, RawRRect rrectValues); + +@pragma('wasm:import', 'skwasm.path_addPath') +external void path_addPath(PathHandle path, PathHandle other, + RawMatrix33 matrix33, RawBool extendPath); + +@pragma('wasm:import', 'skwasm.path_close') +external void path_close(PathHandle path); + +@pragma('wasm:import', 'skwasm.path_reset') +external void path_reset(PathHandle path); + +@pragma('wasm:import', 'skwasm.path_contains') +external RawBool path_contains(PathHandle path, RawScalar x, RawScalar y); + +@pragma('wasm:import', 'skwasm.path_transform') +external void path_transform(PathHandle path, RawMatrix33 matrix33); + +@pragma('wasm:import', 'skwasm.path_getBounds') +external void path_getBounds(PathHandle path, RawRect outRect); + +@pragma('wasm:import', 'skwasm.path_combine') +external PathHandle path_combine( + RawPathOperation operation, PathHandle path1, PathHandle path2); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart new file mode 100644 index 0000000000000..d8227941a3eeb --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart @@ -0,0 +1,33 @@ +import 'dart:ffi'; + +import 'raw_canvas.dart'; +import 'raw_geometry.dart'; +import 'raw_memory.dart'; + +class RawPictureRecorder extends Opaque {} + +typedef PictureRecorderHandle = Pointer; + +class RawPicture extends Opaque {} + +typedef PictureHandle = Pointer; + +@pragma('wasm:import', 'skwasm.pictureRecorder_create') +external PictureRecorderHandle pictureRecorder_create(); + +@pragma('wasm:import', 'skwasm.pictureRecorder_destroy') +external void pictureRecorder_destroy(PictureRecorderHandle picture); + +@pragma('wasm:import', 'skwasm.pictureRecorder_beginRecording') +external CanvasHandle pictureRecorder_beginRecording( + PictureRecorderHandle picture, RawRect cullRect); + +@pragma('wasm:import', 'skwasm.pictureRecorder_endRecording') +external PictureHandle pictureRecorder_endRecording( + PictureRecorderHandle picture); + +@pragma('wasm:import', 'skwasm.picture_dispose') +external PictureHandle picture_dispose(PictureHandle handle); + +@pragma('wasm:import', 'skwasm.picture_approximateBytesUsed') +external RawSize picture_approxmateBytesUsed(PictureHandle handle); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart new file mode 100644 index 0000000000000..c457655f71912 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart @@ -0,0 +1,19 @@ +import 'dart:ffi'; +import 'dart:wasm'; +import 'raw_picture.dart'; + +class RawSurface extends Opaque {} + +typedef SurfaceHandle = Pointer; + +@pragma('wasm:import', 'skwasm.surface_createFromCanvas') +external SurfaceHandle surface_createFromCanvas(Pointer querySelector); + +@pragma('wasm:import', 'skwasm.surface_destroy') +external void surface_destroy(SurfaceHandle surface); + +@pragma('wasm:import', 'skwasm.surface_setCanvasSize') +external void surface_setCanvasSize(SurfaceHandle surface, WasmI32 width, WasmI32 height); + +@pragma('wasm:import', 'skwasm.surface_renderPicture') +external void surface_renderPicture(SurfaceHandle surface, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart new file mode 100644 index 0000000000000..7893390a38f71 --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart @@ -0,0 +1,27 @@ +import 'dart:ffi'; +import 'dart:wasm'; + +import 'picture.dart'; +import 'raw/raw_memory.dart'; +import 'raw/raw_surface.dart'; + +class Surface { + factory Surface(String canvasQuerySelector) { + final SurfaceHandle surfaceHandle = withStackScope((StackScope scope) { + final Pointer pointer = scope.convertString(canvasQuerySelector); + return surface_createFromCanvas(pointer); + }); + return Surface._fromHandle(surfaceHandle); + } + + Surface._fromHandle(this._handle); + final SurfaceHandle _handle; + + void setSize(int width, int height) { + surface_setCanvasSize(_handle, width.toWasmI32(), height.toWasmI32()); + } + + void renderPicture(SkwasmPicture picture) { + surface_renderPicture(_handle, picture.handle); + } +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart new file mode 100644 index 0000000000000..3c95dc85d5bac --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart @@ -0,0 +1,25 @@ +import 'dart:typed_data'; + +import 'package:ui/ui.dart' as ui; + +class SkwasmVertices implements ui.Vertices { + factory SkwasmVertices( + ui.VertexMode mode, + List positions, { + List? textureCoordinates, + List? colors, + List? indices, + }) { + throw UnimplementedError(); + } + + factory SkwasmVertices.raw( + ui.VertexMode mode, + Float32List positions, { + Float32List? textureCoordinates, + Int32List? colors, + Uint16List? indices, + }) { + throw UnimplementedError(); + } +} diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn new file mode 100644 index 0000000000000..94b056787999b --- /dev/null +++ b/lib/web_ui/skwasm/BUILD.gn @@ -0,0 +1,77 @@ +import("//build/toolchain/wasm.gni") + +wasm_lib("skwasm") { + sources = [ + "canvas.cpp", + "export.h", + "helpers.h", + "paint.cpp", + "path.cpp", + "picture.cpp", + "surface.cpp", + "wrappers.h", + ] + + # embedded font, generated by the :create_notomono_cpp target + sources += [ + "$root_out_dir/modules/canvaskit/fonts/NotoMono-Regular.ttf.ninja.cpp", + ] + + ldflags = [ + "-std=c++20", + "-lGL", + "-sUSE_WEBGL2=1", + "-sMAX_WEBGL_VERSION=2", + "-sOFFSCREENCANVAS_SUPPORT", + "-sPTHREAD_POOL_SIZE=1", + "-sALLOW_MEMORY_GROWTH", + "-sUSE_PTHREADS=1", + ] + + cflags = [ "-pthread" ] + + if (is_debug) { + ldflags += [ + "-O0", + "-sDEMANGLE_SUPPORT=1", + "-sASSERTIONS=1", + "-sGL_ASSERTIONS=1", + "-g3", + ] + } else { + ldflags += [ + "-O1", + "--closure=0", + "-flto", + "-sEXPORTED_FUNCTIONS=[stackAlloc]", + ] + + cflags += [ + "-flto", + "-fvisibility=hidden", + ] + } + + # extra_outputs = [ "$root_out_dir/skwasm.worker.js" ] + + deps = [ + "//third_party/skia", + "//third_party/skia/modules/canvaskit:create_notomono_cpp", + ] +} + +# copy("copy_skwasm") { +# skwasm_target = ":skwasm(//build/toolchain/wasm)" + +# deps = [ skwasm_target ] + +# skwasm_out_dir = get_label_info(skwasm_target, "root_out_dir") + +# sources = [ +# "$skwasm_out_dir/skwasm.js", +# "$skwasm_out_dir/skwasm.wasm", +# "$skwasm_out_dir/skwasm.worker.js", +# ] + +# outputs = [ "$root_out_dir/skwasm/{{source_file_part}}" ] +# } diff --git a/lib/web_ui/skwasm/canvas.cpp b/lib/web_ui/skwasm/canvas.cpp new file mode 100644 index 0000000000000..c4dae9f81f8b2 --- /dev/null +++ b/lib/web_ui/skwasm/canvas.cpp @@ -0,0 +1,162 @@ +#include +#include "export.h" +#include "helpers.h" +#include "wrappers.h" + +using namespace Skwasm; + +SKWASM_EXPORT void canvas_destroy(CanvasWrapper* wrapper) { + delete wrapper; +} + +SKWASM_EXPORT void canvas_saveLayer(CanvasWrapper* wrapper, + SkRect* rect, + SkPaint* paint) { + wrapper->canvas->saveLayer(SkCanvas::SaveLayerRec(rect, paint, 0)); +} + +SKWASM_EXPORT void canvas_save(CanvasWrapper* wrapper) { + wrapper->canvas->save(); +} + +SKWASM_EXPORT void canvas_restore(CanvasWrapper* wrapper) { + wrapper->canvas->restore(); +} + +SKWASM_EXPORT int canvas_getSaveCount(CanvasWrapper* wrapper) { + return wrapper->canvas->getSaveCount(); +} + +SKWASM_EXPORT void canvas_translate(CanvasWrapper* wrapper, + SkScalar dx, + SkScalar dy) { + wrapper->canvas->translate(dx, dy); +} + +SKWASM_EXPORT void canvas_scale(CanvasWrapper* wrapper, + SkScalar sx, + SkScalar sy) { + wrapper->canvas->scale(sx, sy); +} + +SKWASM_EXPORT void canvas_rotate(CanvasWrapper* wrapper, SkScalar degrees) { + wrapper->canvas->rotate(degrees); +} + +SKWASM_EXPORT void canvas_skew(CanvasWrapper* wrapper, + SkScalar sx, + SkScalar sy) { + wrapper->canvas->skew(sx, sy); +} + +SKWASM_EXPORT void canvas_transform(CanvasWrapper* wrapper, + const SkM44* matrix44) { + wrapper->canvas->concat(*matrix44); +} + +SKWASM_EXPORT void canvas_clipRect(CanvasWrapper* wrapper, + const SkRect* rect, + SkClipOp op, + bool antialias) { + wrapper->canvas->clipRect(*rect, op, antialias); +} + +SKWASM_EXPORT void canvas_clipRRect(CanvasWrapper* wrapper, + const SkScalar* rrectValues, + bool antialias) { + wrapper->canvas->clipRRect(createRRect(rrectValues), antialias); +} + +SKWASM_EXPORT void canvas_clipPath(CanvasWrapper* wrapper, + SkPath* path, + bool antialias) { + wrapper->canvas->clipPath(*path, antialias); +} + +SKWASM_EXPORT void canvas_drawColor(CanvasWrapper* wrapper, + SkColor color, + SkBlendMode blendMode) { + makeCurrent(wrapper->context); + wrapper->canvas->drawColor(color, blendMode); +} + +SKWASM_EXPORT void canvas_drawLine(CanvasWrapper* wrapper, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2, + SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawLine(x1, y1, x2, y2, *paint); +} + +SKWASM_EXPORT void canvas_drawPaint(CanvasWrapper* wrapper, SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawPaint(*paint); +} + +SKWASM_EXPORT void canvas_drawRect(CanvasWrapper* wrapper, + SkRect* rect, + SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawRect(*rect, *paint); +} + +SKWASM_EXPORT void canvas_drawRRect(CanvasWrapper* wrapper, + const SkScalar* rrectValues, + SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawRRect(createRRect(rrectValues), *paint); +} + +SKWASM_EXPORT void canvas_drawDRRect(CanvasWrapper* wrapper, + const SkScalar* outerRrectValues, + const SkScalar* innerRrectValues, + SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawDRRect(createRRect(outerRrectValues), + createRRect(innerRrectValues), *paint); +} + +SKWASM_EXPORT void canvas_drawOval(CanvasWrapper* wrapper, + const SkRect* rect, + SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawOval(*rect, *paint); +} + +SKWASM_EXPORT void canvas_drawCircle(CanvasWrapper* wrapper, + SkScalar x, + SkScalar y, + SkScalar radius, + SkPaint* paint) { + makeCurrent(wrapper->context); + + wrapper->canvas->drawCircle(x, y, radius, *paint); +} + +SKWASM_EXPORT void canvas_drawArc(CanvasWrapper* wrapper, + const SkRect* rect, + SkScalar startAngleDegrees, + SkScalar sweepAngleDegrees, + bool useCenter, + SkPaint* paint) { + makeCurrent(wrapper->context); + wrapper->canvas->drawArc(*rect, startAngleDegrees, sweepAngleDegrees, + useCenter, *paint); +} + +SKWASM_EXPORT void canvas_drawPath(CanvasWrapper* wrapper, + SkPath* path, + SkPaint* paint) { + makeCurrent(wrapper->context); + + wrapper->canvas->drawPath(*path, *paint); +} + +SKWASM_EXPORT void canvas_drawPicture(CanvasWrapper* wrapper, + SkPicture* picture) { + makeCurrent(wrapper->context); + + wrapper->canvas->drawPicture(picture); +} diff --git a/lib/web_ui/skwasm/export.h b/lib/web_ui/skwasm/export.h new file mode 100644 index 0000000000000..45757c746ef7d --- /dev/null +++ b/lib/web_ui/skwasm/export.h @@ -0,0 +1,3 @@ +#pragma once + +#define SKWASM_EXPORT extern "C" EMSCRIPTEN_KEEPALIVE diff --git a/lib/web_ui/skwasm/helpers.h b/lib/web_ui/skwasm/helpers.h new file mode 100644 index 0000000000000..7c47922ff1119 --- /dev/null +++ b/lib/web_ui/skwasm/helpers.h @@ -0,0 +1,25 @@ + +#pragma once + +#include "third_party/skia/include/core/SkMatrix.h" +#include "third_party/skia/include/core/SkRRect.h" + +namespace Skwasm { + +inline SkMatrix createMatrix(const SkScalar* f) { + return SkMatrix::MakeAll(f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7], + f[8]); +} + +inline SkRRect createRRect(const SkScalar* f) { + const SkScalar* twelveFloats = reinterpret_cast(f); + const SkRect* rect = reinterpret_cast(twelveFloats); + const SkVector* radiiValues = + reinterpret_cast(twelveFloats + 4); + + SkRRect rr; + rr.setRectRadii(*rect, radiiValues); + return rr; +} + +} // namespace Skwasm diff --git a/lib/web_ui/skwasm/paint.cpp b/lib/web_ui/skwasm/paint.cpp new file mode 100644 index 0000000000000..53a5f3cc6ddf7 --- /dev/null +++ b/lib/web_ui/skwasm/paint.cpp @@ -0,0 +1,76 @@ +#include +#include "export.h" +#include "helpers.h" +#include "third_party/skia/include/core/SkPaint.h" + +using namespace Skwasm; + +SKWASM_EXPORT SkPaint* paint_create() { + return new SkPaint(); +} + +SKWASM_EXPORT void paint_destroy(SkPaint* paint) { + delete paint; +} + +SKWASM_EXPORT void paint_setBlendMode(SkPaint* paint, SkBlendMode mode) { + paint->setBlendMode(mode); +} + +// No getter for blend mode, as it's non trivial. Cache on the dart side. + +SKWASM_EXPORT void paint_setStyle(SkPaint* paint, SkPaint::Style style) { + paint->setStyle(style); +} + +SKWASM_EXPORT SkPaint::Style paint_getStyle(SkPaint* paint) { + return paint->getStyle(); +} + +SKWASM_EXPORT void paint_setStrokeWidth(SkPaint* paint, SkScalar width) { + paint->setStrokeWidth(width); +} + +SKWASM_EXPORT SkScalar paint_getStrokeWidth(SkPaint* paint) { + return paint->getStrokeWidth(); +} + +SKWASM_EXPORT void paint_setStrokeCap(SkPaint* paint, SkPaint::Cap cap) { + paint->setStrokeCap(cap); +} + +SKWASM_EXPORT SkPaint::Cap paint_getStrokeCap(SkPaint* paint) { + return paint->getStrokeCap(); +} + +SKWASM_EXPORT void paint_setStrokeJoin(SkPaint* paint, SkPaint::Join join) { + paint->setStrokeJoin(join); +} + +SKWASM_EXPORT SkPaint::Join paint_getStrokeJoin(SkPaint* paint) { + return paint->getStrokeJoin(); +} + +SKWASM_EXPORT void paint_setAntiAlias(SkPaint* paint, bool antiAlias) { + paint->setAntiAlias(antiAlias); +} + +SKWASM_EXPORT bool paint_getAntiAlias(SkPaint* paint) { + return paint->isAntiAlias(); +} + +SKWASM_EXPORT void paint_setColorInt(SkPaint* paint, SkColor colorInt) { + paint->setColor(colorInt); +} + +SKWASM_EXPORT SkColor paint_getColorInt(SkPaint* paint) { + return paint->getColor(); +} + +SKWASM_EXPORT void paint_setMiterLimit(SkPaint* paint, SkScalar miterLimit) { + paint->setStrokeMiter(miterLimit); +} + +SKWASM_EXPORT SkScalar paint_getMiterLImit(SkPaint* paint) { + return paint->getStrokeMiter(); +} diff --git a/lib/web_ui/skwasm/path.cpp b/lib/web_ui/skwasm/path.cpp new file mode 100644 index 0000000000000..8b41ba08166c6 --- /dev/null +++ b/lib/web_ui/skwasm/path.cpp @@ -0,0 +1,193 @@ +#include +#include "export.h" +#include "helpers.h" +#include "third_party/skia/include/core/SkPath.h" +#include "third_party/skia/include/pathops/SkPathOps.h" + +using namespace Skwasm; + +SKWASM_EXPORT SkPath* path_create() { + return new SkPath(); +} + +SKWASM_EXPORT void path_destroy(SkPath* path) { + delete path; +} + +SKWASM_EXPORT SkPath* path_copy(SkPath* path) { + return new SkPath(*path); +} + +SKWASM_EXPORT void path_setFillType(SkPath* path, SkPathFillType fillType) { + path->setFillType(fillType); +} + +SKWASM_EXPORT SkPathFillType path_getFillType(SkPath* path) { + return path->getFillType(); +} + +SKWASM_EXPORT void path_moveTo(SkPath* path, SkScalar x, SkScalar y) { + path->moveTo(x, y); +} + +SKWASM_EXPORT void path_relativeMoveTo(SkPath* path, SkScalar x, SkScalar y) { + path->rMoveTo(x, y); +} + +SKWASM_EXPORT void path_lineTo(SkPath* path, SkScalar x, SkScalar y) { + path->lineTo(x, y); +} + +SKWASM_EXPORT void path_relativeLineTo(SkPath* path, SkScalar x, SkScalar y) { + path->rLineTo(x, y); +} + +SKWASM_EXPORT void path_quadraticBezierTo(SkPath* path, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2) { + path->quadTo(x1, y1, x2, y2); +} + +SKWASM_EXPORT void path_relativeQuadraticBezierTo(SkPath* path, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2) { + path->rQuadTo(x1, y1, x2, y2); +} + +SKWASM_EXPORT void path_cubicTo(SkPath* path, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2, + SkScalar x3, + SkScalar y3) { + path->cubicTo(x1, y1, x2, y2, x3, y3); +} + +SKWASM_EXPORT void path_relativeCubicTo(SkPath* path, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2, + SkScalar x3, + SkScalar y3) { + path->rCubicTo(x1, y1, x2, y2, x3, y3); +} + +SKWASM_EXPORT void path_conicTo(SkPath* path, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2, + SkScalar w) { + path->conicTo(x1, y1, x2, y2, w); +} + +SKWASM_EXPORT void path_relativeConicTo(SkPath* path, + SkScalar x1, + SkScalar y1, + SkScalar x2, + SkScalar y2, + SkScalar w) { + path->rConicTo(x1, y1, x2, y2, w); +} + +SKWASM_EXPORT void path_arcToOval(SkPath* path, + const SkRect* rect, + SkScalar startAngle, + SkScalar sweepAngle, + bool forceMoveTo) { + path->arcTo(*rect, startAngle, sweepAngle, forceMoveTo); +} + +SKWASM_EXPORT void path_arcToRotated(SkPath* path, + SkScalar rx, + SkScalar ry, + SkScalar xAxisRotate, + SkPath::ArcSize arcSize, + SkPathDirection pathDirection, + SkScalar x, + SkScalar y) { + path->arcTo(rx, ry, xAxisRotate, arcSize, pathDirection, x, y); +} + +SKWASM_EXPORT void path_relativeArcToRotated(SkPath* path, + SkScalar rx, + SkScalar ry, + SkScalar xAxisRotate, + SkPath::ArcSize arcSize, + SkPathDirection pathDirection, + SkScalar x, + SkScalar y) { + path->rArcTo(rx, ry, xAxisRotate, arcSize, pathDirection, x, y); +} + +SKWASM_EXPORT void path_addRect(SkPath* path, const SkRect* rect) { + path->addRect(*rect); +} + +SKWASM_EXPORT void path_addOval(SkPath* path, const SkRect* oval) { + path->addOval(*oval, SkPathDirection::kCW, 1); +} + +SKWASM_EXPORT void path_addArc(SkPath* path, + const SkRect* oval, + SkScalar startAngle, + SkScalar sweepAngle) { + path->addArc(*oval, startAngle, sweepAngle); +} + +SKWASM_EXPORT void path_addPolygon(SkPath* path, + const SkPoint* points, + int count, + bool close) { + path->addPoly(points, count, close); +} + +SKWASM_EXPORT void path_addRRect(SkPath* path, const SkScalar* rrectValues) { + path->addRRect(createRRect(rrectValues), SkPathDirection::kCW); +} + +SKWASM_EXPORT void path_addPath(SkPath* path, + const SkPath* other, + const SkScalar* matrix33, + SkPath::AddPathMode extendPath) { + path->addPath(*other, createMatrix(matrix33), extendPath); +} + +SKWASM_EXPORT void path_close(SkPath* path) { + path->close(); +} + +SKWASM_EXPORT void path_reset(SkPath* path) { + path->reset(); +} + +SKWASM_EXPORT bool path_contains(SkPath* path, SkScalar x, SkScalar y) { + return path->contains(x, y); +} + +SKWASM_EXPORT void path_transform(SkPath* path, const SkScalar* matrix33) { + path->transform(createMatrix(matrix33)); +} + +SKWASM_EXPORT void path_getBounds(SkPath* path, SkRect* rect) { + *rect = path->getBounds(); +} + +SKWASM_EXPORT SkPath* path_combine(SkPathOp operation, + const SkPath* path1, + const SkPath* path2) { + SkPath* output = new SkPath(); + if (Op(*path1, *path2, operation, output)) { + output->setFillType(path1->getFillType()); + return output; + } else { + delete output; + return nullptr; + } +} diff --git a/lib/web_ui/skwasm/picture.cpp b/lib/web_ui/skwasm/picture.cpp new file mode 100644 index 0000000000000..8b108dd144bda --- /dev/null +++ b/lib/web_ui/skwasm/picture.cpp @@ -0,0 +1,34 @@ +#include +#include "export.h" +#include "helpers.h" +#include "third_party/skia/include/core/SkPictureRecorder.h" +#include "wrappers.h" + +using namespace Skwasm; + +SKWASM_EXPORT SkPictureRecorder* pictureRecorder_create() { + return new SkPictureRecorder(); +} + +SKWASM_EXPORT void pictureRecorder_destroy(SkPictureRecorder* recorder) { + delete recorder; +} + +SKWASM_EXPORT CanvasWrapper* pictureRecorder_beginRecording( + SkPictureRecorder* recorder, + const SkRect* cullRect) { + return new CanvasWrapper{0, recorder->beginRecording(*cullRect)}; +} + +SKWASM_EXPORT SkPicture* pictureRecorder_endRecording( + SkPictureRecorder* recorder) { + return recorder->finishRecordingAsPicture().release(); +} + +SKWASM_EXPORT void picture_dispose(SkPicture* picture) { + picture->unref(); +} + +SKWASM_EXPORT uint32_t picture_approximateBytesUsed(SkPicture* picture) { + return static_cast(picture->approximateBytesUsed()); +} diff --git a/lib/web_ui/skwasm/surface.cpp b/lib/web_ui/skwasm/surface.cpp new file mode 100644 index 0000000000000..06d31e8a64807 --- /dev/null +++ b/lib/web_ui/skwasm/surface.cpp @@ -0,0 +1,193 @@ +#include +#include +#include +#include +#include +#include +#include "export.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkColorSpace.h" +#include "third_party/skia/include/core/SkPicture.h" +#include "third_party/skia/include/core/SkSurface.h" +#include "third_party/skia/include/gpu/GrDirectContext.h" +#include "third_party/skia/include/gpu/gl/GrGLInterface.h" +#include "third_party/skia/include/gpu/gl/GrGLTypes.h" +#include "wrappers.h" + +using namespace Skwasm; + +namespace { + +class Surface; +void fDispose(Surface* surface); +void fSetCanvasSize(Surface* surface, int width, int height); +void fRenderPicture(Surface* surface, SkPicture* picture); + +class Surface { + public: + Surface(const char* canvasID) : _canvasID(canvasID) { + pthread_attr_t attr; + pthread_attr_init(&attr); + emscripten_pthread_attr_settransferredcanvases(&attr, _canvasID.c_str()); + + pthread_create( + &_thread, &attr, + [](void* context) -> void* { + static_cast(context)->_runWorker(); + return nullptr; + }, + this); + pthread_detach(_thread); + } + + void dispose() { + emscripten_dispatch_to_thread(_thread, EM_FUNC_SIG_VI, + reinterpret_cast(fDispose), nullptr, + this); + } + + void setCanvasSize(int width, int height) { + emscripten_dispatch_to_thread(_thread, EM_FUNC_SIG_VIII, + reinterpret_cast(fSetCanvasSize), + nullptr, this, width, height); + } + + void renderPicture(SkPicture* picture) { + picture->ref(); + emscripten_dispatch_to_thread(_thread, EM_FUNC_SIG_VII, + reinterpret_cast(fRenderPicture), + nullptr, this, picture); + } + + private: + void _runWorker() { + _init(); + emscripten_unwind_to_js_event_loop(); + } + + void _init() { + EmscriptenWebGLContextAttributes attributes; + emscripten_webgl_init_context_attributes(&attributes); + + attributes.alpha = true; + attributes.depth = true; + attributes.stencil = true; + attributes.antialias = false; + attributes.premultipliedAlpha = true; + attributes.preserveDrawingBuffer = 0; + attributes.powerPreference = EM_WEBGL_POWER_PREFERENCE_DEFAULT; + attributes.failIfMajorPerformanceCaveat = false; + attributes.enableExtensionsByDefault = true; + attributes.explicitSwapControl = false; + attributes.renderViaOffscreenBackBuffer = true; + attributes.majorVersion = 2; + + _glContext = + emscripten_webgl_create_context(_canvasID.c_str(), &attributes); + if (!_glContext) { + printf("Failed to create context!\n"); + return; + } + + makeCurrent(_glContext); + + _grContext = GrDirectContext::MakeGL(GrGLMakeNativeInterface()); + + // WebGL should already be clearing the color and stencil buffers, but do it + // again here to ensure Skia receives them in the expected state. + emscripten_glBindFramebuffer(GL_FRAMEBUFFER, 0); + emscripten_glClearColor(0, 0, 0, 0); + emscripten_glClearStencil(0); + emscripten_glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + _grContext->resetContext(kRenderTarget_GrGLBackendState | + kMisc_GrGLBackendState); + + // The on-screen canvas is FBO 0. Wrap it in a Skia render target so Skia + // can render to it. + _fbInfo.fFBOID = 0; + _fbInfo.fFormat = GL_RGBA8_OES; + + emscripten_glGetIntegerv(GL_SAMPLES, &_sampleCount); + emscripten_glGetIntegerv(GL_STENCIL_BITS, &_stencil); + } + + void _dispose() { delete this; } + + void _setCanvasSize(int width, int height) { + if (_canvasWidth != width || _canvasHeight != height) { + _canvasWidth = width; + _canvasHeight = height; + _recreateSurface(); + } + } + + void _recreateSurface() { + GrBackendRenderTarget target(_canvasWidth, _canvasHeight, _sampleCount, + _stencil, _fbInfo); + _surface = SkSurface::MakeFromBackendRenderTarget( + _grContext.get(), target, kBottomLeft_GrSurfaceOrigin, + kRGBA_8888_SkColorType, SkColorSpace::MakeSRGB(), nullptr); + } + + void _renderPicture(const SkPicture* picture) { + if (!_surface) { + printf("Can't render picture with no surface.\n"); + return; + } + + auto canvas = _surface->getCanvas(); + canvas->drawPicture(picture); + _surface->flush(); + } + + std::string _canvasID; + + int _canvasWidth = 0; + int _canvasHeight = 0; + + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE _glContext = 0; + sk_sp _grContext = nullptr; + sk_sp _surface = nullptr; + GrGLFramebufferInfo _fbInfo; + GrGLint _sampleCount; + GrGLint _stencil; + + pthread_t _thread; + + friend void fDispose(Surface* surface); + friend void fSetCanvasSize(Surface* surface, int width, int height); + friend void fRenderPicture(Surface* surface, SkPicture* picture); +}; + +void fDispose(Surface* surface) { + surface->_dispose(); +} + +void fSetCanvasSize(Surface* surface, int width, int height) { + surface->_setCanvasSize(width, height); +} + +void fRenderPicture(Surface* surface, SkPicture* picture) { + surface->_renderPicture(picture); + picture->unref(); +} + +} // namespace + +SKWASM_EXPORT Surface* surface_createFromCanvas(const char* canvasID) { + return new Surface(canvasID); +} + +SKWASM_EXPORT void surface_destroy(Surface* surface) { + surface->dispose(); +} + +SKWASM_EXPORT void surface_setCanvasSize(Surface* surface, + int width, + int height) { + surface->setCanvasSize(width, height); +} + +SKWASM_EXPORT void surface_renderPicture(Surface* surface, SkPicture* picture) { + surface->renderPicture(picture); +} diff --git a/lib/web_ui/skwasm/window.cpp b/lib/web_ui/skwasm/window.cpp new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/lib/web_ui/skwasm/wrappers.h b/lib/web_ui/skwasm/wrappers.h new file mode 100644 index 0000000000000..d2b94dd2f2737 --- /dev/null +++ b/lib/web_ui/skwasm/wrappers.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkSurface.h" + +namespace Skwasm { + +struct SurfaceWrapper { + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context; + sk_sp grContext; + sk_sp surface; +}; + +struct CanvasWrapper { + EMSCRIPTEN_WEBGL_CONTEXT_HANDLE context; + SkCanvas* canvas; +}; + +inline void makeCurrent(EMSCRIPTEN_WEBGL_CONTEXT_HANDLE handle) { + if (!handle) + return; + + int result = emscripten_webgl_make_context_current(handle); + if (result != EMSCRIPTEN_RESULT_SUCCESS) { + printf("make_context failed: %d", result); + } +} + +} // namespace Skwasm From b5a42f451971af24c448ababbf6a1b8a6ce6800c Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 28 Sep 2022 14:52:02 -0700 Subject: [PATCH 02/34] A few fixes. --- .../engine/skwasm/skwasm_impl/src/canvas.dart | 99 ++++++++++++++----- .../engine/skwasm/skwasm_impl/src/paint.dart | 1 + 2 files changed, 74 insertions(+), 26 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart index 3a71410350be0..f6f11e08eec36 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart @@ -15,7 +15,7 @@ import 'raw/raw_picture.dart'; import 'vertices.dart'; class SkwasmCanvas implements ui.Canvas { - factory SkwasmCanvas(PictureRecorder recorder, [ui.Rect cullRect = ui.Rect.largest]) { + factory SkwasmCanvas(SkwasmPictureRecorder recorder, [ui.Rect cullRect = ui.Rect.largest]) { return SkwasmCanvas.fromHandle(withStackScope((StackScope s) { return pictureRecorder_beginRecording( recorder.handle, s.convertRect(cullRect)); @@ -29,11 +29,15 @@ class SkwasmCanvas implements ui.Canvas { canvas_destroy(_handle); } + @override void save() { canvas_save(_handle); } - void saveLayer(ui.Rect? bounds, Paint paint) { + @override + void saveLayer(ui.Rect? bounds, ui.Paint uiPaint) { + assert(uiPaint is SkwasmPaint); + final SkwasmPaint paint = uiPaint as SkwasmPaint; if (bounds != null) { withStackScope((StackScope s) { canvas_saveLayer(_handle, s.convertRect(bounds), paint.handle); @@ -43,36 +47,44 @@ class SkwasmCanvas implements ui.Canvas { } } + @override void restore() { canvas_restore(_handle); } + @override int getSaveCount() { return canvas_getSaveCount(_handle).toIntSigned(); } + @override void translate(double dx, double dy) { canvas_translate(_handle, dx.toWasmF32(), dy.toWasmF32()); } + @override void scale(double sx, [double? sy]) { canvas_scale(_handle, sx.toWasmF32(), (sy ?? sx).toWasmF32()); } + @override void rotate(double radians) { canvas_rotate(_handle, ui.toDegrees(radians).toWasmF32()); } + @override void skew(double sx, double sy) { canvas_skew(_handle, sx.toWasmF32(), sy.toWasmF32()); } + @override void transform(Float64List matrix4) { withStackScope((StackScope s) { canvas_transform(_handle, s.convertMatrix4toSkM44(matrix4)); }); } + @override void clipRect(ui.Rect rect, {ui.ClipOp clipOp = ui.ClipOp.intersect, bool doAntiAlias = true}) { withStackScope((StackScope s) { @@ -81,62 +93,83 @@ class SkwasmCanvas implements ui.Canvas { }); } + @override void clipRRect(ui.RRect rrect, {bool doAntialias = true}) { withStackScope((StackScope s) { canvas_clipRRect(_handle, s.convertRRect(rrect), doAntialias.toWasmI32()); }); } - void clipPath(Path path, {bool doAntiAlias = true}) { + @override + void clipPath(ui.Path uiPath, {bool doAntiAlias = true}) { + assert(uiPath is SkwasmPath); + final SkwasmPath path = uiPath as SkwasmPath; canvas_clipPath(_handle, path.handle, doAntiAlias.toWasmI32()); } + @override void drawColor(ui.Color color, ui.BlendMode blendMode) { canvas_drawColor( _handle, color.value.toWasmI32(), blendMode.index.toWasmI32()); } - void drawLine(ui.Offset p1, ui.Offset p2, Paint paint) { + @override + void drawLine(ui.Offset p1, ui.Offset p2, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; canvas_drawLine(_handle, p1.dx.toWasmF32(), p1.dy.toWasmF32(), p2.dx.toWasmF32(), p2.dy.toWasmF32(), paint.handle); } - void drawPaint(Paint paint) { + @override + void drawPaint(ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; canvas_drawPaint(_handle, paint.handle); } - void drawRect(ui.Rect rect, Paint paint) { + @override + void drawRect(ui.Rect rect, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvas_drawRect(_handle, s.convertRect(rect), paint.handle); }); } - void drawRRect(ui.RRect rrect, Paint paint) { + @override + void drawRRect(ui.RRect rrect, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvas_drawRRect(_handle, s.convertRRect(rrect), paint.handle); }); } - void drawDRRect(ui.RRect outer, ui.RRect inner, Paint paint) { + @override + void drawDRRect(ui.RRect outer, ui.RRect inner, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvas_drawDRRect( _handle, s.convertRRect(outer), s.convertRRect(inner), paint.handle); }); } - void drawOval(ui.Rect rect, Paint paint) { + @override + void drawOval(ui.Rect rect, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvas_drawOval(_handle, s.convertRect(rect), paint.handle); }); } - void drawCircle(ui.Offset center, double radius, Paint paint) { + @override + void drawCircle(ui.Offset center, double radius, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; canvas_drawCircle(_handle, center.dx.toWasmF32(), center.dy.toWasmF32(), radius.toWasmF32(), paint.handle); } + @override void drawArc(ui.Rect rect, double startAngle, double sweepAngle, bool useCenter, - Paint paint) { + ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvas_drawArc( _handle, @@ -148,68 +181,82 @@ class SkwasmCanvas implements ui.Canvas { }); } - void drawPath(Path path, Paint paint) { + @override + void drawPath(ui.Path uiPath, ui.Paint uiPaint) { + final SkwasmPaint paint = uiPaint as SkwasmPaint; + final SkwasmPath path = uiPath as SkwasmPath; canvas_drawPath(_handle, path.handle, paint.handle); } - void drawImage(Image image, ui.Offset offset, Paint paint) { + @override + void drawImage(ui.Image uiImage, ui.Offset offset, ui.Paint uiPaint) { throw UnimplementedError(); } - void drawImageRect(Image image, ui.Rect src, ui.Rect dst, Paint paint) { + @override + void drawImageRect(ui.Image uiImage, ui.Rect src, ui.Rect dst, ui.Paint uiPaint) { throw UnimplementedError(); } - void drawImageNine(Image image, ui.Rect center, ui.Rect dst, Paint paint) { + @override + void drawImageNine(ui.Image uiImage, ui.Rect center, ui.Rect dst, ui.Paint uiPaint) { throw UnimplementedError(); } - void drawPicture(Picture picture) { - canvas_drawPicture(_handle, picture.handle); + @override + void drawPicture(ui.Picture picture) { + canvas_drawPicture(_handle, (picture as SkwasmPicture).handle); } - void drawParagraph(Paragraph paragraph, ui.Offset offset) { + @override + void drawParagraph(ui.Paragraph uiParagraph, ui.Offset offset) { throw UnimplementedError(); } - void drawPoints(ui.PointMode pointMode, List points, Paint paint) { + @override + void drawPoints(ui.PointMode pointMode, List points, ui.Paint paint) { throw UnimplementedError(); } - void drawRawPoints(ui.PointMode pointMode, Float32List points, Paint paint) { + @override + void drawRawPoints(ui.PointMode pointMode, Float32List points, ui.Paint paint) { throw UnimplementedError(); } - void drawVertices(Vertices vertices, ui.BlendMode blendMode, Paint paint) { + @override + void drawVertices(ui.Vertices vertices, ui.BlendMode blendMode, ui.Paint paint) { throw UnimplementedError(); } + @override void drawAtlas( - Image atlas, + ui.Image atlas, List transforms, List rects, List? colors, ui.BlendMode? blendMode, ui.Rect? cullRect, - Paint paint, + ui.Paint paint, ) { throw UnimplementedError(); } + @override void drawRawAtlas( - Image atlas, + ui.Image atlas, Float32List rstTransforms, Float32List rects, Int32List? colors, ui.BlendMode? blendMode, ui.Rect? cullRect, - Paint paint, + ui.Paint paint, ) { throw UnimplementedError(); } + @override void drawShadow( - Path path, + ui.Path path, ui.Color color, double elevation, bool transparentOccluder, diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart index e216e79601093..599bbcda139aa 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart @@ -23,6 +23,7 @@ class SkwasmPaint implements ui.Paint { @override set blendMode(ui.BlendMode blendMode) { if (_cachedBlendMode != blendMode) { + _cachedBlendMode = blendMode; paint_setBlendMode(_handle, blendMode.index.toWasmI32()); } } From 313a0550b7f372b09bf623975297346e57fc6d05 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 29 Sep 2022 15:52:11 -0700 Subject: [PATCH 03/34] Converted wasm pragmas to FfiNative annotations. --- .../engine/skwasm/skwasm_impl/src/canvas.dart | 89 ++--- .../engine/skwasm/skwasm_impl/src/paint.dart | 67 ++-- .../skwasm/skwasm_impl/src/paragraph.dart | 24 ++ .../engine/skwasm/skwasm_impl/src/path.dart | 185 +++++------ .../skwasm/skwasm_impl/src/picture.dart | 34 +- .../skwasm_impl/src/raw/raw_canvas.dart | 119 ++++--- .../skwasm_impl/src/raw/raw_memory.dart | 22 +- .../skwasm/skwasm_impl/src/raw/raw_paint.dart | 76 ++--- .../skwasm/skwasm_impl/src/raw/raw_path.dart | 308 +++++++++++------- .../skwasm_impl/src/raw/raw_picture.dart | 40 ++- .../skwasm_impl/src/raw/raw_surface.dart | 30 +- .../skwasm/skwasm_impl/src/surface.dart | 13 +- .../skwasm/skwasm_impl/src/vertices.dart | 9 + 13 files changed, 523 insertions(+), 493 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart index f6f11e08eec36..3009c07b0cb85 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart @@ -1,37 +1,31 @@ import 'dart:ffi'; import 'dart:typed_data'; -import 'dart:wasm'; import 'package:ui/ui.dart' as ui; -import 'image.dart'; import 'paint.dart'; -import 'paragraph.dart'; import 'path.dart'; import 'picture.dart'; import 'raw/raw_canvas.dart'; import 'raw/raw_memory.dart'; import 'raw/raw_picture.dart'; -import 'vertices.dart'; class SkwasmCanvas implements ui.Canvas { - factory SkwasmCanvas(SkwasmPictureRecorder recorder, [ui.Rect cullRect = ui.Rect.largest]) { - return SkwasmCanvas.fromHandle(withStackScope((StackScope s) { - return pictureRecorder_beginRecording( - recorder.handle, s.convertRect(cullRect)); - })); - } + factory SkwasmCanvas(SkwasmPictureRecorder recorder, [ui.Rect cullRect = ui.Rect.largest]) => + SkwasmCanvas.fromHandle(withStackScope((StackScope s) => + pictureRecorderBeginRecording(recorder.handle, s.convertRect(cullRect)) + )); SkwasmCanvas.fromHandle(this._handle); CanvasHandle _handle; void delete() { - canvas_destroy(_handle); + canvasDestroy(_handle); } @override void save() { - canvas_save(_handle); + canvasSave(_handle); } @override @@ -40,47 +34,37 @@ class SkwasmCanvas implements ui.Canvas { final SkwasmPaint paint = uiPaint as SkwasmPaint; if (bounds != null) { withStackScope((StackScope s) { - canvas_saveLayer(_handle, s.convertRect(bounds), paint.handle); + canvasSaveLayer(_handle, s.convertRect(bounds), paint.handle); }); } else { - canvas_saveLayer(_handle, nullptr, paint.handle); + canvasSaveLayer(_handle, nullptr, paint.handle); } } @override void restore() { - canvas_restore(_handle); + canvasRestore(_handle); } @override - int getSaveCount() { - return canvas_getSaveCount(_handle).toIntSigned(); - } + int getSaveCount() => canvasGetSaveCount(_handle); @override - void translate(double dx, double dy) { - canvas_translate(_handle, dx.toWasmF32(), dy.toWasmF32()); - } + void translate(double dx, double dy) => canvasTranslate(_handle, dx, dy); @override - void scale(double sx, [double? sy]) { - canvas_scale(_handle, sx.toWasmF32(), (sy ?? sx).toWasmF32()); - } + void scale(double sx, [double? sy]) => canvasScale(_handle, sx, sy ?? sx); @override - void rotate(double radians) { - canvas_rotate(_handle, ui.toDegrees(radians).toWasmF32()); - } + void rotate(double radians) => canvasRotate(_handle, ui.toDegrees(radians)); @override - void skew(double sx, double sy) { - canvas_skew(_handle, sx.toWasmF32(), sy.toWasmF32()); - } + void skew(double sx, double sy) => canvasSkew(_handle, sx, sy); @override void transform(Float64List matrix4) { withStackScope((StackScope s) { - canvas_transform(_handle, s.convertMatrix4toSkM44(matrix4)); + canvasTransform(_handle, s.convertMatrix4toSkM44(matrix4)); }); } @@ -88,15 +72,14 @@ class SkwasmCanvas implements ui.Canvas { void clipRect(ui.Rect rect, {ui.ClipOp clipOp = ui.ClipOp.intersect, bool doAntiAlias = true}) { withStackScope((StackScope s) { - canvas_clipRect(_handle, s.convertRect(rect), clipOp.index.toWasmI32(), - doAntiAlias.toWasmI32()); + canvasClipRect(_handle, s.convertRect(rect), clipOp.index, doAntiAlias); }); } @override - void clipRRect(ui.RRect rrect, {bool doAntialias = true}) { + void clipRRect(ui.RRect rrect, {bool doAntiAlias = true}) { withStackScope((StackScope s) { - canvas_clipRRect(_handle, s.convertRRect(rrect), doAntialias.toWasmI32()); + canvasClipRRect(_handle, s.convertRRect(rrect), doAntiAlias); }); } @@ -104,33 +87,30 @@ class SkwasmCanvas implements ui.Canvas { void clipPath(ui.Path uiPath, {bool doAntiAlias = true}) { assert(uiPath is SkwasmPath); final SkwasmPath path = uiPath as SkwasmPath; - canvas_clipPath(_handle, path.handle, doAntiAlias.toWasmI32()); + canvasClipPath(_handle, path.handle, doAntiAlias); } @override - void drawColor(ui.Color color, ui.BlendMode blendMode) { - canvas_drawColor( - _handle, color.value.toWasmI32(), blendMode.index.toWasmI32()); - } + void drawColor(ui.Color color, ui.BlendMode blendMode) => + canvasDrawColor(_handle, color.value, blendMode.index); @override void drawLine(ui.Offset p1, ui.Offset p2, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; - canvas_drawLine(_handle, p1.dx.toWasmF32(), p1.dy.toWasmF32(), - p2.dx.toWasmF32(), p2.dy.toWasmF32(), paint.handle); + canvasDrawLine(_handle, p1.dx, p1.dy, p2.dx, p2.dy, paint.handle); } @override void drawPaint(ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; - canvas_drawPaint(_handle, paint.handle); + canvasDrawPaint(_handle, paint.handle); } @override void drawRect(ui.Rect rect, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvas_drawRect(_handle, s.convertRect(rect), paint.handle); + canvasDrawRect(_handle, s.convertRect(rect), paint.handle); }); } @@ -138,7 +118,7 @@ class SkwasmCanvas implements ui.Canvas { void drawRRect(ui.RRect rrect, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvas_drawRRect(_handle, s.convertRRect(rrect), paint.handle); + canvasDrawRRect(_handle, s.convertRRect(rrect), paint.handle); }); } @@ -146,7 +126,7 @@ class SkwasmCanvas implements ui.Canvas { void drawDRRect(ui.RRect outer, ui.RRect inner, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvas_drawDRRect( + canvasDrawDRRect( _handle, s.convertRRect(outer), s.convertRRect(inner), paint.handle); }); } @@ -155,15 +135,14 @@ class SkwasmCanvas implements ui.Canvas { void drawOval(ui.Rect rect, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvas_drawOval(_handle, s.convertRect(rect), paint.handle); + canvasDrawOval(_handle, s.convertRect(rect), paint.handle); }); } @override void drawCircle(ui.Offset center, double radius, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; - canvas_drawCircle(_handle, center.dx.toWasmF32(), center.dy.toWasmF32(), - radius.toWasmF32(), paint.handle); + canvasDrawCircle(_handle, center.dx, center.dy, radius, paint.handle); } @override @@ -171,12 +150,12 @@ class SkwasmCanvas implements ui.Canvas { ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvas_drawArc( + canvasDrawArc( _handle, s.convertRect(rect), - ui.toDegrees(startAngle).toWasmF32(), - ui.toDegrees(sweepAngle).toWasmF32(), - useCenter.toWasmI32(), + ui.toDegrees(startAngle), + ui.toDegrees(sweepAngle), + useCenter, paint.handle); }); } @@ -185,7 +164,7 @@ class SkwasmCanvas implements ui.Canvas { void drawPath(ui.Path uiPath, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; final SkwasmPath path = uiPath as SkwasmPath; - canvas_drawPath(_handle, path.handle, paint.handle); + canvasDrawPath(_handle, path.handle, paint.handle); } @override @@ -205,7 +184,7 @@ class SkwasmCanvas implements ui.Canvas { @override void drawPicture(ui.Picture picture) { - canvas_drawPicture(_handle, (picture as SkwasmPicture).handle); + canvasDrawPicture(_handle, (picture as SkwasmPicture).handle); } @override diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart index 599bbcda139aa..6c241d1be8f25 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart @@ -1,11 +1,9 @@ -import 'dart:wasm'; - import 'package:ui/ui.dart' as ui; import 'raw/raw_paint.dart'; class SkwasmPaint implements ui.Paint { factory SkwasmPaint() { - return SkwasmPaint._fromHandle(paint_create()); + return SkwasmPaint._fromHandle(paintCreate()); } SkwasmPaint._fromHandle(this._handle); @@ -24,69 +22,53 @@ class SkwasmPaint implements ui.Paint { set blendMode(ui.BlendMode blendMode) { if (_cachedBlendMode != blendMode) { _cachedBlendMode = blendMode; - paint_setBlendMode(_handle, blendMode.index.toWasmI32()); + paintSetBlendMode(_handle, blendMode.index); } } @override - ui.PaintingStyle get style { - return ui.PaintingStyle.values[paint_getPaintStyle(_handle).toIntSigned()]; - } + ui.PaintingStyle get style => ui.PaintingStyle.values[paintGetPaintStyle(_handle)]; @override - set style(ui.PaintingStyle style) { - paint_setPaintStyle(_handle, style.index.toWasmI32()); - } + set style(ui.PaintingStyle style) => paintSetPaintStyle(_handle, style.index); @override - double get strokeWidth { - return paint_getStrokeWidth(_handle).toDouble(); - } + double get strokeWidth => paintGetStrokeWidth(_handle); @override - set strokeWidth(double width) { - paint_setStrokeWidth(_handle, width.toWasmF32()); - } + set strokeWidth(double width) => paintSetStrokeWidth(_handle, width); @override - ui.StrokeCap get strokeCap { - return ui.StrokeCap.values[paint_getStrokeCap(_handle).toIntSigned()]; - } + ui.StrokeCap get strokeCap => ui.StrokeCap.values[paintGetStrokeCap(_handle)]; @override - set strokeCap(ui.StrokeCap cap) { - paint_setStrokeCap(_handle, cap.index.toWasmI32()); - } + set strokeCap(ui.StrokeCap cap) => paintSetStrokeCap(_handle, cap.index); @override - ui.StrokeJoin get strokeJoin { - return ui.StrokeJoin.values[paint_getStrokeJoin(_handle).toIntSigned()]; - } + ui.StrokeJoin get strokeJoin => ui.StrokeJoin.values[paintGetStrokeJoin(_handle)]; @override - set strokeJoin(ui.StrokeJoin join) { - paint_setStrokeJoin(_handle, join.index.toWasmI32()); - } + set strokeJoin(ui.StrokeJoin join) => paintSetStrokeJoin(_handle, join.index); @override - bool get isAntiAlias { - return paint_getAntiAlias(_handle).toIntSigned() != 0; - } + bool get isAntiAlias => paintGetAntiAlias(_handle); + @override - set isAntiAlias(bool value) { - paint_setAntiAlias(_handle, value ? 1.toWasmI32() : 0.toWasmI32()); - } + set isAntiAlias(bool value) => paintSetAntiAlias(_handle, value); @override - ui.Color get color { - return ui.Color(paint_getColorInt(_handle).toIntSigned()); - } + ui.Color get color => ui.Color(paintGetColorInt(_handle)); @override - set color(ui.Color color) { - paint_setColorInt(_handle, color.value.toWasmI32()); - } + set color(ui.Color color) => paintSetColorInt(_handle, color.value); + + @override + double get strokeMiterLimit => paintGetMiterLimit(_handle); + @override + set strokeMiterLimit(double limit) => paintSetMiterLimit(_handle, limit); + + // Unimplemented stuff below @override ui.ColorFilter? colorFilter; @@ -103,8 +85,5 @@ class SkwasmPaint implements ui.Paint { ui.MaskFilter? maskFilter; @override - ui.Shader? shader; - - @override - double strokeMiterLimit = 0.0; + ui.Shader? shader; } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart index 33873c8d426ed..d142e5b46282d 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart @@ -62,65 +62,89 @@ class SkwasmLineMetrics implements ui.LineMetrics { } class SkwasmParagraph implements ui.Paragraph { + @override double get width { throw UnimplementedError(); } + @override double get height { throw UnimplementedError(); } + @override double get longestLine { throw UnimplementedError(); } + @override double get minIntrinsicWidth { throw UnimplementedError(); } + @override double get maxIntrinsicWidth { throw UnimplementedError(); } + @override double get alphabeticBaseline { throw UnimplementedError(); } + @override double get ideographicBaseline { throw UnimplementedError(); } + @override bool get didExceedMaxLines { throw UnimplementedError(); } + @override void layout(ui.ParagraphConstraints constraints) { throw UnimplementedError(); } + @override List getBoxesForRange(int start, int end, {ui.BoxHeightStyle boxHeightStyle = ui.BoxHeightStyle.tight, ui.BoxWidthStyle boxWidthStyle = ui.BoxWidthStyle.tight}) { throw UnimplementedError(); } + @override ui.TextPosition getPositionForOffset(ui.Offset offset) { throw UnimplementedError(); } + @override ui.TextRange getWordBoundary(ui.TextPosition position) { throw UnimplementedError(); } + @override ui.TextRange getLineBoundary(ui.TextPosition position) { throw UnimplementedError(); } + @override List getBoxesForPlaceholders() { throw UnimplementedError(); } + @override List computeLineMetrics() { throw UnimplementedError(); } + + @override + // TODO: implement debugDisposed + bool get debugDisposed => throw UnimplementedError(); + + @override + void dispose() { + // TODO: implement dispose + } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart index e770dfcc7c7a0..5633b995990e4 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart @@ -1,6 +1,5 @@ import 'dart:ffi'; import 'dart:typed_data'; -import 'dart:wasm'; import 'package:ui/src/engine.dart' as engine; import 'package:ui/ui.dart' as ui; @@ -19,11 +18,11 @@ enum PathArcSize { class SkwasmPath implements ui.Path { factory SkwasmPath() { - return SkwasmPath._fromHandle(path_create()); + return SkwasmPath._fromHandle(pathCreate()); } factory SkwasmPath.from(SkwasmPath source) { - return SkwasmPath._fromHandle(path_copy(source._handle)); + return SkwasmPath._fromHandle(pathCopy(source._handle)); } SkwasmPath._fromHandle(this._handle); @@ -32,89 +31,74 @@ class SkwasmPath implements ui.Path { PathHandle get handle => _handle; void delete() { - path_destroy(_handle); + pathDestroy(_handle); } @override - ui.PathFillType get fillType { - return ui.PathFillType.values[path_getFillType(_handle).toIntSigned()]; - } + ui.PathFillType get fillType => ui.PathFillType.values[pathGetFillType(_handle)]; @override - set fillType(ui.PathFillType fillType) { - path_setFillType(_handle, fillType.index.toWasmI32()); - } + set fillType(ui.PathFillType fillType) => pathSetFillType(_handle, fillType.index); @override - void moveTo(double x, double y) { - path_moveTo(_handle, x.toWasmF32(), y.toWasmF32()); - } + void moveTo(double x, double y) => pathMoveTo(_handle, x, y); @override - void relativeMoveTo(double x, double y) { - path_relativeMoveTo(_handle, x.toWasmF32(), y.toWasmF32()); - } + void relativeMoveTo(double x, double y) => pathRelativeMoveTo(_handle, x, y); @override - void lineTo(double x, double y) { - path_lineTo(_handle, x.toWasmF32(), y.toWasmF32()); - } + void lineTo(double x, double y) => pathLineTo(_handle, x, y); @override - void relativeLineTo(double x, double y) { - path_relativeMoveTo(_handle, x.toWasmF32(), y.toWasmF32()); - } + void relativeLineTo(double x, double y) => pathRelativeMoveTo(_handle, x, y); @override - void quadraticBezierTo(double x1, double y1, double x2, double y2) { - path_quadraticBezierTo(_handle, x1.toWasmF32(), y1.toWasmF32(), - x2.toWasmF32(), y2.toWasmF32()); - } + void quadraticBezierTo(double x1, double y1, double x2, double y2) => + pathQuadraticBezierTo(_handle, x1, y1, x2, y2); @override - void relativeQuadraticBezierTo(double x1, double y1, double x2, double y2) { - path_relativeQuadraticBezierTo(_handle, x1.toWasmF32(), y1.toWasmF32(), - x2.toWasmF32(), y2.toWasmF32()); - } + void relativeQuadraticBezierTo(double x1, double y1, double x2, double y2) => + pathRelativeQuadraticBezierTo(_handle, x1, y1, x2, y2); @override void cubicTo( - double x1, double y1, double x2, double y2, double x3, double y3) { - path_cubicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), x2.toWasmF32(), - y2.toWasmF32(), x3.toWasmF32(), y3.toWasmF32()); - } + double x1, + double y1, + double x2, + double y2, + double x3, + double y3) => + pathCubicTo(_handle, x1, y1, x2, y2, x3, y3); @override void relativeCubicTo( - double x1, double y1, double x2, double y2, double x3, double y3) { - path_relativeCubicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), - x2.toWasmF32(), y2.toWasmF32(), x3.toWasmF32(), y3.toWasmF32()); - } + double x1, + double y1, + double x2, + double y2, + double x3, + double y3) => + pathRelativeCubicTo(_handle, x1, y1, x2, y2, x3, y3); @override - void conicTo(double x1, double y1, double x2, double y2, double w) { - path_conicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), x2.toWasmF32(), - y2.toWasmF32(), w.toWasmF32()); - } + void conicTo(double x1, double y1, double x2, double y2, double w) => + pathConicTo(_handle, x1, y1, x2, y2, w); @override - void relativeConicTo(double x1, double y1, double x2, double y2, double w) { - path_relativeConicTo(_handle, x1.toWasmF32(), y1.toWasmF32(), - x2.toWasmF32(), y2.toWasmF32(), w.toWasmF32()); - } + void relativeConicTo(double x1, double y1, double x2, double y2, double w) => + pathRelativeConicTo(_handle, x1, y1, x2, y2, w); @override void arcTo( ui.Rect rect, double startAngle, double sweepAngle, bool forceMoveTo) { withStackScope((StackScope s) { - final WasmI32 forceMoveToWasm = - forceMoveTo ? 1.toWasmI32() : 0.toWasmI32(); - path_arcToOval( + pathArcToOval( _handle, s.convertRect(rect), - ui.toDegrees(startAngle).toWasmF32(), - ui.toDegrees(sweepAngle).toWasmF32(), - forceMoveToWasm); + ui.toDegrees(startAngle), + ui.toDegrees(sweepAngle), + forceMoveTo + ); }); } @@ -130,15 +114,16 @@ class SkwasmPath implements ui.Path { largeArc ? PathArcSize.large : PathArcSize.small; final PathDirection pathDirection = clockwise ? PathDirection.clockwise : PathDirection.counterClockwise; - path_arcToRotated( + pathArcToRotated( _handle, - radius.x.toWasmF32(), - radius.y.toWasmF32(), - ui.toDegrees(rotation).toWasmF32(), - arcSize.index.toWasmI32(), - pathDirection.index.toWasmI32(), - arcEnd.dx.toWasmF32(), - arcEnd.dy.toWasmF32()); + radius.x, + radius.y, + ui.toDegrees(rotation), + arcSize.index, + pathDirection.index, + arcEnd.dx, + arcEnd.dy + ); } @override @@ -153,52 +138,55 @@ class SkwasmPath implements ui.Path { largeArc ? PathArcSize.large : PathArcSize.small; final PathDirection pathDirection = clockwise ? PathDirection.clockwise : PathDirection.counterClockwise; - path_relativeArcToRotated( + pathRelativeArcToRotated( _handle, - radius.x.toWasmF32(), - radius.y.toWasmF32(), - ui.toDegrees(rotation).toWasmF32(), - arcSize.index.toWasmI32(), - pathDirection.index.toWasmI32(), - arcEndDelta.dx.toWasmF32(), - arcEndDelta.dy.toWasmF32()); + radius.x, + radius.y, + ui.toDegrees(rotation), + arcSize.index, + pathDirection.index, + arcEndDelta.dx, + arcEndDelta.dy + ); } @override void addRect(ui.Rect rect) { withStackScope((StackScope s) { - path_addRect(_handle, s.convertRect(rect)); + pathAddRect(_handle, s.convertRect(rect)); }); } @override void addOval(ui.Rect rect) { withStackScope((StackScope s) { - path_addOval(_handle, s.convertRect(rect)); + pathAddOval(_handle, s.convertRect(rect)); }); } @override void addArc(ui.Rect rect, double startAngle, double sweepAngle) { withStackScope((StackScope s) { - path_addArc(_handle, s.convertRect(rect), - ui.toDegrees(startAngle).toWasmF32(), ui.toDegrees(sweepAngle).toWasmF32()); + pathAddArc( + _handle, + s.convertRect(rect), + ui.toDegrees(startAngle), + ui.toDegrees(sweepAngle) + ); }); } @override void addPolygon(List points, bool close) { withStackScope((StackScope s) { - final WasmI32 closeWasm = close ? 1.toWasmI32() : 0.toWasmI32(); - path_addPolygon(_handle, s.convertPointArray(points), - points.length.toWasmI32(), closeWasm); + pathAddPolygon(_handle, s.convertPointArray(points), points.length, close); }); } @override void addRRect(ui.RRect rrect) { withStackScope((StackScope s) { - path_addRRect(_handle, s.convertRRect(rrect)); + pathAddRRect(_handle, s.convertRRect(rrect)); }); } @@ -219,39 +207,28 @@ class SkwasmPath implements ui.Path { s.convertMatrix4toSkMatrix(matrix4 ?? engine.Matrix4.identity().toFloat64()); convertedMatrix[2] += offset.dx; convertedMatrix[5] += offset.dy; - final WasmI32 extendWasm = extend ? 1.toWasmI32() : 0.toWasmI32(); - path_addPath(_handle, (path as SkwasmPath)._handle, convertedMatrix, extendWasm); + pathAddPath(_handle, (path as SkwasmPath)._handle, convertedMatrix, extend); }); } @override - void close() { - path_close(_handle); - } + void close() => pathClose(_handle); @override - void reset() { - path_reset(_handle); - } + void reset() => pathReset(_handle); @override - bool contains(ui.Offset point) { - final WasmI32 result = - path_contains(_handle, point.dx.toWasmF32(), point.dy.toWasmF32()); - return result.toIntSigned() != 0; - } + bool contains(ui.Offset point) => pathContains(_handle, point.dx, point.dy); @override - ui.Path shift(ui.Offset offset) { - return transform( - engine.Matrix4.translationValues(offset.dx, offset.dy, 0.0).toFloat64()); - } + ui.Path shift(ui.Offset offset) => + transform(engine.Matrix4.translationValues(offset.dx, offset.dy, 0.0).toFloat64()); @override ui.Path transform(Float64List matrix4) { return withStackScope((StackScope s) { - final PathHandle newPathHandle = path_copy(_handle); - path_transform(newPathHandle, s.convertMatrix4toSkMatrix(matrix4)); + final PathHandle newPathHandle = pathCopy(_handle); + pathTransform(newPathHandle, s.convertMatrix4toSkMatrix(matrix4)); return SkwasmPath._fromHandle(newPathHandle); }); } @@ -260,16 +237,22 @@ class SkwasmPath implements ui.Path { ui.Rect getBounds() { return withStackScope((StackScope s) { final Pointer rectBuffer = s.allocFloatArray(4); - path_getBounds(_handle, rectBuffer); + pathGetBounds(_handle, rectBuffer); return ui.Rect.fromLTRB( - rectBuffer[0], rectBuffer[1], rectBuffer[2], rectBuffer[3]); + rectBuffer[0], + rectBuffer[1], + rectBuffer[2], + rectBuffer[3] + ); }); } - static SkwasmPath combine(ui.PathOperation operation, SkwasmPath path1, SkwasmPath path2) { - return SkwasmPath._fromHandle(path_combine( - operation.index.toWasmI32(), path1._handle, path2._handle)); - } + static SkwasmPath combine( + ui.PathOperation operation, + SkwasmPath path1, + SkwasmPath path2) => + SkwasmPath._fromHandle(pathCombine( + operation.index, path1._handle, path2._handle)); @override ui.PathMetrics computeMetrics({bool forceClosed = false}) { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart index a4ede5558ad0b..3e6d6892322e4 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart @@ -1,24 +1,23 @@ -import 'image.dart'; -import 'raw/raw_picture.dart'; import 'package:ui/ui.dart' as ui; +import 'raw/raw_picture.dart'; + class SkwasmPicture implements ui.Picture { SkwasmPicture.fromHandle(this._handle); final PictureHandle _handle; PictureHandle get handle => _handle; + @override Future toImage(int width, int height) { throw UnimplementedError(); } - void dispose() { - picture_dispose(_handle); - } + @override + void dispose() => pictureDispose(_handle); - int get approximateBytesUsed { - return picture_approxmateBytesUsed(_handle).toIntSigned(); - } + @override + int get approximateBytesUsed => pictureApproximateBytesUsed(_handle); @override // TODO: implement debugDisposed @@ -32,20 +31,21 @@ class SkwasmPicture implements ui.Picture { } class SkwasmPictureRecorder implements ui.PictureRecorder { - factory SkwasmPictureRecorder() { - return SkwasmPictureRecorder._fromHandle(pictureRecorder_create()); - } + factory SkwasmPictureRecorder() => + SkwasmPictureRecorder._fromHandle(pictureRecorderCreate()); SkwasmPictureRecorder._fromHandle(this._handle); final PictureRecorderHandle _handle; PictureRecorderHandle get handle => _handle; - void delete() { - pictureRecorder_destroy(_handle); - } + void delete() => pictureRecorderDestroy(_handle); - SkwasmPicture endRecording() { - return SkwasmPicture.fromHandle(pictureRecorder_endRecording(_handle)); - } + @override + SkwasmPicture endRecording() => + SkwasmPicture.fromHandle(pictureRecorderEndRecording(_handle)); + + @override + // TODO: implement isRecording + bool get isRecording => throw UnimplementedError(); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart index 9464d5f106db9..91350e335ebae 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart @@ -1,104 +1,99 @@ import 'dart:ffi'; -import 'dart:wasm'; import 'raw_geometry.dart'; -import 'raw_memory.dart'; import 'raw_paint.dart'; import 'raw_path.dart'; import 'raw_picture.dart'; class CanvasWrapper extends Opaque {} - typedef CanvasHandle = Pointer; -typedef RawClipOp = WasmI32; - -@pragma('wasm:import', 'skwasm.canvas_destroy') -external void canvas_destroy(CanvasHandle canvas); +@FfiNative('skwasm.canvas_destroy', isLeaf: true) +external void canvasDestroy(CanvasHandle canvas); -@pragma('wasm:import', 'skwasm.canvas_save') -external void canvas_save(CanvasHandle canvas); +@FfiNative('skwasm.canvas_save', isLeaf: true) +external void canvasSave(CanvasHandle canvas); -@pragma('wasm:import', 'skwasm.canvas_saveLayer') -external void canvas_saveLayer( +@FfiNative('skwasm.canvas_saveLayer', isLeaf: true) +external void canvasSaveLayer( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_restore') -external void canvas_restore(CanvasHandle canvas); +@FfiNative('skwasm.canvas_restore', isLeaf: true) +external void canvasRestore(CanvasHandle canvas); -@pragma('wasm:import', 'skwasm.canvas_getSaveCount') -external RawSize canvas_getSaveCount(CanvasHandle canvas); +@FfiNative('skwasm.canvas_getSaveCount', isLeaf: true) +external int canvasGetSaveCount(CanvasHandle canvas); -@pragma('wasm:import', 'skwasm.canvas_translate') -external void canvas_translate(CanvasHandle canvas, RawScalar dx, RawScalar dy); +@FfiNative('skwasm.canvas_translate', isLeaf: true) +external void canvasTranslate(CanvasHandle canvas, double dx, double dy); -@pragma('wasm:import', 'skwasm.canvas_scale') -external void canvas_scale(CanvasHandle canvas, RawScalar sx, RawScalar sy); +@FfiNative('skwasm.canvas_scale', isLeaf: true) +external void canvasScale(CanvasHandle canvas, double sx, double sy); -@pragma('wasm:import', 'skwasm.canvas_rotate') -external void canvas_rotate(CanvasHandle canvas, RawScalar degrees); +@FfiNative('skwasm.canvas_rotate', isLeaf: true) +external void canvasRotate(CanvasHandle canvas, double degrees); -@pragma('wasm:import', 'skwasm.canvas_skew') -external void canvas_skew(CanvasHandle canvas, RawScalar sx, RawScalar sy); +@FfiNative('skwasm.canvas_skew', isLeaf: true) +external void canvasSkew(CanvasHandle canvas, double sx, double sy); -@pragma('wasm:import', 'skwasm.canvas_transform') -external void canvas_transform(CanvasHandle canvas, RawMatrix44 matrix); +@FfiNative('skwasm.canvas_transform', isLeaf: true) +external void canvasTransform(CanvasHandle canvas, RawMatrix44 matrix); -@pragma('wasm:import', 'skwasm.canvas_clipRect') -external void canvas_clipRect( - CanvasHandle canvas, RawRect rect, RawClipOp op, RawBool antialias); +@FfiNative('skwasm.canvas_clipRect', isLeaf: true) +external void canvasClipRect( + CanvasHandle canvas, RawRect rect, int op, bool antialias); -@pragma('wasm:import', 'skwasm.canvas_clipRRect') -external void canvas_clipRRect( - CanvasHandle canvas, RawRRect rrect, RawBool antialias); +@FfiNative('skwasm.canvas_clipRRect', isLeaf: true) +external void canvasClipRRect( + CanvasHandle canvas, RawRRect rrect, bool antialias); -@pragma('wasm:import', 'skwasm.canvas_clipPath') -external void canvas_clipPath( - CanvasHandle canvas, PathHandle path, RawBool antialias); +@FfiNative('skwasm.canvas_clipPath', isLeaf: true) +external void canvasClipPath( + CanvasHandle canvas, PathHandle path, bool antialias); -@pragma('wasm:import', 'skwasm.canvas_drawColor') -external void canvas_drawColor( - CanvasHandle canvas, RawColor color, RawBlendMode blendMode); +@FfiNative('skwasm.canvas_drawColor', isLeaf: true) +external void canvasDrawColor( + CanvasHandle canvas, int color, int blendMode); -@pragma('wasm:import', 'skwasm.canvas_drawLine') -external void canvas_drawLine(CanvasHandle canvas, RawScalar x1, RawScalar y1, - RawScalar x2, RawScalar y2, PaintHandle paint); +@FfiNative('skwasm.canvas_drawLine', isLeaf: true) +external void canvasDrawLine(CanvasHandle canvas, double x1, double y1, + double x2, double y2, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawPaint') -external void canvas_drawPaint(CanvasHandle canvas, PaintHandle paint); +@FfiNative('skwasm.canvas_drawPaint', isLeaf: true) +external void canvasDrawPaint(CanvasHandle canvas, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawRect') -external void canvas_drawRect( +@FfiNative('skwasm.canvas_drawRect', isLeaf: true) +external void canvasDrawRect( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawRRect') -external void canvas_drawRRect( +@FfiNative('skwasm.canvas_drawRRect', isLeaf: true) +external void canvasDrawRRect( CanvasHandle canvas, RawRRect rrect, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawDRRect') -external void canvas_drawDRRect( +@FfiNative('skwasm.canvas_drawDRRect', isLeaf: true) +external void canvasDrawDRRect( CanvasHandle canvas, RawRRect outer, RawRRect inner, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawOval') -external void canvas_drawOval( +@FfiNative('skwasm.canvas_drawOval', isLeaf: true) +external void canvasDrawOval( CanvasHandle canvas, RawRect oval, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawCircle') -external void canvas_drawCircle(CanvasHandle canvas, RawScalar x, RawScalar y, - RawScalar radius, PaintHandle paint); +@FfiNative('skwasm.canvas_drawCircle', isLeaf: true) +external void canvasDrawCircle(CanvasHandle canvas, double x, double y, + double radius, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawArc') -external void canvas_drawArc( +@FfiNative('skwasm.canvas_drawCircle', isLeaf: true) +external void canvasDrawArc( CanvasHandle canvas, RawRect rect, - RawScalar startAngleDegrees, - RawScalar sweepAngleDegrees, - RawBool useCenter, + double startAngleDegrees, + double sweepAngleDegrees, + bool useCenter, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawPath') -external void canvas_drawPath( +@FfiNative('skwasm.canvas_drawPath', isLeaf: true) +external void canvasDrawPath( CanvasHandle canvas, PathHandle path, PaintHandle paint); -@pragma('wasm:import', 'skwasm.canvas_drawPicture') -external void canvas_drawPicture(CanvasHandle canvas, PictureHandle picture); +@FfiNative('skwasm.canvas_drawPicture', isLeaf: true) +external void canvasDrawPicture(CanvasHandle canvas, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart index a9f8c7011e13a..2529d4d1ce7f1 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart @@ -1,32 +1,22 @@ import 'dart:convert'; import 'dart:ffi'; import 'dart:typed_data'; -import 'dart:wasm'; import 'package:ui/ui.dart' as ui; class Stack extends Opaque {} - typedef StackPointer = Pointer; -typedef RawScalar = WasmF32; -typedef RawBool = WasmI32; -typedef RawSize = WasmI32; - /// Generic linear memory allocation -@pragma('wasm:import', 'skwasm.stackAlloc') -external Pointer stackAlloc(RawSize length); +@FfiNative Function(Size)>('skwasm.stackAlloc', isLeaf: true) +external Pointer stackAlloc(int length); -@pragma('wasm:import', 'skwasm.stackSave') +@FfiNative('skwasm.stackSave', isLeaf: true) external StackPointer stackSave(); -@pragma('wasm:import', 'skwasm.stackRestore') +@FfiNative('skwasm.stackRestore', isLeaf: true) external void stackRestore(StackPointer pointer); -extension BoolToRawWasm on bool { - WasmI32 toWasmI32() => this ? 1.toWasmI32() : 0.toWasmI32(); -} - class StackScope { Pointer convertString(String string) { final Utf8Encoder utf8Encoder = utf8.encoder; @@ -111,12 +101,12 @@ class StackScope { Pointer allocInt8Array(int count) { final int length = count * sizeOf(); - return stackAlloc(length.toWasmI32()).cast(); + return stackAlloc(length).cast(); } Pointer allocFloatArray(int count) { final int length = count * sizeOf(); - return stackAlloc(length.toWasmI32()).cast(); + return stackAlloc(length).cast(); } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart index daf8183666eba..8d805a5be1a25 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart @@ -1,64 +1,56 @@ import 'dart:ffi'; -import 'dart:wasm'; -import 'raw_memory.dart'; class RawPaint extends Opaque {} typedef PaintHandle = Pointer; -typedef RawBlendMode = WasmI32; -typedef RawPaintStyle = WasmI32; -typedef RawStrokeCap = WasmI32; -typedef RawStrokeJoin = WasmI32; -typedef RawColor = WasmI32; +@FfiNative('skwasm.paint_create', isLeaf: true) +external PaintHandle paintCreate(); -@pragma('wasm:import', 'skwasm.paint_create') -external PaintHandle paint_create(); +@FfiNative('skwasm.paint_destroy', isLeaf: true) +external void paintDestroy(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_destroy') -external void paint_destroy(PaintHandle paint); +@FfiNative('skwasm.paint_setBlendMode', isLeaf: true) +external void paintSetBlendMode(PaintHandle paint, int blendMode); -@pragma('wasm:import', 'skwasm.paint_setBlendMode') -external void paint_setBlendMode(PaintHandle paint, RawBlendMode blendMode); +@FfiNative('skwasm.paint_setPaintStyle', isLeaf: true) +external void paintSetPaintStyle(PaintHandle paint, int paintStyle); -@pragma('wasm:import', 'skwasm.paint_setStyle') -external void paint_setPaintStyle(PaintHandle paint, RawPaintStyle paintStyle); +@FfiNative('skwasm.paint_getPaintStyle', isLeaf: true) +external int paintGetPaintStyle(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_getStyle') -external RawPaintStyle paint_getPaintStyle(PaintHandle paint); +@FfiNative('skwasm.paint_setStrokeWidth', isLeaf: true) +external void paintSetStrokeWidth(PaintHandle paint, double strokeWidth); -@pragma('wasm:import', 'skwasm.paint_setStrokeWidth') -external void paint_setStrokeWidth(PaintHandle paint, RawScalar strokeWidth); +@FfiNative('skwasm.paint_getStrokeWidth', isLeaf: true) +external double paintGetStrokeWidth(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_getStrokeWidth') -external RawScalar paint_getStrokeWidth(PaintHandle paint); +@FfiNative('skwasm.paint_setStrokeCap', isLeaf: true) +external void paintSetStrokeCap(PaintHandle paint, int cap); -@pragma('wasm:import', 'skwasm.paint_setStrokeCap') -external void paint_setStrokeCap(PaintHandle paint, RawStrokeCap cap); +@FfiNative('skwasm.paint_getStrokeCap', isLeaf: true) +external int paintGetStrokeCap(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_getStrokeCap') -external RawStrokeCap paint_getStrokeCap(PaintHandle paint); +@FfiNative('skwasm.paint_setStrokeJoin', isLeaf: true) +external void paintSetStrokeJoin(PaintHandle paint, int join); -@pragma('wasm:import', 'skwasm.paint_setStrokeJoin') -external void paint_setStrokeJoin(PaintHandle paint, RawStrokeJoin join); +@FfiNative('skwasm.paint_getStrokeJoin', isLeaf: true) +external int paintGetStrokeJoin(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_getStrokeJoin') -external RawStrokeJoin paint_getStrokeJoin(PaintHandle paint); +@FfiNative('skwasm.paint_setAntiAlias', isLeaf: true) +external void paintSetAntiAlias(PaintHandle paint, bool antiAlias); -@pragma('wasm:import', 'skwasm.paint_setAntiAlias') -external void paint_setAntiAlias(PaintHandle paint, RawBool antiAlias); +@FfiNative('skwasm.paint_getAntiAlias', isLeaf: true) +external bool paintGetAntiAlias(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_getAntiAlias') -external RawBool paint_getAntiAlias(PaintHandle paint); +@FfiNative('skwasm.paint_setColorInt', isLeaf: true) +external void paintSetColorInt(PaintHandle paint, int color); -@pragma('wasm:import', 'skwasm.paint_setColorInt') -external void paint_setColorInt(PaintHandle paint, RawColor color); +@FfiNative('skwasm.paint_getColorInt', isLeaf: true) +external int paintGetColorInt(PaintHandle paint); -@pragma('wasm:import', 'skwasm.paint_getColorInt') -external RawColor paint_getColorInt(PaintHandle paint); +@FfiNative('skwasm.paint_setMiterLimit', isLeaf: true) +external void paintSetMiterLimit(PaintHandle paint, double miterLimit); -@pragma('wasm:import', 'skwasm.paint_setMiterLimit') -external void paint_setMiterLimit(PaintHandle paint, RawScalar miterLimit); - -@pragma('wasm:import', 'skwasm.paint_getMiterLimit') -external RawScalar paint_getMiterLimit(PaintHandle paint); +@FfiNative('skwasm.paint_getMiterLimit', isLeaf: true) +external double paintGetMiterLimit(PaintHandle paint); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart index 5013539646e27..799980379d23c 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart @@ -1,132 +1,196 @@ import 'dart:ffi'; -import 'dart:wasm'; import 'raw_geometry.dart'; -import 'raw_memory.dart'; class RawPath extends Opaque {} typedef PathHandle = Pointer; -typedef RawPathFillType = WasmI32; -typedef RawPathDirection = WasmI32; -typedef RawArcSize = WasmI32; -typedef RawPathOperation = WasmI32; - -@pragma('wasm:import', 'skwasm.path_create') -external PathHandle path_create(); - -@pragma('wasm:import', 'skwasm.path_destroy') -external void path_destroy(PathHandle path); - -@pragma('wasm:import', 'skwasm.path_copy') -external PathHandle path_copy(PathHandle path); - -@pragma('wasm:import', 'skwasm.path_setFillType') -external void path_setFillType(PathHandle path, RawPathFillType fillType); - -@pragma('wasm:import', 'skwasm.path_getFillType') -external RawPathFillType path_getFillType(PathHandle path); - -@pragma('wasm:import', 'skwasm.path_moveTo') -external void path_moveTo(PathHandle path, RawScalar x, RawScalar y); - -@pragma('wasm:import', 'skwasm.path_relativeMoveTo') -external void path_relativeMoveTo(PathHandle path, RawScalar x, RawScalar y); - -@pragma('wasm:import', 'skwasm.path_lineTo') -external void path_lineTo(PathHandle path, RawScalar x, RawScalar y); - -@pragma('wasm:import', 'skwasm.path_lineTo') -external void path_relativeLineTo(PathHandle path, RawScalar x, RawScalar y); - -@pragma('wasm:import', 'skwasm.path_quadraticBezierTo') -external void path_quadraticBezierTo( - PathHandle path, RawScalar x1, RawScalar y1, RawScalar x2, RawScalar y2); - -@pragma('wasm:import', 'skwasm.path_relativeQuadraticBezierTo') -external void path_relativeQuadraticBezierTo( - PathHandle path, RawScalar x1, RawScalar y1, RawScalar x2, RawScalar y2); - -@pragma('wasm:import', 'skwasm.path_cubicTo') -external void path_cubicTo(PathHandle path, RawScalar x1, RawScalar y1, - RawScalar x2, RawScalar y2, RawScalar x3, RawScalar y3); - -@pragma('wasm:import', 'skwasm.path_relativeCubicTo') -external void path_relativeCubicTo(PathHandle path, RawScalar x1, RawScalar y1, - RawScalar x2, RawScalar y2, RawScalar x3, RawScalar y3); - -@pragma('wasm:import', 'skwasm.path_conicTo') -external void path_conicTo(PathHandle path, RawScalar x1, RawScalar y1, - RawScalar x2, RawScalar y2, RawScalar w); - -@pragma('wasm:import', 'skwasm.path_relativeConicTo') -external void path_relativeConicTo(PathHandle path, RawScalar x1, RawScalar y1, - RawScalar x2, RawScalar y2, RawScalar w); - -@pragma('wasm:import', 'skwasm.path_arcToOval') -external void path_arcToOval(PathHandle path, Pointer rect, - RawScalar startAngle, RawScalar sweepAngle, RawBool forceMoveto); - -@pragma('wasm:import', 'skwasm.path_arcToRotated') -external void path_arcToRotated( +@FfiNative('skwasm.path_create', isLeaf: true) +external PathHandle pathCreate(); + +@FfiNative('skwasm.path_destroy', isLeaf: true) +external void pathDestroy(PathHandle path); + +@FfiNative('skwasm.path_copy', isLeaf: true) +external PathHandle pathCopy(PathHandle path); + +@FfiNative('skwasm.path_setFillType', isLeaf: true) +external void pathSetFillType(PathHandle path, int fillType); + +@FfiNative('skwasm.path_getFillType', isLeaf: true) +external int pathGetFillType(PathHandle path); + +@FfiNative('skwasm.path_moveTo', isLeaf: true) +external void pathMoveTo(PathHandle path, double x, double y); + +@FfiNative('skwasm.path_relativeMoveTo', isLeaf: true) +external void pathRelativeMoveTo(PathHandle path, double x, double y); + +@FfiNative('skwasm.path_lineTo', isLeaf: true) +external void pathLineTo(PathHandle path, double x, double y); + +@FfiNative( + 'skwasm.path_relativeLineTo', + isLeaf: true) +external void pathRelativeLineTo(PathHandle path, double x, double y); + +@FfiNative( + 'skwasm.path_quadraticBezierTo', + isLeaf: true) +external void pathQuadraticBezierTo( + PathHandle path, double x1, double y1, double x2, double y2); + +@FfiNative( + 'skwasm.path_relativeQuadraticBezierTo', + isLeaf: true) +external void pathRelativeQuadraticBezierTo( + PathHandle path, double x1, double y1, double x2, double y2); + +@FfiNative( + 'skwasm.path_cubicTo', + isLeaf: true) +external void pathCubicTo( + PathHandle path, + double x1, + double y1, + double x2, + double y2, + double x3, + double y3 +); + +@FfiNative( + 'skwasm.path_relativeCubicTo', + isLeaf: true) +external void pathRelativeCubicTo( + PathHandle path, + double x1, + double y1, + double x2, + double y2, + double x3, + double y3 +); + +@FfiNative( + 'skwasm.path_conicTo', + isLeaf: true) +external void pathConicTo( + PathHandle path, + double x1, + double y1, + double x2, + double y2, + double w +); + +@FfiNative( + 'skwasm.path_relativeConicTo', + isLeaf: true) +external void pathRelativeConicTo( + PathHandle path, + double x1, + double y1, + double x2, + double y2, + double w +); + +@FfiNative( + 'skwasm.path_arcToOval', + isLeaf: true) +external void pathArcToOval( + PathHandle path, + RawRect rect, + double startAngle, + double sweepAngle, + bool forceMoveto +); + +@FfiNative( + 'skwasm.path_arcToRotated', + isLeaf: true) +external void pathArcToRotated( PathHandle path, - RawScalar rx, - RawScalar ry, - RawScalar xAxisRotate, - RawArcSize arcSize, - RawPathDirection pathDirection, - RawScalar x, - RawScalar y); - -@pragma('wasm:import', 'skwasm.path_relativeArcToRotated') -external void path_relativeArcToRotated( + double rx, + double ry, + double xAxisRotate, + int arcSize, + int pathDirection, + double x, + double y +); + +@FfiNative( + 'skwasm.path_relativeArcToRotated', + isLeaf: true) +external void pathRelativeArcToRotated( PathHandle path, - RawScalar rx, - RawScalar ry, - RawScalar xAxisRotate, - RawArcSize arcSize, - RawPathDirection pathDirection, - RawScalar x, - RawScalar y); - -@pragma('wasm:import', 'skwasm.path_addRect') -external void path_addRect(PathHandle path, RawRect oval); - -@pragma('wasm:import', 'skwasm.path_addOval') -external void path_addOval(PathHandle path, RawRect oval); - -@pragma('wasm:import', 'skwasm.path_addArc') -external void path_addArc(PathHandle path, RawRect ovalRect, - RawScalar startAngleDegrees, RawScalar sweepAngleDegrees); - -@pragma('wasm:import', 'skwasm.path_addPolygon') -external void path_addPolygon( - PathHandle path, RawPointArray points, RawSize pointCount, RawBool close); - -@pragma('wasm:import', 'skwasm.path_addRRect') -external void path_addRRect( - PathHandle path, RawRRect rrectValues); - -@pragma('wasm:import', 'skwasm.path_addPath') -external void path_addPath(PathHandle path, PathHandle other, - RawMatrix33 matrix33, RawBool extendPath); - -@pragma('wasm:import', 'skwasm.path_close') -external void path_close(PathHandle path); - -@pragma('wasm:import', 'skwasm.path_reset') -external void path_reset(PathHandle path); - -@pragma('wasm:import', 'skwasm.path_contains') -external RawBool path_contains(PathHandle path, RawScalar x, RawScalar y); - -@pragma('wasm:import', 'skwasm.path_transform') -external void path_transform(PathHandle path, RawMatrix33 matrix33); - -@pragma('wasm:import', 'skwasm.path_getBounds') -external void path_getBounds(PathHandle path, RawRect outRect); - -@pragma('wasm:import', 'skwasm.path_combine') -external PathHandle path_combine( - RawPathOperation operation, PathHandle path1, PathHandle path2); + double rx, + double ry, + double xAxisRotate, + int arcSize, + int pathDirection, + double x, + double y +); + +@FfiNative('skwasm.path_addRect', isLeaf: true) +external void pathAddRect(PathHandle path, RawRect oval); + +@FfiNative('skwasm.path_addOval', isLeaf: true) +external void pathAddOval(PathHandle path, RawRect oval); + +@FfiNative( + 'skwasm.path_addArc', + isLeaf: true) +external void pathAddArc( + PathHandle path, + RawRect ovalRect, + double startAngleDegrees, + double sweepAngleDegrees +); + +@FfiNative( + 'skwasm.path_addPolygon', + isLeaf: true) +external void pathAddPolygon( + PathHandle path, + RawPointArray points, + int pointCount, + bool close +); + +@FfiNative('skwasm.path_addRRect', isLeaf: true) +external void pathAddRRect(PathHandle path, RawRRect rrectValues); + +@FfiNative( + 'skwasm.path_addPath', + isLeaf: true) +external void pathAddPath( + PathHandle path, + PathHandle other, + RawMatrix33 matrix33, + bool extendPath +); + +@FfiNative('skwasm.path_close', isLeaf: true) +external void pathClose(PathHandle path); + +@FfiNative('skwasm.path_reset', isLeaf: true) +external void pathReset(PathHandle path); + +@FfiNative('skwasm.path_contains', isLeaf: true) +external bool pathContains(PathHandle path, double x, double y); + +@FfiNative('skwasm.path_transform', isLeaf: true) +external void pathTransform(PathHandle path, RawMatrix33 matrix33); + +@FfiNative('skwasm.path_getBounds', isLeaf: true) +external void pathGetBounds(PathHandle path, RawRect outRect); + +@FfiNative( + 'skwasm.path_getBounds', + isLeaf: true) +external PathHandle pathCombine(int operation, PathHandle path1, PathHandle path2); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart index d8227941a3eeb..8705eb6cac5eb 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart @@ -2,32 +2,40 @@ import 'dart:ffi'; import 'raw_canvas.dart'; import 'raw_geometry.dart'; -import 'raw_memory.dart'; class RawPictureRecorder extends Opaque {} - typedef PictureRecorderHandle = Pointer; class RawPicture extends Opaque {} - typedef PictureHandle = Pointer; -@pragma('wasm:import', 'skwasm.pictureRecorder_create') -external PictureRecorderHandle pictureRecorder_create(); +@FfiNative( + 'skwasm.pictureRecorder_create', + isLeaf: true) +external PictureRecorderHandle pictureRecorderCreate(); -@pragma('wasm:import', 'skwasm.pictureRecorder_destroy') -external void pictureRecorder_destroy(PictureRecorderHandle picture); +@FfiNative( + 'skwasm.pictureRecorder_destroy', + isLeaf: true) +external void pictureRecorderDestroy(PictureRecorderHandle picture); -@pragma('wasm:import', 'skwasm.pictureRecorder_beginRecording') -external CanvasHandle pictureRecorder_beginRecording( +@FfiNative( + 'skwasm.pictureRecorder_beginRecording', + isLeaf: true) +external CanvasHandle pictureRecorderBeginRecording( PictureRecorderHandle picture, RawRect cullRect); -@pragma('wasm:import', 'skwasm.pictureRecorder_endRecording') -external PictureHandle pictureRecorder_endRecording( - PictureRecorderHandle picture); +@FfiNative( + 'skwasm.pictureRecorder_endRecording', + isLeaf: true) +external PictureHandle pictureRecorderEndRecording(PictureRecorderHandle picture); -@pragma('wasm:import', 'skwasm.picture_dispose') -external PictureHandle picture_dispose(PictureHandle handle); +@FfiNative( + 'skwasm.pictureRecorder_dispose', + isLeaf: true) +external void pictureDispose(PictureHandle handle); -@pragma('wasm:import', 'skwasm.picture_approximateBytesUsed') -external RawSize picture_approxmateBytesUsed(PictureHandle handle); +@FfiNative( + 'skwasm.pictureRecorder_approximateBytesUsed', + isLeaf: true) +external int pictureApproximateBytesUsed(PictureHandle handle); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart index c457655f71912..c5abf4f501fc0 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart @@ -1,19 +1,29 @@ import 'dart:ffi'; -import 'dart:wasm'; import 'raw_picture.dart'; class RawSurface extends Opaque {} - typedef SurfaceHandle = Pointer; -@pragma('wasm:import', 'skwasm.surface_createFromCanvas') -external SurfaceHandle surface_createFromCanvas(Pointer querySelector); +@FfiNative)>( + 'skwasm.surface_createFromCanvas', + isLeaf: true) +external SurfaceHandle surfaceCreateFromCanvas(Pointer querySelector); -@pragma('wasm:import', 'skwasm.surface_destroy') -external void surface_destroy(SurfaceHandle surface); +@FfiNative( + 'skwasm.surface_destroy', + isLeaf: true) +external void surfaceDestroy(SurfaceHandle surface); -@pragma('wasm:import', 'skwasm.surface_setCanvasSize') -external void surface_setCanvasSize(SurfaceHandle surface, WasmI32 width, WasmI32 height); +@FfiNative( + 'skwasm.surface_setCanvasSize', + isLeaf: true) +external void surfaceSetCanvasSize( + SurfaceHandle surface, + int width, + int height +); -@pragma('wasm:import', 'skwasm.surface_renderPicture') -external void surface_renderPicture(SurfaceHandle surface, PictureHandle picture); +@FfiNative( + 'skwasm.surface_renderPicture', + isLeaf: true) +external void surfaceRenderPicture(SurfaceHandle surface, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart index 7893390a38f71..4d7bdb24748e2 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart @@ -1,5 +1,4 @@ import 'dart:ffi'; -import 'dart:wasm'; import 'picture.dart'; import 'raw/raw_memory.dart'; @@ -9,7 +8,7 @@ class Surface { factory Surface(String canvasQuerySelector) { final SurfaceHandle surfaceHandle = withStackScope((StackScope scope) { final Pointer pointer = scope.convertString(canvasQuerySelector); - return surface_createFromCanvas(pointer); + return surfaceCreateFromCanvas(pointer); }); return Surface._fromHandle(surfaceHandle); } @@ -17,11 +16,9 @@ class Surface { Surface._fromHandle(this._handle); final SurfaceHandle _handle; - void setSize(int width, int height) { - surface_setCanvasSize(_handle, width.toWasmI32(), height.toWasmI32()); - } + void setSize(int width, int height) => + surfaceSetCanvasSize(_handle, width, height); - void renderPicture(SkwasmPicture picture) { - surface_renderPicture(_handle, picture.handle); - } + void renderPicture(SkwasmPicture picture) => + surfaceRenderPicture(_handle, picture.handle); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart index 3c95dc85d5bac..b5fd04ed41f20 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart @@ -22,4 +22,13 @@ class SkwasmVertices implements ui.Vertices { }) { throw UnimplementedError(); } + + @override + // TODO: implement debugDisposed + bool get debugDisposed => throw UnimplementedError(); + + @override + void dispose() { + // TODO: implement dispose + } } From 5c953e61c229b202331a2f8b3345c48416b73190 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 29 Sep 2022 16:02:14 -0700 Subject: [PATCH 04/34] Implement a few methods of the renderer. --- .../engine/skwasm/skwasm_impl/renderer.dart | 67 +++++++++++++------ .../engine/skwasm/skwasm_impl/src/canvas.dart | 2 +- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index 00f3108af1b24..098395a3d29c3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -6,18 +6,25 @@ import 'dart:async'; import 'dart:math' as math; import 'dart:typed_data'; +import 'package:ui/src/engine/skwasm/skwasm_impl/src/canvas.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl/src/paint.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl/src/picture.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl/src/vertices.dart'; import 'package:ui/ui.dart' as ui; import '../../embedder.dart'; import '../../fonts.dart'; import '../../html_image_codec.dart'; import '../../renderer.dart'; +import 'src/path.dart'; // TODO(jacksongardner): Actually implement skwasm renderer. class SkwasmRenderer implements Renderer { @override ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2) { - throw UnimplementedError('Not yet implemented'); + assert(path1 is SkwasmPath); + assert(path2 is SkwasmPath); + return SkwasmPath.combine(op, path1 as SkwasmPath, path2 as SkwasmPath); } @override @@ -27,7 +34,8 @@ class SkwasmRenderer implements Renderer { @override ui.Path copyPath(ui.Path src) { - throw UnimplementedError('Not yet implemented'); + assert(src is SkwasmPath); + return SkwasmPath.from(src as SkwasmPath); } @override @@ -37,7 +45,8 @@ class SkwasmRenderer implements Renderer { @override ui.Canvas createCanvas(ui.PictureRecorder recorder, [ui.Rect? cullRect]) { - throw UnimplementedError('Not yet implemented'); + assert(recorder is SkwasmPictureRecorder); + return SkwasmCanvas(recorder as SkwasmPictureRecorder, cullRect ?? ui.Rect.largest); } @override @@ -71,9 +80,7 @@ class SkwasmRenderer implements Renderer { } @override - ui.Paint createPaint() { - throw UnimplementedError('Not yet implemented'); - } + ui.Paint createPaint() => SkwasmPaint(); @override ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style) { @@ -86,14 +93,10 @@ class SkwasmRenderer implements Renderer { } @override - ui.Path createPath() { - throw UnimplementedError('Not yet implemented'); - } + ui.Path createPath() => SkwasmPath(); @override - ui.PictureRecorder createPictureRecorder() { - throw UnimplementedError('Not yet implemented'); - } + ui.PictureRecorder createPictureRecorder() => SkwasmPictureRecorder(); @override ui.Gradient createRadialGradient(ui.Offset center, double radius, List colors, [List? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) { @@ -121,14 +124,38 @@ class SkwasmRenderer implements Renderer { } @override - ui.Vertices createVertices(ui.VertexMode mode, List positions, {List? textureCoordinates, List? colors, List? indices}) { - throw UnimplementedError('Not yet implemented'); - } - - @override - ui.Vertices createVerticesRaw(ui.VertexMode mode, Float32List positions, {Float32List? textureCoordinates, Int32List? colors, Uint16List? indices}) { - throw UnimplementedError('Not yet implemented'); - } + ui.Vertices createVertices( + ui.VertexMode mode, + List positions, + { + List? textureCoordinates, + List? colors, + List? indices + }) => + SkwasmVertices( + mode, + positions, + textureCoordinates: textureCoordinates, + colors: colors, + indices: indices + ); + + @override + ui.Vertices createVerticesRaw( + ui.VertexMode mode, + Float32List positions, + { + Float32List? textureCoordinates, + Int32List? colors, + Uint16List? indices + }) => + SkwasmVertices.raw( + mode, + positions, + textureCoordinates: textureCoordinates, + colors: colors, + indices: indices + ); @override void decodeImageFromPixels(Uint8List pixels, int width, int height, ui.PixelFormat format, ui.ImageDecoderCallback callback, {int? rowBytes, int? targetWidth, int? targetHeight, bool allowUpscaling = true}) { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart index 3009c07b0cb85..48571fc838c36 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart @@ -11,7 +11,7 @@ import 'raw/raw_memory.dart'; import 'raw/raw_picture.dart'; class SkwasmCanvas implements ui.Canvas { - factory SkwasmCanvas(SkwasmPictureRecorder recorder, [ui.Rect cullRect = ui.Rect.largest]) => + factory SkwasmCanvas(SkwasmPictureRecorder recorder, ui.Rect cullRect) => SkwasmCanvas.fromHandle(withStackScope((StackScope s) => pictureRecorderBeginRecording(recorder.handle, s.convertRect(cullRect)) )); From 1badfeca67835d88c2011587902961119b4076cd Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 3 Nov 2022 13:44:55 -0700 Subject: [PATCH 05/34] Some little lint errors. --- .../lib/src/engine/skwasm/skwasm_impl/src/canvas.dart | 8 ++++---- .../lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart | 3 +-- .../lib/src/engine/skwasm/skwasm_impl/src/path.dart | 2 +- .../lib/src/engine/skwasm/skwasm_impl/src/picture.dart | 6 +++--- .../lib/src/engine/skwasm/skwasm_impl/src/vertices.dart | 2 -- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart index 48571fc838c36..7e5496eb950ab 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart @@ -245,24 +245,24 @@ class SkwasmCanvas implements ui.Canvas { @override ui.Rect getDestinationClipBounds() { - // TODO: implement getDestinationClipBounds + // TODO(jacksongardner): implement getDestinationClipBounds throw UnimplementedError(); } @override ui.Rect getLocalClipBounds() { - // TODO: implement getLocalClipBounds + // TODO(jacksongardner): implement getLocalClipBounds throw UnimplementedError(); } @override Float64List getTransform() { - // TODO: implement getTransform + // TODO(jacksongardner): implement getTransform throw UnimplementedError(); } @override void restoreToCount(int count) { - // TODO: implement restoreToCount + // TODO(jacksongardner): implement restoreToCount } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart index d142e5b46282d..2f6b44b14c020 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart @@ -1,5 +1,6 @@ import 'package:ui/ui.dart' as ui; +// TODO(jacksongardner): implement this class SkwasmLineMetrics implements ui.LineMetrics { factory SkwasmLineMetrics({ required bool hardBreak, @@ -140,11 +141,9 @@ class SkwasmParagraph implements ui.Paragraph { } @override - // TODO: implement debugDisposed bool get debugDisposed => throw UnimplementedError(); @override void dispose() { - // TODO: implement dispose } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart index 5633b995990e4..fd81c02b9e2d6 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart @@ -256,7 +256,7 @@ class SkwasmPath implements ui.Path { @override ui.PathMetrics computeMetrics({bool forceClosed = false}) { - // TODO: implement computeMetrics + // TODO(jacksongardner): implement computeMetrics throw UnimplementedError(); } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart index 3e6d6892322e4..8aac4366d4c39 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart @@ -20,12 +20,12 @@ class SkwasmPicture implements ui.Picture { int get approximateBytesUsed => pictureApproximateBytesUsed(_handle); @override - // TODO: implement debugDisposed + // TODO(jacksongardner): implement debugDisposed bool get debugDisposed => throw UnimplementedError(); @override ui.Image toImageSync(int width, int height) { - // TODO: implement toImageSync + // TODO(jacksongardner): implement toImageSync throw UnimplementedError(); } } @@ -46,6 +46,6 @@ class SkwasmPictureRecorder implements ui.PictureRecorder { SkwasmPicture.fromHandle(pictureRecorderEndRecording(_handle)); @override - // TODO: implement isRecording + // TODO(jacksongardner): implement isRecording bool get isRecording => throw UnimplementedError(); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart index b5fd04ed41f20..5e8857da5e62e 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart @@ -24,11 +24,9 @@ class SkwasmVertices implements ui.Vertices { } @override - // TODO: implement debugDisposed bool get debugDisposed => throw UnimplementedError(); @override void dispose() { - // TODO: implement dispose } } From 7cb9a08e14039ae14efcecb836b0afd34e0db12a Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 3 Nov 2022 18:33:53 -0700 Subject: [PATCH 06/34] A bit of wiring up of the test harness. --- lib/web_ui/dev/build.dart | 12 +++++- lib/web_ui/dev/steps/compile_tests_step.dart | 43 ++++++++++++++++--- lib/web_ui/dev/test_runner.dart | 13 +++++- lib/web_ui/dev/utils.dart | 1 + .../skwasm_impl/src/raw/raw_memory.dart | 4 +- tools/gn | 12 ++++++ web_sdk/BUILD.gn | 21 +++++++++ 7 files changed, 96 insertions(+), 10 deletions(-) diff --git a/lib/web_ui/dev/build.dart b/lib/web_ui/dev/build.dart index 215d59a2dbf95..a06ceb8b46962 100644 --- a/lib/web_ui/dev/build.dart +++ b/lib/web_ui/dev/build.dart @@ -27,6 +27,10 @@ class BuildCommand extends Command with ArgUtils { 'by default.', defaultsTo: true ); + argParser.addFlag( + 'build-skwasm', + help: 'Build skwasm library', + ); argParser.addFlag( 'host', help: 'Build the host build instead of the wasm build, which is ' @@ -44,13 +48,15 @@ class BuildCommand extends Command with ArgUtils { bool get buildCanvasKit => boolArg('build-canvaskit'); + bool get buildSkwasm => boolArg('build-skwasm'); + bool get host => boolArg('host'); @override FutureOr run() async { final FilePath libPath = FilePath.fromWebUi('lib'); final List steps = [ - GnPipelineStep(buildCanvasKit: buildCanvasKit, host: host), + GnPipelineStep(buildCanvasKit: buildCanvasKit, buildSkwasm: buildSkwasm, host: host), NinjaPipelineStep(target: host ? environment.hostDebugUnoptDir : environment.wasmReleaseOutDir), ]; final Pipeline buildPipeline = Pipeline(steps: steps); @@ -75,9 +81,10 @@ class BuildCommand extends Command with ArgUtils { /// Not safe to interrupt as it may leave the `out/` directory in a corrupted /// state. GN is pretty quick though, so it's OK to not support interruption. class GnPipelineStep extends ProcessStep { - GnPipelineStep({required this.buildCanvasKit, required this.host}); + GnPipelineStep({required this.buildCanvasKit, required this.buildSkwasm, required this.host}); final bool buildCanvasKit; + final bool buildSkwasm; final bool host; @override @@ -97,6 +104,7 @@ class GnPipelineStep extends ProcessStep { '--web', '--runtime-mode=release', if (buildCanvasKit) '--build-canvaskit', + if (buildSkwasm) '--build-skwasm', ]; } } diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart index cfef289f20792..e130cef8c8dae 100644 --- a/lib/web_ui/dev/steps/compile_tests_step.dart +++ b/lib/web_ui/dev/steps/compile_tests_step.dart @@ -23,10 +23,15 @@ import '../utils.dart'; /// * test/ - compiled test code /// * test_images/ - test images copied from Skis sources. class CompileTestsStep implements PipelineStep { - CompileTestsStep({this.testFiles, this.useLocalCanvasKit = false, this.isWasm = false}); + CompileTestsStep({ + this.testFiles, + this.useLocalCanvasKit = false, + this.useSkwasm = false, + this.isWasm = false}); final List? testFiles; final bool isWasm; + final bool useSkwasm; final bool useLocalCanvasKit; @@ -49,6 +54,9 @@ class CompileTestsStep implements PipelineStep { await copyDart2WasmRuntime(); } await copyCanvasKitFiles(useLocalCanvasKit: useLocalCanvasKit); + if (useSkwasm) { + await copySkwasm(); + } await buildHostPage(); await copyTestFonts(); await copySkiaTestImages(); @@ -135,12 +143,12 @@ Future copyDart2WasmRuntime() async { 'bin', 'dart2wasm_runtime.mjs', )); - final io.Directory targetDir = io.Directory(pathlib.join( + final io.File targetFile = io.File(pathlib.join( environment.webUiBuildDir.path, 'dart2wasm_runtime.mjs', )); - await sourceFile.copy(targetDir.path); + await sourceFile.copy(targetFile.path); } Future copyDart2WasmTestScript() async { @@ -148,11 +156,36 @@ Future copyDart2WasmTestScript() async { environment.webUiDevDir.path, 'test_dart2wasm.js', )); - final io.Directory targetDir = io.Directory(pathlib.join( + final io.File targetFile = io.File(pathlib.join( environment.webUiBuildDir.path, 'test_dart2wasm.js', )); - await sourceFile.copy(targetDir.path); + await sourceFile.copy(targetFile.path); +} + +Future copySkwasm() async { + final io.Directory targetDir = io.Directory(pathlib.join( + environment.webUiBuildDir.path, + 'skwasm', + )); + + await targetDir.create(recursive: true); + + for (final String fileName in [ + 'skwasm.wasm', + 'skwasm.js', + 'skwasm.worker.js', + ]) { + final io.File sourceFile = io.File(pathlib.join( + environment.wasmReleaseOutDir.path, + fileName, + )); + final io.File targetFile = io.File(pathlib.join( + targetDir.path, + fileName, + )); + await sourceFile.copy(targetFile.path); + } } Future copyCanvasKitFiles({bool useLocalCanvasKit = false}) async { diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index 6d552fd75819c..1da9749872aac 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -82,6 +82,10 @@ class TestCommand extends Command with ArgUtils { 'use-local-canvaskit', help: 'Optional. Whether or not to use the locally built version of ' 'CanvasKit in the tests.', + ) + ..addFlag( + 'skwasm', + help: 'Run unit tests for skwasm renderer.' ); } @@ -97,6 +101,8 @@ class TestCommand extends Command with ArgUtils { bool get isWasm => boolArg('wasm'); + bool get isSkwasm => boolArg('skwasm'); + /// Whether to start the browser in debug mode. /// /// In this mode the browser pauses before running the test to allow @@ -137,7 +143,12 @@ class TestCommand extends Command with ArgUtils { final Pipeline testPipeline = Pipeline(steps: [ if (isWatchMode) ClearTerminalScreenStep(), - CompileTestsStep(testFiles: testFiles, useLocalCanvasKit: useLocalCanvasKit, isWasm: isWasm), + CompileTestsStep( + testFiles: testFiles, + useLocalCanvasKit: useLocalCanvasKit, + useSkwasm: isSkwasm, + isWasm: isWasm + ), RunTestsStep( browserName: browserName, testFiles: testFiles, diff --git a/lib/web_ui/dev/utils.dart b/lib/web_ui/dev/utils.dart index c71a6148eb26d..fe07bf3d3fe92 100644 --- a/lib/web_ui/dev/utils.dart +++ b/lib/web_ui/dev/utils.dart @@ -426,6 +426,7 @@ TestsByRenderer sortTestsByRenderer(List testFiles) { } else if (path.isWithin(uiTestDirectory, testFile.absolute)) { htmlTargets.add(testFile); canvasKitTargets.add(testFile); + skwasmTargets.add(testFile); } else { htmlTargets.add(testFile); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart index 2529d4d1ce7f1..a418488ab8ac2 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart @@ -8,8 +8,8 @@ class Stack extends Opaque {} typedef StackPointer = Pointer; /// Generic linear memory allocation -@FfiNative Function(Size)>('skwasm.stackAlloc', isLeaf: true) -external Pointer stackAlloc(int length); +@FfiNative('skwasm.stackAlloc', isLeaf: true) +external StackPointer stackAlloc(int length); @FfiNative('skwasm.stackSave', isLeaf: true) external StackPointer stackSave(); diff --git a/tools/gn b/tools/gn index 54317fa19da02..10c688910e124 100755 --- a/tools/gn +++ b/tools/gn @@ -261,6 +261,7 @@ def to_gn_args(args): gn_args['full_dart_sdk'] = args.full_dart_sdk if args.build_web_sdk or args.full_dart_sdk: gn_args['build_canvaskit'] = args.build_canvaskit + gn_args['build_skwasm'] = args.build_skwasm if args.enable_unittests: gn_args['enable_unittests'] = args.enable_unittests @@ -646,6 +647,7 @@ def to_gn_wasm_args(args, gn_args): # than forced to true, once the recipes are updated. # https://github.com/flutter/flutter/issues/113303 gn_args['build_canvaskit'] = True + gn_args['build_skwasm'] = args.build_skwasm gn_args['flutter_build_web_sdk'] = True @@ -866,6 +868,16 @@ def parse_args(args): '--no-build-canvaskit', dest='build_canvaskit', action='store_false' ) + parser.add_argument( + '--build-skwasm', + default=False, + action='store_true', + help='build skwasm library' + ) + parser.add_argument( + '--no-build-skwasm', dest='build_skwasm', action='store_false' + ) + parser.add_argument( '--ide', default='', diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 41bed6e4a4389..50c187273cdc2 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -8,6 +8,7 @@ import("//third_party/dart/build/dart/dart_action.gni") declare_args() { build_canvaskit = false + build_skwasm = false archive_flutter_web_sdk = true } @@ -593,6 +594,10 @@ if (!is_fuchsia) { deps += [ "//third_party/skia/modules/canvaskit" ] } + if (build_skwasm) { + deps += [ "//flutter/lib/web_ui/skwasm" ] + } + # flutter_ddc_modules sources = get_target_outputs(":flutter_dartdevc_kernel_sdk") sources += get_target_outputs(":flutter_dartdevc_canvaskit_kernel_sdk") @@ -649,6 +654,22 @@ if (!is_fuchsia) { }, ] } + if (build_skwasm) { + tmp_files += [ + { + source = rebase_path("$root_out_dir/skwasm.js") + destination = "skwasm/skwasm.js" + }, + { + source = rebase_path("$root_out_dir/skwasm.js") + destination = "skwasm/skwasm.worker.js" + }, + { + source = rebase_path("$root_out_dir/canvaskit.wasm") + destination = "skwasm/skwasm.wasm" + }, + ] + } files = tmp_files } } From 73ee925f4140a264de3c7c820d25dc1d71d1092c Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 3 Nov 2022 18:35:04 -0700 Subject: [PATCH 07/34] Fix some formatting issues. --- .../src/engine/skwasm/skwasm_impl/renderer.dart | 2 +- .../src/engine/skwasm/skwasm_impl/src/canvas.dart | 10 +++++----- .../src/engine/skwasm/skwasm_impl/src/paint.dart | 14 +++++++------- .../engine/skwasm/skwasm_impl/src/paragraph.dart | 4 ++-- .../src/engine/skwasm/skwasm_impl/src/path.dart | 14 +++++++------- .../src/engine/skwasm/skwasm_impl/src/picture.dart | 8 ++++---- .../skwasm/skwasm_impl/src/raw/raw_path.dart | 14 +++++++------- .../skwasm/skwasm_impl/src/raw/raw_surface.dart | 4 ++-- .../src/engine/skwasm/skwasm_impl/src/surface.dart | 4 ++-- .../engine/skwasm/skwasm_impl/src/vertices.dart | 4 ++-- lib/web_ui/skwasm/BUILD.gn | 5 ++--- 11 files changed, 41 insertions(+), 42 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index 098395a3d29c3..d6c36cc5c72c7 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -133,7 +133,7 @@ class SkwasmRenderer implements Renderer { List? indices }) => SkwasmVertices( - mode, + mode, positions, textureCoordinates: textureCoordinates, colors: colors, diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart index 7e5496eb950ab..2f0954c45341b 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart @@ -91,7 +91,7 @@ class SkwasmCanvas implements ui.Canvas { } @override - void drawColor(ui.Color color, ui.BlendMode blendMode) => + void drawColor(ui.Color color, ui.BlendMode blendMode) => canvasDrawColor(_handle, color.value, blendMode.index); @override @@ -242,25 +242,25 @@ class SkwasmCanvas implements ui.Canvas { ) { throw UnimplementedError(); } - + @override ui.Rect getDestinationClipBounds() { // TODO(jacksongardner): implement getDestinationClipBounds throw UnimplementedError(); } - + @override ui.Rect getLocalClipBounds() { // TODO(jacksongardner): implement getLocalClipBounds throw UnimplementedError(); } - + @override Float64List getTransform() { // TODO(jacksongardner): implement getTransform throw UnimplementedError(); } - + @override void restoreToCount(int count) { // TODO(jacksongardner): implement restoreToCount diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart index 6c241d1be8f25..ae7e88bc17fab 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart @@ -64,26 +64,26 @@ class SkwasmPaint implements ui.Paint { @override double get strokeMiterLimit => paintGetMiterLimit(_handle); - + @override set strokeMiterLimit(double limit) => paintSetMiterLimit(_handle, limit); // Unimplemented stuff below @override ui.ColorFilter? colorFilter; - + @override ui.FilterQuality filterQuality = ui.FilterQuality.none; - + @override ui.ImageFilter? imageFilter; - + @override bool invertColors = false; - + @override ui.MaskFilter? maskFilter; - + @override - ui.Shader? shader; + ui.Shader? shader; } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart index 2f6b44b14c020..ec90efb5471b0 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart @@ -139,10 +139,10 @@ class SkwasmParagraph implements ui.Paragraph { List computeLineMetrics() { throw UnimplementedError(); } - + @override bool get debugDisposed => throw UnimplementedError(); - + @override void dispose() { } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart index fd81c02b9e2d6..e33157dadae9d 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart @@ -221,7 +221,7 @@ class SkwasmPath implements ui.Path { bool contains(ui.Offset point) => pathContains(_handle, point.dx, point.dy); @override - ui.Path shift(ui.Offset offset) => + ui.Path shift(ui.Offset offset) => transform(engine.Matrix4.translationValues(offset.dx, offset.dy, 0.0).toFloat64()); @override @@ -239,21 +239,21 @@ class SkwasmPath implements ui.Path { final Pointer rectBuffer = s.allocFloatArray(4); pathGetBounds(_handle, rectBuffer); return ui.Rect.fromLTRB( - rectBuffer[0], - rectBuffer[1], - rectBuffer[2], + rectBuffer[0], + rectBuffer[1], + rectBuffer[2], rectBuffer[3] ); }); } static SkwasmPath combine( - ui.PathOperation operation, - SkwasmPath path1, + ui.PathOperation operation, + SkwasmPath path1, SkwasmPath path2) => SkwasmPath._fromHandle(pathCombine( operation.index, path1._handle, path2._handle)); - + @override ui.PathMetrics computeMetrics({bool forceClosed = false}) { // TODO(jacksongardner): implement computeMetrics diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart index 8aac4366d4c39..3e7947108c9a8 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart @@ -18,11 +18,11 @@ class SkwasmPicture implements ui.Picture { @override int get approximateBytesUsed => pictureApproximateBytesUsed(_handle); - + @override // TODO(jacksongardner): implement debugDisposed bool get debugDisposed => throw UnimplementedError(); - + @override ui.Image toImageSync(int width, int height) { // TODO(jacksongardner): implement toImageSync @@ -31,7 +31,7 @@ class SkwasmPicture implements ui.Picture { } class SkwasmPictureRecorder implements ui.PictureRecorder { - factory SkwasmPictureRecorder() => + factory SkwasmPictureRecorder() => SkwasmPictureRecorder._fromHandle(pictureRecorderCreate()); SkwasmPictureRecorder._fromHandle(this._handle); @@ -42,7 +42,7 @@ class SkwasmPictureRecorder implements ui.PictureRecorder { void delete() => pictureRecorderDestroy(_handle); @override - SkwasmPicture endRecording() => + SkwasmPicture endRecording() => SkwasmPicture.fromHandle(pictureRecorderEndRecording(_handle)); @override diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart index 799980379d23c..48075ee20dbe0 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart @@ -51,7 +51,7 @@ external void pathRelativeQuadraticBezierTo( 'skwasm.path_cubicTo', isLeaf: true) external void pathCubicTo( - PathHandle path, + PathHandle path, double x1, double y1, double x2, @@ -61,7 +61,7 @@ external void pathCubicTo( ); @FfiNative( - 'skwasm.path_relativeCubicTo', + 'skwasm.path_relativeCubicTo', isLeaf: true) external void pathRelativeCubicTo( PathHandle path, @@ -74,7 +74,7 @@ external void pathRelativeCubicTo( ); @FfiNative( - 'skwasm.path_conicTo', + 'skwasm.path_conicTo', isLeaf: true) external void pathConicTo( PathHandle path, @@ -86,7 +86,7 @@ external void pathConicTo( ); @FfiNative( - 'skwasm.path_relativeConicTo', + 'skwasm.path_relativeConicTo', isLeaf: true) external void pathRelativeConicTo( PathHandle path, @@ -98,7 +98,7 @@ external void pathRelativeConicTo( ); @FfiNative( - 'skwasm.path_arcToOval', + 'skwasm.path_arcToOval', isLeaf: true) external void pathArcToOval( PathHandle path, @@ -109,7 +109,7 @@ external void pathArcToOval( ); @FfiNative( - 'skwasm.path_arcToRotated', + 'skwasm.path_arcToRotated', isLeaf: true) external void pathArcToRotated( PathHandle path, @@ -123,7 +123,7 @@ external void pathArcToRotated( ); @FfiNative( - 'skwasm.path_relativeArcToRotated', + 'skwasm.path_relativeArcToRotated', isLeaf: true) external void pathRelativeArcToRotated( PathHandle path, diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart index c5abf4f501fc0..17c8a43146de5 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart @@ -18,8 +18,8 @@ external void surfaceDestroy(SurfaceHandle surface); 'skwasm.surface_setCanvasSize', isLeaf: true) external void surfaceSetCanvasSize( - SurfaceHandle surface, - int width, + SurfaceHandle surface, + int width, int height ); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart index 4d7bdb24748e2..8d496b6981779 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart @@ -16,9 +16,9 @@ class Surface { Surface._fromHandle(this._handle); final SurfaceHandle _handle; - void setSize(int width, int height) => + void setSize(int width, int height) => surfaceSetCanvasSize(_handle, width, height); - void renderPicture(SkwasmPicture picture) => + void renderPicture(SkwasmPicture picture) => surfaceRenderPicture(_handle, picture.handle); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart index 5e8857da5e62e..043ef96a437b4 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart @@ -22,10 +22,10 @@ class SkwasmVertices implements ui.Vertices { }) { throw UnimplementedError(); } - + @override bool get debugDisposed => throw UnimplementedError(); - + @override void dispose() { } diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 94b056787999b..bfac03b2bfd8e 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -13,9 +13,8 @@ wasm_lib("skwasm") { ] # embedded font, generated by the :create_notomono_cpp target - sources += [ - "$root_out_dir/modules/canvaskit/fonts/NotoMono-Regular.ttf.ninja.cpp", - ] + sources += + [ "$root_out_dir/modules/canvaskit/fonts/NotoMono-Regular.ttf.ninja.cpp" ] ldflags = [ "-std=c++20", From cb65c7be077177ef1f1442b24c34d262ba2f7199 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 8 Nov 2022 15:51:40 -0800 Subject: [PATCH 08/34] Minor changes to skwasm renderer. --- lib/web_ui/dev/felt | 2 +- web_sdk/BUILD.gn | 2 +- web_sdk/web_engine_tester/pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/web_ui/dev/felt b/lib/web_ui/dev/felt index 98ab19d647b38..66433229272d4 100755 --- a/lib/web_ui/dev/felt +++ b/lib/web_ui/dev/felt @@ -30,7 +30,7 @@ ENGINE_SRC_DIR="$(dirname $(dirname $(dirname $(dirname ${FELT_DIR}))))" FLUTTER_DIR="${ENGINE_SRC_DIR}/flutter" SDK_PREBUILTS_DIR="${FLUTTER_DIR}/prebuilts" -if [ -z "${DART_SDK_DIR}"] +if [ -z "${DART_SDK_DIR}" ] then if [[ $KERNEL_NAME == *"Darwin"* ]] then diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 50c187273cdc2..891c77e930a36 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -385,7 +385,7 @@ template("_flutter_web_platform") { extra_args = define_flags } _compile_platform("${target_name}_dart2js_unsound") { - sound_null_safety = true + sound_null_safety = false kernel_target = "dart2js" summary_only = false output_dill = "${invoker.output_dir}/dart2js_platform_unsound.dill" diff --git a/web_sdk/web_engine_tester/pubspec.yaml b/web_sdk/web_engine_tester/pubspec.yaml index 4e0dbbeae1ae7..d52b952f30511 100644 --- a/web_sdk/web_engine_tester/pubspec.yaml +++ b/web_sdk/web_engine_tester/pubspec.yaml @@ -6,7 +6,7 @@ environment: dependencies: js: 0.6.4 - stream_channel: 2.1.0 + stream_channel: 2.1.1 test: 1.22.0 webkit_inspection_protocol: 1.0.0 stack_trace: 1.10.0 From f3192dda1ca500371ea7e556676c2e8c12a1cd48 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 9 Dec 2022 14:59:45 -0800 Subject: [PATCH 09/34] A few fixes to get things compiling via dart2wasm. --- lib/web_ui/lib/src/engine/app_bootstrap.dart | 6 ++-- .../lib/src/engine/js_interop/js_loader.dart | 2 +- .../lib/src/engine/js_interop/js_promise.dart | 33 +++++++++++++++---- .../lib/src/engine/navigation/history.dart | 2 +- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/lib/web_ui/lib/src/engine/app_bootstrap.dart b/lib/web_ui/lib/src/engine/app_bootstrap.dart index 6d76f0c005c84..ace14d8490b9c 100644 --- a/lib/web_ui/lib/src/engine/app_bootstrap.dart +++ b/lib/web_ui/lib/src/engine/app_bootstrap.dart @@ -47,7 +47,7 @@ class AppBootstrap { ) async { await autoStart(); // Return the App that was just started - resolve(_prepareFlutterApp()); + resolve.resolve(_prepareFlutterApp()); })); }), // Calls [_initEngine], and returns a JS Promise that resolves to an @@ -61,7 +61,7 @@ class AppBootstrap { ) async { await _initializeEngine(configuration); // Return an app runner object - resolve(_prepareAppRunner()); + resolve.resolve(_prepareAppRunner()); })); }), ); @@ -77,7 +77,7 @@ class AppBootstrap { ) async { await _runApp(); // Return the App that was just started - resolve(_prepareFlutterApp()); + resolve.resolve(_prepareFlutterApp()); })); })); } diff --git a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart index 50a9ce5b544b1..1584b46d30975 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_loader.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_loader.dart @@ -54,7 +54,7 @@ abstract class FlutterEngineInitializer{ /// [JsFlutterConfiguration] comes from `../configuration.dart`. It is the same /// object that can be used to configure flutter "inline", through the /// (to be deprecated) `window.flutterConfiguration` object. -typedef InitializeEngineFn = Promise Function([JsFlutterConfiguration?]); +typedef InitializeEngineFn = Promise Function([JsFlutterConfiguration?]); /// Typedef for the `autoStart` function that can be called straight from an engine initializer instance. /// (Similar to [RunAppFn], but taking no specific "runApp" parameters). diff --git a/lib/web_ui/lib/src/engine/js_interop/js_promise.dart b/lib/web_ui/lib/src/engine/js_interop/js_promise.dart index 45f3f3b3482da..868c359ecbf77 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_promise.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_promise.dart @@ -6,18 +6,39 @@ library js_promise; import 'package:js/js.dart'; +import 'package:js/js_util.dart' as js_util; + +@JS() +@staticInterop +class PromiseResolver {} + +extension PromiseResolverExtension on PromiseResolver { + void resolve(T result) => js_util.callMethod(this, 'call', [this, result]); +} + +@JS() +@staticInterop +class PromiseRejecter {} + +extension PromiseRejecterExtension on PromiseRejecter { + void reject(Object? error) => js_util.callMethod(this, 'call', [this, if (error != null) error]); +} /// Type-safe JS Promises @JS('Promise') @staticInterop -abstract class Promise { +abstract class Promise { /// A constructor for a JS promise external factory Promise(PromiseExecutor executor); } /// The type of function that is used to create a Promise -typedef PromiseExecutor = void Function(PromiseResolver resolve, PromiseRejecter reject); -/// The type of function used to resolve a Promise -typedef PromiseResolver = void Function(T result); -/// The type of function used to reject a Promise (of any ) -typedef PromiseRejecter = void Function(Object? error); +typedef PromiseExecutor = void Function(PromiseResolver resolve, PromiseRejecter reject); + +Promise futureToPromise(Future future) { + return Promise(allowInterop((PromiseResolver resolver, PromiseRejecter rejecter) { + future.then( + (T value) => resolver.resolve(value), + onError: (Object? error) => rejecter.reject(error)); + })); +} diff --git a/lib/web_ui/lib/src/engine/navigation/history.dart b/lib/web_ui/lib/src/engine/navigation/history.dart index bbee4c807bb58..0cc335cfd0243 100644 --- a/lib/web_ui/lib/src/engine/navigation/history.dart +++ b/lib/web_ui/lib/src/engine/navigation/history.dart @@ -145,7 +145,7 @@ class MultiEntriesBrowserHistory extends BrowserHistory { if (_hasSerialCount(currentState)) { final Map stateMap = currentState! as Map; - return stateMap['serialCount'] as int; + return (stateMap['serialCount'] as double).toInt(); } return 0; } From dbe87a1272fe1c25ffb1c18398b490735554a999 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 9 Dec 2022 15:04:39 -0800 Subject: [PATCH 10/34] Use `futureToPromise`. --- lib/web_ui/lib/src/engine/app_bootstrap.dart | 31 ++++++-------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/lib/web_ui/lib/src/engine/app_bootstrap.dart b/lib/web_ui/lib/src/engine/app_bootstrap.dart index ace14d8490b9c..f930b87b6f4ce 100644 --- a/lib/web_ui/lib/src/engine/app_bootstrap.dart +++ b/lib/web_ui/lib/src/engine/app_bootstrap.dart @@ -40,30 +40,17 @@ class AppBootstrap { // This is a convenience method that lets the programmer call "autoStart" // from JavaScript immediately after the main.dart.js has loaded. // Returns a promise that resolves to the Flutter app that was started. - autoStart: allowInterop(() { - return Promise(allowInterop(( - PromiseResolver resolve, - PromiseRejecter _, - ) async { - await autoStart(); - // Return the App that was just started - resolve.resolve(_prepareFlutterApp()); - })); - }), + autoStart: allowInterop(() => futureToPromise(() async { + await autoStart(); + // Return the App that was just started + return _prepareFlutterApp(); + }())), // Calls [_initEngine], and returns a JS Promise that resolves to an // app runner object. - initializeEngine: allowInterop(([JsFlutterConfiguration? configuration]) { - // `params` coming from Javascript may be used to configure the engine intialization. - // The internal `initEngine` function must accept those params. - return Promise(allowInterop(( - PromiseResolver resolve, - PromiseRejecter _, - ) async { - await _initializeEngine(configuration); - // Return an app runner object - resolve.resolve(_prepareAppRunner()); - })); - }), + initializeEngine: allowInterop(([JsFlutterConfiguration? configuration]) => futureToPromise(() async { + await _initializeEngine(configuration); + return _prepareAppRunner(); + }())) ); } From 8397290f5e96ad70d0a61dc5e589292bbd57d5e2 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 12 Dec 2022 13:41:13 -0800 Subject: [PATCH 11/34] Some more fixes for dart2wasm. --- lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart | 7 ++++--- lib/web_ui/lib/src/engine/canvaskit/surface.dart | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart index 25e5f79e83874..d81a6fbe67246 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart @@ -182,9 +182,9 @@ class ColorSpace {} @staticInterop class SkWebGLContextOptions { external factory SkWebGLContextOptions({ - required int antialias, + required double antialias, // WebGL version: 1 or 2. - required int majorVersion, + required double majorVersion, }); } @@ -1368,7 +1368,8 @@ final SkFloat32List _sharedSkColor3 = mallocFloat32List(4); @JS('window.flutterCanvasKit.Path') @staticInterop class SkPath { - external factory SkPath([SkPath? other]); + external factory SkPath(); + external factory SkPath.from(SkPath other); } extension SkPathExtension on SkPath { diff --git a/lib/web_ui/lib/src/engine/canvaskit/surface.dart b/lib/web_ui/lib/src/engine/canvaskit/surface.dart index d0fc7a3ee4bfe..ff9d829f7aea6 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/surface.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/surface.dart @@ -325,7 +325,7 @@ class Surface { // Default to no anti-aliasing. Paint commands can be explicitly // anti-aliased by setting their `Paint` object's `antialias` property. antialias: _kUsingMSAA ? 1 : 0, - majorVersion: webGLVersion, + majorVersion: webGLVersion.toDouble(), ), ).toInt(); From 69c4c8667ba1628e053482952cf341771b3ddf81 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 12 Dec 2022 14:14:30 -0800 Subject: [PATCH 12/34] Allow promises to have nullable objects. --- lib/web_ui/lib/src/engine/js_interop/js_promise.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/web_ui/lib/src/engine/js_interop/js_promise.dart b/lib/web_ui/lib/src/engine/js_interop/js_promise.dart index 868c359ecbf77..9a7f9ca6951b4 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_promise.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_promise.dart @@ -10,10 +10,10 @@ import 'package:js/js_util.dart' as js_util; @JS() @staticInterop -class PromiseResolver {} +class PromiseResolver {} -extension PromiseResolverExtension on PromiseResolver { - void resolve(T result) => js_util.callMethod(this, 'call', [this, result]); +extension PromiseResolverExtension on PromiseResolver { + void resolve(T result) => js_util.callMethod(this, 'call', [this, if (result != null) result]); } @JS() @@ -27,13 +27,13 @@ extension PromiseRejecterExtension on PromiseRejecter { /// Type-safe JS Promises @JS('Promise') @staticInterop -abstract class Promise { +abstract class Promise { /// A constructor for a JS promise external factory Promise(PromiseExecutor executor); } /// The type of function that is used to create a Promise -typedef PromiseExecutor = void Function(PromiseResolver resolve, PromiseRejecter reject); +typedef PromiseExecutor = void Function(PromiseResolver resolve, PromiseRejecter reject); Promise futureToPromise(Future future) { return Promise(allowInterop((PromiseResolver resolver, PromiseRejecter rejecter) { From 831be2e4e66a0c071a9ff71f9c61edf4e25e0ae4 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 13 Dec 2022 09:43:50 -0800 Subject: [PATCH 13/34] Some changes to skwasm. --- lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart | 15 +++++++++++++++ .../skwasm/skwasm_impl/{src => }/canvas.dart | 0 .../skwasm/skwasm_impl/{src => }/image.dart | 0 .../skwasm/skwasm_impl/{src => }/paint.dart | 0 .../skwasm/skwasm_impl/{src => }/paragraph.dart | 0 .../engine/skwasm/skwasm_impl/{src => }/path.dart | 6 +++--- .../skwasm/skwasm_impl/{src => }/picture.dart | 0 .../skwasm_impl/{src => }/raw/raw_canvas.dart | 0 .../skwasm_impl/{src => }/raw/raw_geometry.dart | 0 .../skwasm_impl/{src => }/raw/raw_memory.dart | 0 .../skwasm_impl/{src => }/raw/raw_paint.dart | 0 .../skwasm_impl/{src => }/raw/raw_path.dart | 0 .../skwasm_impl/{src => }/raw/raw_picture.dart | 0 .../skwasm_impl/{src => }/raw/raw_surface.dart | 0 .../src/engine/skwasm/skwasm_impl/renderer.dart | 6 +----- .../skwasm/skwasm_impl/{src => }/surface.dart | 0 .../skwasm/skwasm_impl/{src => }/vertices.dart | 0 web_sdk/sdk_rewriter.dart | 4 ++++ 18 files changed, 23 insertions(+), 8 deletions(-) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/canvas.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/image.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/paint.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/paragraph.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/path.dart (96%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/picture.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_canvas.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_geometry.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_memory.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_paint.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_path.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_picture.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/raw/raw_surface.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/surface.dart (100%) rename lib/web_ui/lib/src/engine/skwasm/skwasm_impl/{src => }/vertices.dart (100%) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart index 554302e24e849..40f6cc8b9bdc8 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart @@ -4,4 +4,19 @@ library skwasm_impl; +export 'skwasm_impl/canvas.dart'; +export 'skwasm_impl/image.dart'; +export 'skwasm_impl/paint.dart'; +export 'skwasm_impl/paragraph.dart'; +export 'skwasm_impl/path.dart'; +export 'skwasm_impl/picture.dart'; +export 'skwasm_impl/raw/raw_canvas.dart'; +export 'skwasm_impl/raw/raw_geometry.dart'; +export 'skwasm_impl/raw/raw_memory.dart'; +export 'skwasm_impl/raw/raw_paint.dart'; +export 'skwasm_impl/raw/raw_path.dart'; +export 'skwasm_impl/raw/raw_picture.dart'; +export 'skwasm_impl/raw/raw_surface.dart'; export 'skwasm_impl/renderer.dart'; +export 'skwasm_impl/surface.dart'; +export 'skwasm_impl/vertices.dart'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/canvas.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/image.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/image.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paint.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/paragraph.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart similarity index 96% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart index e33157dadae9d..4542d58ee7e3c 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart @@ -1,7 +1,7 @@ import 'dart:ffi'; import 'dart:typed_data'; -import 'package:ui/src/engine.dart' as engine; +import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; import 'raw/raw_memory.dart'; import 'raw/raw_path.dart'; @@ -204,7 +204,7 @@ class SkwasmPath implements ui.Path { assert(path is SkwasmPath); withStackScope((StackScope s) { final Pointer convertedMatrix = - s.convertMatrix4toSkMatrix(matrix4 ?? engine.Matrix4.identity().toFloat64()); + s.convertMatrix4toSkMatrix(matrix4 ?? Matrix4.identity().toFloat64()); convertedMatrix[2] += offset.dx; convertedMatrix[5] += offset.dy; pathAddPath(_handle, (path as SkwasmPath)._handle, convertedMatrix, extend); @@ -222,7 +222,7 @@ class SkwasmPath implements ui.Path { @override ui.Path shift(ui.Offset offset) => - transform(engine.Matrix4.translationValues(offset.dx, offset.dy, 0.0).toFloat64()); + transform(Matrix4.translationValues(offset.dx, offset.dy, 0.0).toFloat64()); @override ui.Path transform(Float64List matrix4) { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/picture.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_canvas.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_geometry.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_geometry.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_memory.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_paint.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_path.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_picture.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/raw/raw_surface.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index d6c36cc5c72c7..0c0d08052ad49 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -6,17 +6,13 @@ import 'dart:async'; import 'dart:math' as math; import 'dart:typed_data'; -import 'package:ui/src/engine/skwasm/skwasm_impl/src/canvas.dart'; -import 'package:ui/src/engine/skwasm/skwasm_impl/src/paint.dart'; -import 'package:ui/src/engine/skwasm/skwasm_impl/src/picture.dart'; -import 'package:ui/src/engine/skwasm/skwasm_impl/src/vertices.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; import '../../embedder.dart'; import '../../fonts.dart'; import '../../html_image_codec.dart'; import '../../renderer.dart'; -import 'src/path.dart'; // TODO(jacksongardner): Actually implement skwasm renderer. class SkwasmRenderer implements Renderer { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/surface.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart similarity index 100% rename from lib/web_ui/lib/src/engine/skwasm/skwasm_impl/src/vertices.dart rename to lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart diff --git a/web_sdk/sdk_rewriter.dart b/web_sdk/sdk_rewriter.dart index e1b1e04024827..eb86aa0f7568b 100644 --- a/web_sdk/sdk_rewriter.dart +++ b/web_sdk/sdk_rewriter.dart @@ -166,6 +166,10 @@ List getExtraImportsForLibrary(String libraryName) { extraImports.add(entry.value); } } + + if (libraryName == 'skwasm_impl') { + extraImports.add("import 'dart:ffi';"); + } return extraImports; } From 5db2a4aa90bc053186cee0ad09cd624407a1a533 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 13 Dec 2022 17:34:53 -0800 Subject: [PATCH 14/34] Fix up some signatures. --- lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart | 4 ++-- .../lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart | 8 ++++---- lib/web_ui/skwasm/picture.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart index ae7e88bc17fab..8f1d9ec439173 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart @@ -27,10 +27,10 @@ class SkwasmPaint implements ui.Paint { } @override - ui.PaintingStyle get style => ui.PaintingStyle.values[paintGetPaintStyle(_handle)]; + ui.PaintingStyle get style => ui.PaintingStyle.values[paintGetStyle(_handle)]; @override - set style(ui.PaintingStyle style) => paintSetPaintStyle(_handle, style.index); + set style(ui.PaintingStyle style) => paintSetStyle(_handle, style.index); @override double get strokeWidth => paintGetStrokeWidth(_handle); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart index 8d805a5be1a25..0c6948b5671f3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart @@ -13,11 +13,11 @@ external void paintDestroy(PaintHandle paint); @FfiNative('skwasm.paint_setBlendMode', isLeaf: true) external void paintSetBlendMode(PaintHandle paint, int blendMode); -@FfiNative('skwasm.paint_setPaintStyle', isLeaf: true) -external void paintSetPaintStyle(PaintHandle paint, int paintStyle); +@FfiNative('skwasm.paint_setStyle', isLeaf: true) +external void paintSetStyle(PaintHandle paint, int paintStyle); -@FfiNative('skwasm.paint_getPaintStyle', isLeaf: true) -external int paintGetPaintStyle(PaintHandle paint); +@FfiNative('skwasm.paint_getStyle', isLeaf: true) +external int paintGetStyle(PaintHandle paint); @FfiNative('skwasm.paint_setStrokeWidth', isLeaf: true) external void paintSetStrokeWidth(PaintHandle paint, double strokeWidth); diff --git a/lib/web_ui/skwasm/picture.cpp b/lib/web_ui/skwasm/picture.cpp index 8b108dd144bda..b53f8de1d61af 100644 --- a/lib/web_ui/skwasm/picture.cpp +++ b/lib/web_ui/skwasm/picture.cpp @@ -10,7 +10,7 @@ SKWASM_EXPORT SkPictureRecorder* pictureRecorder_create() { return new SkPictureRecorder(); } -SKWASM_EXPORT void pictureRecorder_destroy(SkPictureRecorder* recorder) { +SKWASM_EXPORT void pictureRecorder_dispose(SkPictureRecorder* recorder) { delete recorder; } From bfbb9932e54a0da9e0a558087631c286535e217f Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Tue, 13 Dec 2022 20:48:45 -0800 Subject: [PATCH 15/34] More expressive warnings. --- .../lib/src/engine/js_interop/js_promise.dart | 7 ++- .../engine/skwasm/skwasm_impl/renderer.dart | 48 +++++++++---------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/lib/web_ui/lib/src/engine/js_interop/js_promise.dart b/lib/web_ui/lib/src/engine/js_interop/js_promise.dart index 9a7f9ca6951b4..bb36d8732a94a 100644 --- a/lib/web_ui/lib/src/engine/js_interop/js_promise.dart +++ b/lib/web_ui/lib/src/engine/js_interop/js_promise.dart @@ -8,6 +8,8 @@ library js_promise; import 'package:js/js.dart'; import 'package:js/js_util.dart' as js_util; +import '../util.dart'; + @JS() @staticInterop class PromiseResolver {} @@ -39,6 +41,9 @@ Promise futureToPromise(Future future) { return Promise(allowInterop((PromiseResolver resolver, PromiseRejecter rejecter) { future.then( (T value) => resolver.resolve(value), - onError: (Object? error) => rejecter.reject(error)); + onError: (Object? error) { + printWarning('Rejecting promise with error: $error'); + rejecter.reject(error); + }); })); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index 0c0d08052ad49..ffb15c7d66243 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -25,7 +25,7 @@ class SkwasmRenderer implements Renderer { @override ui.ImageFilter composeImageFilters({required ui.ImageFilter outer, required ui.ImageFilter inner}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('composeImageFilters not yet implemented'); } @override @@ -36,7 +36,7 @@ class SkwasmRenderer implements Renderer { @override ui.ImageFilter createBlurImageFilter({double sigmaX = 0.0, double sigmaY = 0.0, ui.TileMode tileMode = ui.TileMode.clamp}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createBlurImageFilter not yet implemented'); } @override @@ -47,32 +47,32 @@ class SkwasmRenderer implements Renderer { @override ui.Gradient createConicalGradient(ui.Offset focal, double focalRadius, ui.Offset center, double radius, List colors, [List? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix]) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createConicalGradient not yet implemented'); } @override ui.ImageFilter createDilateImageFilter({double radiusX = 0.0, double radiusY = 0.0}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createDilateImageFilter not yet implemented'); } @override ui.ImageFilter createErodeImageFilter({double radiusX = 0.0, double radiusY = 0.0}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createErodeImageFilter not yet implemented'); } @override ui.ImageShader createImageShader(ui.Image image, ui.TileMode tmx, ui.TileMode tmy, Float64List matrix4, ui.FilterQuality? filterQuality) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createImageShader not yet implemented'); } @override ui.Gradient createLinearGradient(ui.Offset from, ui.Offset to, List colors, [List? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createLinearGradientn ot yet implemented'); } @override ui.ImageFilter createMatrixImageFilter(Float64List matrix4, {ui.FilterQuality filterQuality = ui.FilterQuality.low}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createMatrixImageFilter not yet implemented'); } @override @@ -80,12 +80,12 @@ class SkwasmRenderer implements Renderer { @override ui.ParagraphBuilder createParagraphBuilder(ui.ParagraphStyle style) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createParagraphBuilder not yet implemented'); } @override ui.ParagraphStyle createParagraphStyle({ui.TextAlign? textAlign, ui.TextDirection? textDirection, int? maxLines, String? fontFamily, double? fontSize, double? height, ui.TextHeightBehavior? textHeightBehavior, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, ui.StrutStyle? strutStyle, String? ellipsis, ui.Locale? locale}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createParagraphStyle not yet implemented'); } @override @@ -96,27 +96,27 @@ class SkwasmRenderer implements Renderer { @override ui.Gradient createRadialGradient(ui.Offset center, double radius, List colors, [List? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, Float32List? matrix4]) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createRadialGradient not yet implemented'); } @override ui.SceneBuilder createSceneBuilder() { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createSceneBuilder not yet implemented'); } @override ui.StrutStyle createStrutStyle({String? fontFamily, List? fontFamilyFallback, double? fontSize, double? height, ui.TextLeadingDistribution? leadingDistribution, double? leading, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, bool? forceStrutHeight}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createStrutStyle not yet implemented'); } @override ui.Gradient createSweepGradient(ui.Offset center, List colors, [List? colorStops, ui.TileMode tileMode = ui.TileMode.clamp, double startAngle = 0.0, double endAngle = math.pi * 2, Float32List? matrix4]) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createSweepGradient not yet implemented'); } @override ui.TextStyle createTextStyle({ui.Color? color, ui.TextDecoration? decoration, ui.Color? decorationColor, ui.TextDecorationStyle? decorationStyle, double? decorationThickness, ui.FontWeight? fontWeight, ui.FontStyle? fontStyle, ui.TextBaseline? textBaseline, String? fontFamily, List? fontFamilyFallback, double? fontSize, double? letterSpacing, double? wordSpacing, double? height, ui.TextLeadingDistribution? leadingDistribution, ui.Locale? locale, ui.Paint? background, ui.Paint? foreground, List? shadows, List? fontFeatures, List? fontVariations}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createTextStyle not yet implemented'); } @override @@ -155,38 +155,38 @@ class SkwasmRenderer implements Renderer { @override void decodeImageFromPixels(Uint8List pixels, int width, int height, ui.PixelFormat format, ui.ImageDecoderCallback callback, {int? rowBytes, int? targetWidth, int? targetHeight, bool allowUpscaling = true}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('decodeImageFromPixels not yet implemented'); } @override - FontCollection get fontCollection => throw UnimplementedError('Not yet implemented'); + FontCollection get fontCollection => throw UnimplementedError('fontCollection not yet implemented'); @override FutureOr initialize() { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('initialize not yet implemented'); } @override Future instantiateImageCodec(Uint8List list, {int? targetWidth, int? targetHeight, bool allowUpscaling = true}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('instantiateImageCodec not yet implemented'); } @override Future instantiateImageCodecFromUrl(Uri uri, {WebOnlyImageCodecChunkCallback? chunkCallback}) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('instantiateImageCodecFromUrl not yet implemented'); } @override void renderScene(ui.Scene scene) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('renderScene not yet implemented'); } @override - String get rendererTag => throw UnimplementedError('Not yet implemented'); + String get rendererTag => 'skwasm'; @override void reset(FlutterViewEmbedder embedder) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('reset not yet implemented'); } @override @@ -194,6 +194,6 @@ class SkwasmRenderer implements Renderer { @override Future createFragmentProgram(String assetKey) { - throw UnimplementedError('Not yet implemented'); + throw UnimplementedError('createFragmentProgram not yet implemented'); } } From 6e4ddd1e7b08c04f4e75ecb2c66f8e59c3bde7fc Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 25 Jan 2023 12:55:24 -0800 Subject: [PATCH 16/34] Switch @FfiNative to @Native. --- .../skwasm/skwasm_impl/raw/raw_canvas.dart | 48 +++++----- .../skwasm/skwasm_impl/raw/raw_memory.dart | 6 +- .../skwasm/skwasm_impl/raw/raw_paint.dart | 34 +++---- .../skwasm/skwasm_impl/raw/raw_path.dart | 88 +++++++++---------- .../skwasm/skwasm_impl/raw/raw_picture.dart | 24 ++--- .../skwasm/skwasm_impl/raw/raw_surface.dart | 16 ++-- 6 files changed, 108 insertions(+), 108 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart index 91350e335ebae..e27a3da3c599f 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart @@ -8,81 +8,81 @@ import 'raw_picture.dart'; class CanvasWrapper extends Opaque {} typedef CanvasHandle = Pointer; -@FfiNative('skwasm.canvas_destroy', isLeaf: true) +@Native(symbol: 'skwasm.canvas_destroy', isLeaf: true) external void canvasDestroy(CanvasHandle canvas); -@FfiNative('skwasm.canvas_save', isLeaf: true) +@Native(symbol: 'skwasm.canvas_save', isLeaf: true) external void canvasSave(CanvasHandle canvas); -@FfiNative('skwasm.canvas_saveLayer', isLeaf: true) +@Native(symbol: 'skwasm.canvas_saveLayer', isLeaf: true) external void canvasSaveLayer( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@FfiNative('skwasm.canvas_restore', isLeaf: true) +@Native(symbol: 'skwasm.canvas_restore', isLeaf: true) external void canvasRestore(CanvasHandle canvas); -@FfiNative('skwasm.canvas_getSaveCount', isLeaf: true) +@Native(symbol: 'skwasm.canvas_getSaveCount', isLeaf: true) external int canvasGetSaveCount(CanvasHandle canvas); -@FfiNative('skwasm.canvas_translate', isLeaf: true) +@Native(symbol: 'skwasm.canvas_translate', isLeaf: true) external void canvasTranslate(CanvasHandle canvas, double dx, double dy); -@FfiNative('skwasm.canvas_scale', isLeaf: true) +@Native(symbol: 'skwasm.canvas_scale', isLeaf: true) external void canvasScale(CanvasHandle canvas, double sx, double sy); -@FfiNative('skwasm.canvas_rotate', isLeaf: true) +@Native(symbol: 'skwasm.canvas_rotate', isLeaf: true) external void canvasRotate(CanvasHandle canvas, double degrees); -@FfiNative('skwasm.canvas_skew', isLeaf: true) +@Native(symbol: 'skwasm.canvas_skew', isLeaf: true) external void canvasSkew(CanvasHandle canvas, double sx, double sy); -@FfiNative('skwasm.canvas_transform', isLeaf: true) +@Native(symbol: 'skwasm.canvas_transform', isLeaf: true) external void canvasTransform(CanvasHandle canvas, RawMatrix44 matrix); -@FfiNative('skwasm.canvas_clipRect', isLeaf: true) +@Native(symbol: 'skwasm.canvas_clipRect', isLeaf: true) external void canvasClipRect( CanvasHandle canvas, RawRect rect, int op, bool antialias); -@FfiNative('skwasm.canvas_clipRRect', isLeaf: true) +@Native(symbol: 'skwasm.canvas_clipRRect', isLeaf: true) external void canvasClipRRect( CanvasHandle canvas, RawRRect rrect, bool antialias); -@FfiNative('skwasm.canvas_clipPath', isLeaf: true) +@Native(symbol: 'skwasm.canvas_clipPath', isLeaf: true) external void canvasClipPath( CanvasHandle canvas, PathHandle path, bool antialias); -@FfiNative('skwasm.canvas_drawColor', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawColor', isLeaf: true) external void canvasDrawColor( CanvasHandle canvas, int color, int blendMode); -@FfiNative('skwasm.canvas_drawLine', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawLine', isLeaf: true) external void canvasDrawLine(CanvasHandle canvas, double x1, double y1, double x2, double y2, PaintHandle paint); -@FfiNative('skwasm.canvas_drawPaint', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawPaint', isLeaf: true) external void canvasDrawPaint(CanvasHandle canvas, PaintHandle paint); -@FfiNative('skwasm.canvas_drawRect', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawRect', isLeaf: true) external void canvasDrawRect( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@FfiNative('skwasm.canvas_drawRRect', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawRRect', isLeaf: true) external void canvasDrawRRect( CanvasHandle canvas, RawRRect rrect, PaintHandle paint); -@FfiNative('skwasm.canvas_drawDRRect', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawDRRect', isLeaf: true) external void canvasDrawDRRect( CanvasHandle canvas, RawRRect outer, RawRRect inner, PaintHandle paint); -@FfiNative('skwasm.canvas_drawOval', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawOval', isLeaf: true) external void canvasDrawOval( CanvasHandle canvas, RawRect oval, PaintHandle paint); -@FfiNative('skwasm.canvas_drawCircle', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawCircle', isLeaf: true) external void canvasDrawCircle(CanvasHandle canvas, double x, double y, double radius, PaintHandle paint); -@FfiNative('skwasm.canvas_drawCircle', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawCircle', isLeaf: true) external void canvasDrawArc( CanvasHandle canvas, RawRect rect, @@ -91,9 +91,9 @@ external void canvasDrawArc( bool useCenter, PaintHandle paint); -@FfiNative('skwasm.canvas_drawPath', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawPath', isLeaf: true) external void canvasDrawPath( CanvasHandle canvas, PathHandle path, PaintHandle paint); -@FfiNative('skwasm.canvas_drawPicture', isLeaf: true) +@Native(symbol: 'skwasm.canvas_drawPicture', isLeaf: true) external void canvasDrawPicture(CanvasHandle canvas, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart index a418488ab8ac2..71e2b1e0c388b 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart @@ -8,13 +8,13 @@ class Stack extends Opaque {} typedef StackPointer = Pointer; /// Generic linear memory allocation -@FfiNative('skwasm.stackAlloc', isLeaf: true) +@Native(symbol: 'skwasm.stackAlloc', isLeaf: true) external StackPointer stackAlloc(int length); -@FfiNative('skwasm.stackSave', isLeaf: true) +@Native(symbol: 'skwasm.stackSave', isLeaf: true) external StackPointer stackSave(); -@FfiNative('skwasm.stackRestore', isLeaf: true) +@Native(symbol: 'skwasm.stackRestore', isLeaf: true) external void stackRestore(StackPointer pointer); class StackScope { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart index 0c6948b5671f3..b0d1fa995c5da 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart @@ -4,53 +4,53 @@ class RawPaint extends Opaque {} typedef PaintHandle = Pointer; -@FfiNative('skwasm.paint_create', isLeaf: true) +@Native(symbol: 'skwasm.paint_create', isLeaf: true) external PaintHandle paintCreate(); -@FfiNative('skwasm.paint_destroy', isLeaf: true) +@Native(symbol: 'skwasm.paint_destroy', isLeaf: true) external void paintDestroy(PaintHandle paint); -@FfiNative('skwasm.paint_setBlendMode', isLeaf: true) +@Native(symbol: 'skwasm.paint_setBlendMode', isLeaf: true) external void paintSetBlendMode(PaintHandle paint, int blendMode); -@FfiNative('skwasm.paint_setStyle', isLeaf: true) +@Native(symbol: 'skwasm.paint_setStyle', isLeaf: true) external void paintSetStyle(PaintHandle paint, int paintStyle); -@FfiNative('skwasm.paint_getStyle', isLeaf: true) +@Native(symbol: 'skwasm.paint_getStyle', isLeaf: true) external int paintGetStyle(PaintHandle paint); -@FfiNative('skwasm.paint_setStrokeWidth', isLeaf: true) +@Native(symbol: 'skwasm.paint_setStrokeWidth', isLeaf: true) external void paintSetStrokeWidth(PaintHandle paint, double strokeWidth); -@FfiNative('skwasm.paint_getStrokeWidth', isLeaf: true) +@Native(symbol: 'skwasm.paint_getStrokeWidth', isLeaf: true) external double paintGetStrokeWidth(PaintHandle paint); -@FfiNative('skwasm.paint_setStrokeCap', isLeaf: true) +@Native(symbol: 'skwasm.paint_setStrokeCap', isLeaf: true) external void paintSetStrokeCap(PaintHandle paint, int cap); -@FfiNative('skwasm.paint_getStrokeCap', isLeaf: true) +@Native(symbol: 'skwasm.paint_getStrokeCap', isLeaf: true) external int paintGetStrokeCap(PaintHandle paint); -@FfiNative('skwasm.paint_setStrokeJoin', isLeaf: true) +@Native(symbol: 'skwasm.paint_setStrokeJoin', isLeaf: true) external void paintSetStrokeJoin(PaintHandle paint, int join); -@FfiNative('skwasm.paint_getStrokeJoin', isLeaf: true) +@Native(symbol: 'skwasm.paint_getStrokeJoin', isLeaf: true) external int paintGetStrokeJoin(PaintHandle paint); -@FfiNative('skwasm.paint_setAntiAlias', isLeaf: true) +@Native(symbol: 'skwasm.paint_setAntiAlias', isLeaf: true) external void paintSetAntiAlias(PaintHandle paint, bool antiAlias); -@FfiNative('skwasm.paint_getAntiAlias', isLeaf: true) +@Native(symbol: 'skwasm.paint_getAntiAlias', isLeaf: true) external bool paintGetAntiAlias(PaintHandle paint); -@FfiNative('skwasm.paint_setColorInt', isLeaf: true) +@Native(symbol: 'skwasm.paint_setColorInt', isLeaf: true) external void paintSetColorInt(PaintHandle paint, int color); -@FfiNative('skwasm.paint_getColorInt', isLeaf: true) +@Native(symbol: 'skwasm.paint_getColorInt', isLeaf: true) external int paintGetColorInt(PaintHandle paint); -@FfiNative('skwasm.paint_setMiterLimit', isLeaf: true) +@Native(symbol: 'skwasm.paint_setMiterLimit', isLeaf: true) external void paintSetMiterLimit(PaintHandle paint, double miterLimit); -@FfiNative('skwasm.paint_getMiterLimit', isLeaf: true) +@Native(symbol: 'skwasm.paint_getMiterLimit', isLeaf: true) external double paintGetMiterLimit(PaintHandle paint); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart index 48075ee20dbe0..1f37440a9b920 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart @@ -6,49 +6,49 @@ class RawPath extends Opaque {} typedef PathHandle = Pointer; -@FfiNative('skwasm.path_create', isLeaf: true) +@Native(symbol: 'skwasm.path_create', isLeaf: true) external PathHandle pathCreate(); -@FfiNative('skwasm.path_destroy', isLeaf: true) +@Native(symbol: 'skwasm.path_destroy', isLeaf: true) external void pathDestroy(PathHandle path); -@FfiNative('skwasm.path_copy', isLeaf: true) +@Native(symbol: 'skwasm.path_copy', isLeaf: true) external PathHandle pathCopy(PathHandle path); -@FfiNative('skwasm.path_setFillType', isLeaf: true) +@Native(symbol: 'skwasm.path_setFillType', isLeaf: true) external void pathSetFillType(PathHandle path, int fillType); -@FfiNative('skwasm.path_getFillType', isLeaf: true) +@Native(symbol: 'skwasm.path_getFillType', isLeaf: true) external int pathGetFillType(PathHandle path); -@FfiNative('skwasm.path_moveTo', isLeaf: true) +@Native(symbol: 'skwasm.path_moveTo', isLeaf: true) external void pathMoveTo(PathHandle path, double x, double y); -@FfiNative('skwasm.path_relativeMoveTo', isLeaf: true) +@Native(symbol: 'skwasm.path_relativeMoveTo', isLeaf: true) external void pathRelativeMoveTo(PathHandle path, double x, double y); -@FfiNative('skwasm.path_lineTo', isLeaf: true) +@Native(symbol: 'skwasm.path_lineTo', isLeaf: true) external void pathLineTo(PathHandle path, double x, double y); -@FfiNative( - 'skwasm.path_relativeLineTo', +@Native( + symbol: 'skwasm.path_relativeLineTo', isLeaf: true) external void pathRelativeLineTo(PathHandle path, double x, double y); -@FfiNative( - 'skwasm.path_quadraticBezierTo', +@Native( + symbol: 'skwasm.path_quadraticBezierTo', isLeaf: true) external void pathQuadraticBezierTo( PathHandle path, double x1, double y1, double x2, double y2); -@FfiNative( - 'skwasm.path_relativeQuadraticBezierTo', +@Native( + symbol: 'skwasm.path_relativeQuadraticBezierTo', isLeaf: true) external void pathRelativeQuadraticBezierTo( PathHandle path, double x1, double y1, double x2, double y2); -@FfiNative( - 'skwasm.path_cubicTo', +@Native( + symbol: 'skwasm.path_cubicTo', isLeaf: true) external void pathCubicTo( PathHandle path, @@ -60,8 +60,8 @@ external void pathCubicTo( double y3 ); -@FfiNative( - 'skwasm.path_relativeCubicTo', +@Native( + symbol: 'skwasm.path_relativeCubicTo', isLeaf: true) external void pathRelativeCubicTo( PathHandle path, @@ -73,8 +73,8 @@ external void pathRelativeCubicTo( double y3 ); -@FfiNative( - 'skwasm.path_conicTo', +@Native( + symbol: 'skwasm.path_conicTo', isLeaf: true) external void pathConicTo( PathHandle path, @@ -85,8 +85,8 @@ external void pathConicTo( double w ); -@FfiNative( - 'skwasm.path_relativeConicTo', +@Native( + symbol: 'skwasm.path_relativeConicTo', isLeaf: true) external void pathRelativeConicTo( PathHandle path, @@ -97,8 +97,8 @@ external void pathRelativeConicTo( double w ); -@FfiNative( - 'skwasm.path_arcToOval', +@Native( + symbol: 'skwasm.path_arcToOval', isLeaf: true) external void pathArcToOval( PathHandle path, @@ -108,8 +108,8 @@ external void pathArcToOval( bool forceMoveto ); -@FfiNative( - 'skwasm.path_arcToRotated', +@Native( + symbol: 'skwasm.path_arcToRotated', isLeaf: true) external void pathArcToRotated( PathHandle path, @@ -122,8 +122,8 @@ external void pathArcToRotated( double y ); -@FfiNative( - 'skwasm.path_relativeArcToRotated', +@Native( + symbol: 'skwasm.path_relativeArcToRotated', isLeaf: true) external void pathRelativeArcToRotated( PathHandle path, @@ -136,14 +136,14 @@ external void pathRelativeArcToRotated( double y ); -@FfiNative('skwasm.path_addRect', isLeaf: true) +@Native(symbol: 'skwasm.path_addRect', isLeaf: true) external void pathAddRect(PathHandle path, RawRect oval); -@FfiNative('skwasm.path_addOval', isLeaf: true) +@Native(symbol: 'skwasm.path_addOval', isLeaf: true) external void pathAddOval(PathHandle path, RawRect oval); -@FfiNative( - 'skwasm.path_addArc', +@Native( + symbol: 'skwasm.path_addArc', isLeaf: true) external void pathAddArc( PathHandle path, @@ -152,8 +152,8 @@ external void pathAddArc( double sweepAngleDegrees ); -@FfiNative( - 'skwasm.path_addPolygon', +@Native( + symbol: 'skwasm.path_addPolygon', isLeaf: true) external void pathAddPolygon( PathHandle path, @@ -162,11 +162,11 @@ external void pathAddPolygon( bool close ); -@FfiNative('skwasm.path_addRRect', isLeaf: true) +@Native(symbol: 'skwasm.path_addRRect', isLeaf: true) external void pathAddRRect(PathHandle path, RawRRect rrectValues); -@FfiNative( - 'skwasm.path_addPath', +@Native( + symbol: 'skwasm.path_addPath', isLeaf: true) external void pathAddPath( PathHandle path, @@ -175,22 +175,22 @@ external void pathAddPath( bool extendPath ); -@FfiNative('skwasm.path_close', isLeaf: true) +@Native(symbol: 'skwasm.path_close', isLeaf: true) external void pathClose(PathHandle path); -@FfiNative('skwasm.path_reset', isLeaf: true) +@Native(symbol: 'skwasm.path_reset', isLeaf: true) external void pathReset(PathHandle path); -@FfiNative('skwasm.path_contains', isLeaf: true) +@Native(symbol: 'skwasm.path_contains', isLeaf: true) external bool pathContains(PathHandle path, double x, double y); -@FfiNative('skwasm.path_transform', isLeaf: true) +@Native(symbol: 'skwasm.path_transform', isLeaf: true) external void pathTransform(PathHandle path, RawMatrix33 matrix33); -@FfiNative('skwasm.path_getBounds', isLeaf: true) +@Native(symbol: 'skwasm.path_getBounds', isLeaf: true) external void pathGetBounds(PathHandle path, RawRect outRect); -@FfiNative( - 'skwasm.path_getBounds', +@Native( + symbol: 'skwasm.path_getBounds', isLeaf: true) external PathHandle pathCombine(int operation, PathHandle path1, PathHandle path2); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart index 8705eb6cac5eb..078adda299738 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart @@ -9,33 +9,33 @@ typedef PictureRecorderHandle = Pointer; class RawPicture extends Opaque {} typedef PictureHandle = Pointer; -@FfiNative( - 'skwasm.pictureRecorder_create', +@Native( + symbol: 'skwasm.pictureRecorder_create', isLeaf: true) external PictureRecorderHandle pictureRecorderCreate(); -@FfiNative( - 'skwasm.pictureRecorder_destroy', +@Native( + symbol: 'skwasm.pictureRecorder_destroy', isLeaf: true) external void pictureRecorderDestroy(PictureRecorderHandle picture); -@FfiNative( - 'skwasm.pictureRecorder_beginRecording', +@Native( + symbol: 'skwasm.pictureRecorder_beginRecording', isLeaf: true) external CanvasHandle pictureRecorderBeginRecording( PictureRecorderHandle picture, RawRect cullRect); -@FfiNative( - 'skwasm.pictureRecorder_endRecording', +@Native( + symbol: 'skwasm.pictureRecorder_endRecording', isLeaf: true) external PictureHandle pictureRecorderEndRecording(PictureRecorderHandle picture); -@FfiNative( - 'skwasm.pictureRecorder_dispose', +@Native( + symbol: 'skwasm.pictureRecorder_dispose', isLeaf: true) external void pictureDispose(PictureHandle handle); -@FfiNative( - 'skwasm.pictureRecorder_approximateBytesUsed', +@Native( + symbol: 'skwasm.pictureRecorder_approximateBytesUsed', isLeaf: true) external int pictureApproximateBytesUsed(PictureHandle handle); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart index 17c8a43146de5..ded6753bd9969 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart @@ -4,18 +4,18 @@ import 'raw_picture.dart'; class RawSurface extends Opaque {} typedef SurfaceHandle = Pointer; -@FfiNative)>( - 'skwasm.surface_createFromCanvas', +@Native)>( + symbol: 'skwasm.surface_createFromCanvas', isLeaf: true) external SurfaceHandle surfaceCreateFromCanvas(Pointer querySelector); -@FfiNative( - 'skwasm.surface_destroy', +@Native( + symbol: 'skwasm.surface_destroy', isLeaf: true) external void surfaceDestroy(SurfaceHandle surface); -@FfiNative( - 'skwasm.surface_setCanvasSize', +@Native( + symbol: 'skwasm.surface_setCanvasSize', isLeaf: true) external void surfaceSetCanvasSize( SurfaceHandle surface, @@ -23,7 +23,7 @@ external void surfaceSetCanvasSize( int height ); -@FfiNative( - 'skwasm.surface_renderPicture', +@Native( + symbol: 'skwasm.surface_renderPicture', isLeaf: true) external void surfaceRenderPicture(SurfaceHandle surface, PictureHandle picture); From 0461799ceed437368199a6feddda1f8cfa77a2d4 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 27 Jan 2023 12:36:30 -0800 Subject: [PATCH 17/34] Unit tests partially working. --- lib/web_ui/dev/steps/compile_tests_step.dart | 9 +++ lib/web_ui/dev/test_dart2wasm.js | 20 +++++- lib/web_ui/dev/test_platform.dart | 16 ++++- lib/web_ui/lib/src/engine/renderer.dart | 2 +- .../src/engine/skwasm/skwasm_impl/canvas.dart | 7 +- .../src/engine/skwasm/skwasm_impl/paint.dart | 2 +- .../src/engine/skwasm/skwasm_impl/path.dart | 3 +- .../engine/skwasm/skwasm_impl/picture.dart | 3 +- .../skwasm/skwasm_impl/raw/raw_canvas.dart | 56 ++++++++-------- .../skwasm/skwasm_impl/raw/raw_memory.dart | 9 ++- .../skwasm/skwasm_impl/raw/raw_paint.dart | 37 ++++++----- .../skwasm/skwasm_impl/raw/raw_path.dart | 65 ++++++++++--------- .../skwasm/skwasm_impl/raw/raw_picture.dart | 18 ++--- .../skwasm/skwasm_impl/raw/raw_surface.dart | 13 ++-- .../engine/skwasm/skwasm_impl/surface.dart | 4 +- 15 files changed, 153 insertions(+), 111 deletions(-) diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart index 4e350136ad8a0..a69b8900520fd 100644 --- a/lib/web_ui/dev/steps/compile_tests_step.dart +++ b/lib/web_ui/dev/steps/compile_tests_step.dart @@ -358,11 +358,13 @@ Future compileUnitTestToJS(FilePath input, {required Renderer renderer}) a Future compileUnitTestToWasm(FilePath input, {required Renderer renderer}) async { final String targetFileName = pathlib.join( environment.webUiBuildDir.path, + getBuildDirForRenderer(renderer), '${input.relativeToWebUi}.browser_test.dart.wasm', ); final io.Directory directoryToTarget = io.Directory(pathlib.join( environment.webUiBuildDir.path, + getBuildDirForRenderer(renderer), pathlib.dirname(input.relativeToWebUi))); if (!directoryToTarget.existsSync()) { @@ -381,6 +383,13 @@ Future compileUnitTestToWasm(FilePath input, {required Renderer renderer}) '-DFLUTTER_WEB_AUTO_DETECT=false', '-DFLUTTER_WEB_USE_SKIA=${renderer == Renderer.canvasKit}', '-DFLUTTER_WEB_USE_SKWASM=${renderer == Renderer.skwasm}', + + if (renderer == Renderer.skwasm) + ...[ + '--import-shared-memory', + '--shared-memory-max-pages=32768', + ], + input.relativeToWebUi, // current path. targetFileName, // target path. ]; diff --git a/lib/web_ui/dev/test_dart2wasm.js b/lib/web_ui/dev/test_dart2wasm.js index 42ac14650d348..3fd63d7d926a9 100644 --- a/lib/web_ui/dev/test_dart2wasm.js +++ b/lib/web_ui/dev/test_dart2wasm.js @@ -54,10 +54,28 @@ window.onload = async function () { let dart2wasm_runtime; let moduleInstance; try { + const isSkwasm = link.getAttribute('skwasm'); + console.log(`isSkwasm: ${isSkwasm}`) + const imports = isSkwasm === null ? {} : new Promise((resolve, reject) => { + const skwasmScript = document.createElement('script'); + skwasmScript.src = '/skwasm/skwasm.js'; + + document.body.appendChild(skwasmScript); + skwasmScript.addEventListener('load', async () => { + const skwasmInstance = await skwasm(); + resolve({ + "skwasm": skwasmInstance.asm, + "ffi": { + "memory": skwasmInstance.wasmMemory, + } + }); + }); + }); + let baseName = link.href + '.browser_test.dart'; dart2wasm_runtime = await import(baseName + '.mjs'); const dartModulePromise = WebAssembly.compileStreaming(fetch(baseName + '.wasm')); - moduleInstance = await dart2wasm_runtime.instantiate(dartModulePromise, {}); + moduleInstance = await dart2wasm_runtime.instantiate(dartModulePromise, imports); } catch (exception) { const message = `Failed to fetch and instantiate wasm module: ${exception}`; sendLoadException(message); diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 007670b78b0b6..c163dccede240 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -92,7 +92,15 @@ class BrowserPlatform extends PlatformPlugin { .add(_screenshotHandler) .add(_fileNotFoundCatcher); - server.mount(cascade.handler); + final shelf.Handler rootHandler = const shelf.Pipeline() + .addMiddleware(shelf.createMiddleware( + responseHandler: (shelf.Response response) => response.change(headers: { + 'Cross-Origin-Opener-Policy': 'same-origin', + 'Cross-Origin-Embedder-Policy': 'require-corp', + }) + )) + .addHandler(cascade.handler); + server.mount(rootHandler); } /// Starts the server. @@ -443,7 +451,7 @@ class BrowserPlatform extends PlatformPlugin { // Link to the Dart wrapper. final String scriptBase = htmlEscape.convert(p.basename(test)); - final String link = ''; + final String link = ''; final String testRunner = isWasm ? '/test_dart2wasm.js' : 'packages/test/dart.js'; @@ -462,7 +470,9 @@ class BrowserPlatform extends PlatformPlugin { - ''', headers: {'Content-Type': 'text/html'}); + ''', headers: { + 'Content-Type': 'text/html', + }); } return shelf.Response.notFound('Not found.'); diff --git a/lib/web_ui/lib/src/engine/renderer.dart b/lib/web_ui/lib/src/engine/renderer.dart index cc715bb510386..41f01aeb31f4d 100644 --- a/lib/web_ui/lib/src/engine/renderer.dart +++ b/lib/web_ui/lib/src/engine/renderer.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:math' as math; import 'dart:typed_data'; +import 'package:ui/src/engine/skwasm/skwasm_stub.dart' if (dart.library.ffi) 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; import 'browser_detection.dart'; @@ -15,7 +16,6 @@ import 'embedder.dart'; import 'fonts.dart'; import 'html/renderer.dart'; import 'html_image_codec.dart'; -import 'skwasm/skwasm_stub/renderer.dart' if (dart.library.ffi) 'skwasm/skwasm_impl/renderer.dart'; final Renderer _renderer = Renderer._internal(); Renderer get renderer => _renderer; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart index 2f0954c45341b..f6db3faf2e8eb 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart @@ -3,12 +3,7 @@ import 'dart:typed_data'; import 'package:ui/ui.dart' as ui; -import 'paint.dart'; -import 'path.dart'; -import 'picture.dart'; -import 'raw/raw_canvas.dart'; -import 'raw/raw_memory.dart'; -import 'raw/raw_picture.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class SkwasmCanvas implements ui.Canvas { factory SkwasmCanvas(SkwasmPictureRecorder recorder, ui.Rect cullRect) => diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart index 8f1d9ec439173..7d5a2f105acc1 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart @@ -1,5 +1,5 @@ import 'package:ui/ui.dart' as ui; -import 'raw/raw_paint.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class SkwasmPaint implements ui.Paint { factory SkwasmPaint() { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart index 4542d58ee7e3c..e64588fbe799d 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart @@ -2,9 +2,8 @@ import 'dart:ffi'; import 'dart:typed_data'; import 'package:ui/src/engine.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; -import 'raw/raw_memory.dart'; -import 'raw/raw_path.dart'; enum PathDirection { clockwise, diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart index 3e7947108c9a8..1625f16a8e7b3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart @@ -1,7 +1,6 @@ +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; -import 'raw/raw_picture.dart'; - class SkwasmPicture implements ui.Picture { SkwasmPicture.fromHandle(this._handle); final PictureHandle _handle; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart index e27a3da3c599f..9cefeb87908c0 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart @@ -1,88 +1,88 @@ +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:ffi'; -import 'raw_geometry.dart'; -import 'raw_paint.dart'; -import 'raw_path.dart'; -import 'raw_picture.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class CanvasWrapper extends Opaque {} typedef CanvasHandle = Pointer; -@Native(symbol: 'skwasm.canvas_destroy', isLeaf: true) +@Native(symbol: 'canvas_destroy', isLeaf: true) external void canvasDestroy(CanvasHandle canvas); -@Native(symbol: 'skwasm.canvas_save', isLeaf: true) +@Native(symbol: 'canvas_save', isLeaf: true) external void canvasSave(CanvasHandle canvas); -@Native(symbol: 'skwasm.canvas_saveLayer', isLeaf: true) +@Native(symbol: 'canvas_saveLayer', isLeaf: true) external void canvasSaveLayer( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_restore', isLeaf: true) +@Native(symbol: 'canvas_restore', isLeaf: true) external void canvasRestore(CanvasHandle canvas); -@Native(symbol: 'skwasm.canvas_getSaveCount', isLeaf: true) +@Native(symbol: 'canvas_getSaveCount', isLeaf: true) external int canvasGetSaveCount(CanvasHandle canvas); -@Native(symbol: 'skwasm.canvas_translate', isLeaf: true) +@Native(symbol: 'canvas_translate', isLeaf: true) external void canvasTranslate(CanvasHandle canvas, double dx, double dy); -@Native(symbol: 'skwasm.canvas_scale', isLeaf: true) +@Native(symbol: 'canvas_scale', isLeaf: true) external void canvasScale(CanvasHandle canvas, double sx, double sy); -@Native(symbol: 'skwasm.canvas_rotate', isLeaf: true) +@Native(symbol: 'canvas_rotate', isLeaf: true) external void canvasRotate(CanvasHandle canvas, double degrees); -@Native(symbol: 'skwasm.canvas_skew', isLeaf: true) +@Native(symbol: 'canvas_skew', isLeaf: true) external void canvasSkew(CanvasHandle canvas, double sx, double sy); -@Native(symbol: 'skwasm.canvas_transform', isLeaf: true) +@Native(symbol: 'canvas_transform', isLeaf: true) external void canvasTransform(CanvasHandle canvas, RawMatrix44 matrix); -@Native(symbol: 'skwasm.canvas_clipRect', isLeaf: true) +@Native(symbol: 'canvas_clipRect', isLeaf: true) external void canvasClipRect( CanvasHandle canvas, RawRect rect, int op, bool antialias); -@Native(symbol: 'skwasm.canvas_clipRRect', isLeaf: true) +@Native(symbol: 'canvas_clipRRect', isLeaf: true) external void canvasClipRRect( CanvasHandle canvas, RawRRect rrect, bool antialias); -@Native(symbol: 'skwasm.canvas_clipPath', isLeaf: true) +@Native(symbol: 'canvas_clipPath', isLeaf: true) external void canvasClipPath( CanvasHandle canvas, PathHandle path, bool antialias); -@Native(symbol: 'skwasm.canvas_drawColor', isLeaf: true) +@Native(symbol: 'canvas_drawColor', isLeaf: true) external void canvasDrawColor( CanvasHandle canvas, int color, int blendMode); -@Native(symbol: 'skwasm.canvas_drawLine', isLeaf: true) +@Native(symbol: 'canvas_drawLine', isLeaf: true) external void canvasDrawLine(CanvasHandle canvas, double x1, double y1, double x2, double y2, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawPaint', isLeaf: true) +@Native(symbol: 'canvas_drawPaint', isLeaf: true) external void canvasDrawPaint(CanvasHandle canvas, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawRect', isLeaf: true) +@Native(symbol: 'canvas_drawRect', isLeaf: true) external void canvasDrawRect( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawRRect', isLeaf: true) +@Native(symbol: 'canvas_drawRRect', isLeaf: true) external void canvasDrawRRect( CanvasHandle canvas, RawRRect rrect, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawDRRect', isLeaf: true) +@Native(symbol: 'canvas_drawDRRect', isLeaf: true) external void canvasDrawDRRect( CanvasHandle canvas, RawRRect outer, RawRRect inner, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawOval', isLeaf: true) +@Native(symbol: 'canvas_drawOval', isLeaf: true) external void canvasDrawOval( CanvasHandle canvas, RawRect oval, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawCircle', isLeaf: true) +@Native(symbol: 'canvas_drawCircle', isLeaf: true) external void canvasDrawCircle(CanvasHandle canvas, double x, double y, double radius, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawCircle', isLeaf: true) +@Native(symbol: 'canvas_drawCircle', isLeaf: true) external void canvasDrawArc( CanvasHandle canvas, RawRect rect, @@ -91,9 +91,9 @@ external void canvasDrawArc( bool useCenter, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawPath', isLeaf: true) +@Native(symbol: 'canvas_drawPath', isLeaf: true) external void canvasDrawPath( CanvasHandle canvas, PathHandle path, PaintHandle paint); -@Native(symbol: 'skwasm.canvas_drawPicture', isLeaf: true) +@Native(symbol: 'canvas_drawPicture', isLeaf: true) external void canvasDrawPicture(CanvasHandle canvas, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart index 71e2b1e0c388b..1753cead33680 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart @@ -1,3 +1,6 @@ +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:convert'; import 'dart:ffi'; import 'dart:typed_data'; @@ -8,13 +11,13 @@ class Stack extends Opaque {} typedef StackPointer = Pointer; /// Generic linear memory allocation -@Native(symbol: 'skwasm.stackAlloc', isLeaf: true) +@Native(symbol: 'stackAlloc', isLeaf: true) external StackPointer stackAlloc(int length); -@Native(symbol: 'skwasm.stackSave', isLeaf: true) +@Native(symbol: 'stackSave', isLeaf: true) external StackPointer stackSave(); -@Native(symbol: 'skwasm.stackRestore', isLeaf: true) +@Native(symbol: 'stackRestore', isLeaf: true) external void stackRestore(StackPointer pointer); class StackScope { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart index b0d1fa995c5da..d532276e11372 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart @@ -1,56 +1,59 @@ +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:ffi'; class RawPaint extends Opaque {} typedef PaintHandle = Pointer; -@Native(symbol: 'skwasm.paint_create', isLeaf: true) +@Native(symbol: 'paint_create', isLeaf: true) external PaintHandle paintCreate(); -@Native(symbol: 'skwasm.paint_destroy', isLeaf: true) +@Native(symbol: 'paint_destroy', isLeaf: true) external void paintDestroy(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setBlendMode', isLeaf: true) +@Native(symbol: 'paint_setBlendMode', isLeaf: true) external void paintSetBlendMode(PaintHandle paint, int blendMode); -@Native(symbol: 'skwasm.paint_setStyle', isLeaf: true) +@Native(symbol: 'paint_setStyle', isLeaf: true) external void paintSetStyle(PaintHandle paint, int paintStyle); -@Native(symbol: 'skwasm.paint_getStyle', isLeaf: true) +@Native(symbol: 'paint_getStyle', isLeaf: true) external int paintGetStyle(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setStrokeWidth', isLeaf: true) +@Native(symbol: 'paint_setStrokeWidth', isLeaf: true) external void paintSetStrokeWidth(PaintHandle paint, double strokeWidth); -@Native(symbol: 'skwasm.paint_getStrokeWidth', isLeaf: true) +@Native(symbol: 'paint_getStrokeWidth', isLeaf: true) external double paintGetStrokeWidth(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setStrokeCap', isLeaf: true) +@Native(symbol: 'paint_setStrokeCap', isLeaf: true) external void paintSetStrokeCap(PaintHandle paint, int cap); -@Native(symbol: 'skwasm.paint_getStrokeCap', isLeaf: true) +@Native(symbol: 'paint_getStrokeCap', isLeaf: true) external int paintGetStrokeCap(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setStrokeJoin', isLeaf: true) +@Native(symbol: 'paint_setStrokeJoin', isLeaf: true) external void paintSetStrokeJoin(PaintHandle paint, int join); -@Native(symbol: 'skwasm.paint_getStrokeJoin', isLeaf: true) +@Native(symbol: 'paint_getStrokeJoin', isLeaf: true) external int paintGetStrokeJoin(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setAntiAlias', isLeaf: true) +@Native(symbol: 'paint_setAntiAlias', isLeaf: true) external void paintSetAntiAlias(PaintHandle paint, bool antiAlias); -@Native(symbol: 'skwasm.paint_getAntiAlias', isLeaf: true) +@Native(symbol: 'paint_getAntiAlias', isLeaf: true) external bool paintGetAntiAlias(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setColorInt', isLeaf: true) +@Native(symbol: 'paint_setColorInt', isLeaf: true) external void paintSetColorInt(PaintHandle paint, int color); -@Native(symbol: 'skwasm.paint_getColorInt', isLeaf: true) +@Native(symbol: 'paint_getColorInt', isLeaf: true) external int paintGetColorInt(PaintHandle paint); -@Native(symbol: 'skwasm.paint_setMiterLimit', isLeaf: true) +@Native(symbol: 'paint_setMiterLimit', isLeaf: true) external void paintSetMiterLimit(PaintHandle paint, double miterLimit); -@Native(symbol: 'skwasm.paint_getMiterLimit', isLeaf: true) +@Native(symbol: 'paint_getMiterLimit', isLeaf: true) external double paintGetMiterLimit(PaintHandle paint); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart index 1f37440a9b920..9adb2509be5ff 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart @@ -1,54 +1,57 @@ +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:ffi'; -import 'raw_geometry.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class RawPath extends Opaque {} typedef PathHandle = Pointer; -@Native(symbol: 'skwasm.path_create', isLeaf: true) +@Native(symbol: 'path_create', isLeaf: true) external PathHandle pathCreate(); -@Native(symbol: 'skwasm.path_destroy', isLeaf: true) +@Native(symbol: 'path_destroy', isLeaf: true) external void pathDestroy(PathHandle path); -@Native(symbol: 'skwasm.path_copy', isLeaf: true) +@Native(symbol: 'path_copy', isLeaf: true) external PathHandle pathCopy(PathHandle path); -@Native(symbol: 'skwasm.path_setFillType', isLeaf: true) +@Native(symbol: 'path_setFillType', isLeaf: true) external void pathSetFillType(PathHandle path, int fillType); -@Native(symbol: 'skwasm.path_getFillType', isLeaf: true) +@Native(symbol: 'path_getFillType', isLeaf: true) external int pathGetFillType(PathHandle path); -@Native(symbol: 'skwasm.path_moveTo', isLeaf: true) +@Native(symbol: 'path_moveTo', isLeaf: true) external void pathMoveTo(PathHandle path, double x, double y); -@Native(symbol: 'skwasm.path_relativeMoveTo', isLeaf: true) +@Native(symbol: 'path_relativeMoveTo', isLeaf: true) external void pathRelativeMoveTo(PathHandle path, double x, double y); -@Native(symbol: 'skwasm.path_lineTo', isLeaf: true) +@Native(symbol: 'path_lineTo', isLeaf: true) external void pathLineTo(PathHandle path, double x, double y); @Native( - symbol: 'skwasm.path_relativeLineTo', + symbol: 'path_relativeLineTo', isLeaf: true) external void pathRelativeLineTo(PathHandle path, double x, double y); @Native( - symbol: 'skwasm.path_quadraticBezierTo', + symbol: 'path_quadraticBezierTo', isLeaf: true) external void pathQuadraticBezierTo( PathHandle path, double x1, double y1, double x2, double y2); @Native( - symbol: 'skwasm.path_relativeQuadraticBezierTo', + symbol: 'path_relativeQuadraticBezierTo', isLeaf: true) external void pathRelativeQuadraticBezierTo( PathHandle path, double x1, double y1, double x2, double y2); @Native( - symbol: 'skwasm.path_cubicTo', + symbol: 'path_cubicTo', isLeaf: true) external void pathCubicTo( PathHandle path, @@ -61,7 +64,7 @@ external void pathCubicTo( ); @Native( - symbol: 'skwasm.path_relativeCubicTo', + symbol: 'path_relativeCubicTo', isLeaf: true) external void pathRelativeCubicTo( PathHandle path, @@ -74,7 +77,7 @@ external void pathRelativeCubicTo( ); @Native( - symbol: 'skwasm.path_conicTo', + symbol: 'path_conicTo', isLeaf: true) external void pathConicTo( PathHandle path, @@ -86,7 +89,7 @@ external void pathConicTo( ); @Native( - symbol: 'skwasm.path_relativeConicTo', + symbol: 'path_relativeConicTo', isLeaf: true) external void pathRelativeConicTo( PathHandle path, @@ -98,7 +101,7 @@ external void pathRelativeConicTo( ); @Native( - symbol: 'skwasm.path_arcToOval', + symbol: 'path_arcToOval', isLeaf: true) external void pathArcToOval( PathHandle path, @@ -109,7 +112,7 @@ external void pathArcToOval( ); @Native( - symbol: 'skwasm.path_arcToRotated', + symbol: 'path_arcToRotated', isLeaf: true) external void pathArcToRotated( PathHandle path, @@ -123,7 +126,7 @@ external void pathArcToRotated( ); @Native( - symbol: 'skwasm.path_relativeArcToRotated', + symbol: 'path_relativeArcToRotated', isLeaf: true) external void pathRelativeArcToRotated( PathHandle path, @@ -136,14 +139,14 @@ external void pathRelativeArcToRotated( double y ); -@Native(symbol: 'skwasm.path_addRect', isLeaf: true) +@Native(symbol: 'path_addRect', isLeaf: true) external void pathAddRect(PathHandle path, RawRect oval); -@Native(symbol: 'skwasm.path_addOval', isLeaf: true) +@Native(symbol: 'path_addOval', isLeaf: true) external void pathAddOval(PathHandle path, RawRect oval); @Native( - symbol: 'skwasm.path_addArc', + symbol: 'path_addArc', isLeaf: true) external void pathAddArc( PathHandle path, @@ -153,7 +156,7 @@ external void pathAddArc( ); @Native( - symbol: 'skwasm.path_addPolygon', + symbol: 'path_addPolygon', isLeaf: true) external void pathAddPolygon( PathHandle path, @@ -162,11 +165,11 @@ external void pathAddPolygon( bool close ); -@Native(symbol: 'skwasm.path_addRRect', isLeaf: true) +@Native(symbol: 'path_addRRect', isLeaf: true) external void pathAddRRect(PathHandle path, RawRRect rrectValues); @Native( - symbol: 'skwasm.path_addPath', + symbol: 'path_addPath', isLeaf: true) external void pathAddPath( PathHandle path, @@ -175,22 +178,22 @@ external void pathAddPath( bool extendPath ); -@Native(symbol: 'skwasm.path_close', isLeaf: true) +@Native(symbol: 'path_close', isLeaf: true) external void pathClose(PathHandle path); -@Native(symbol: 'skwasm.path_reset', isLeaf: true) +@Native(symbol: 'path_reset', isLeaf: true) external void pathReset(PathHandle path); -@Native(symbol: 'skwasm.path_contains', isLeaf: true) +@Native(symbol: 'path_contains', isLeaf: true) external bool pathContains(PathHandle path, double x, double y); -@Native(symbol: 'skwasm.path_transform', isLeaf: true) +@Native(symbol: 'path_transform', isLeaf: true) external void pathTransform(PathHandle path, RawMatrix33 matrix33); -@Native(symbol: 'skwasm.path_getBounds', isLeaf: true) +@Native(symbol: 'path_getBounds', isLeaf: true) external void pathGetBounds(PathHandle path, RawRect outRect); @Native( - symbol: 'skwasm.path_getBounds', + symbol: 'path_combine', isLeaf: true) external PathHandle pathCombine(int operation, PathHandle path1, PathHandle path2); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart index 078adda299738..3e4049522d2cc 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart @@ -1,7 +1,9 @@ +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:ffi'; -import 'raw_canvas.dart'; -import 'raw_geometry.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class RawPictureRecorder extends Opaque {} typedef PictureRecorderHandle = Pointer; @@ -10,32 +12,32 @@ class RawPicture extends Opaque {} typedef PictureHandle = Pointer; @Native( - symbol: 'skwasm.pictureRecorder_create', + symbol: 'pictureRecorder_create', isLeaf: true) external PictureRecorderHandle pictureRecorderCreate(); @Native( - symbol: 'skwasm.pictureRecorder_destroy', + symbol: 'pictureRecorder_destroy', isLeaf: true) external void pictureRecorderDestroy(PictureRecorderHandle picture); @Native( - symbol: 'skwasm.pictureRecorder_beginRecording', + symbol: 'pictureRecorder_beginRecording', isLeaf: true) external CanvasHandle pictureRecorderBeginRecording( PictureRecorderHandle picture, RawRect cullRect); @Native( - symbol: 'skwasm.pictureRecorder_endRecording', + symbol: 'pictureRecorder_endRecording', isLeaf: true) external PictureHandle pictureRecorderEndRecording(PictureRecorderHandle picture); @Native( - symbol: 'skwasm.pictureRecorder_dispose', + symbol: 'pictureRecorder_dispose', isLeaf: true) external void pictureDispose(PictureHandle handle); @Native( - symbol: 'skwasm.pictureRecorder_approximateBytesUsed', + symbol: 'pictureRecorder_approximateBytesUsed', isLeaf: true) external int pictureApproximateBytesUsed(PictureHandle handle); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart index ded6753bd9969..16a0b3165ed9a 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart @@ -1,21 +1,24 @@ +@DefaultAsset('skwasm') +library skwasm_impl; + import 'dart:ffi'; -import 'raw_picture.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class RawSurface extends Opaque {} typedef SurfaceHandle = Pointer; @Native)>( - symbol: 'skwasm.surface_createFromCanvas', + symbol: 'surface_createFromCanvas', isLeaf: true) external SurfaceHandle surfaceCreateFromCanvas(Pointer querySelector); @Native( - symbol: 'skwasm.surface_destroy', + symbol: 'surface_destroy', isLeaf: true) external void surfaceDestroy(SurfaceHandle surface); @Native( - symbol: 'skwasm.surface_setCanvasSize', + symbol: 'surface_setCanvasSize', isLeaf: true) external void surfaceSetCanvasSize( SurfaceHandle surface, @@ -24,6 +27,6 @@ external void surfaceSetCanvasSize( ); @Native( - symbol: 'skwasm.surface_renderPicture', + symbol: 'surface_renderPicture', isLeaf: true) external void surfaceRenderPicture(SurfaceHandle surface, PictureHandle picture); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart index 8d496b6981779..09a04fb564361 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart @@ -1,8 +1,6 @@ import 'dart:ffi'; -import 'picture.dart'; -import 'raw/raw_memory.dart'; -import 'raw/raw_surface.dart'; +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class Surface { factory Surface(String canvasQuerySelector) { From f45f7ff8672224a66e5eb348ae35dd4612b1b45a Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 27 Jan 2023 16:40:20 -0800 Subject: [PATCH 18/34] License headers. --- lib/web_ui/dev/steps/compile_tests_step.dart | 4 ++-- lib/web_ui/dev/test_platform.dart | 2 +- .../src/engine/skwasm/skwasm_impl/canvas.dart | 7 ++++-- .../src/engine/skwasm/skwasm_impl/image.dart | 4 ++++ .../src/engine/skwasm/skwasm_impl/paint.dart | 6 ++++- .../engine/skwasm/skwasm_impl/paragraph.dart | 4 ++++ .../src/engine/skwasm/skwasm_impl/path.dart | 4 ++++ .../engine/skwasm/skwasm_impl/picture.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_canvas.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_geometry.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_memory.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_paint.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_path.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_picture.dart | 4 ++++ .../skwasm/skwasm_impl/raw/raw_surface.dart | 4 ++++ .../engine/skwasm/skwasm_impl/surface.dart | 4 ++++ .../engine/skwasm/skwasm_impl/vertices.dart | 4 ++++ lib/web_ui/skwasm/BUILD.gn | 22 ++++--------------- lib/web_ui/skwasm/canvas.cpp | 4 ++++ lib/web_ui/skwasm/export.h | 4 ++++ lib/web_ui/skwasm/helpers.h | 3 +++ lib/web_ui/skwasm/paint.cpp | 4 ++++ lib/web_ui/skwasm/path.cpp | 4 ++++ lib/web_ui/skwasm/picture.cpp | 4 ++++ lib/web_ui/skwasm/surface.cpp | 4 ++++ lib/web_ui/skwasm/window.cpp | 0 lib/web_ui/skwasm/wrappers.h | 4 ++++ 27 files changed, 100 insertions(+), 24 deletions(-) delete mode 100644 lib/web_ui/skwasm/window.cpp diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart index a69b8900520fd..3bffdfa4a49a3 100644 --- a/lib/web_ui/dev/steps/compile_tests_step.dart +++ b/lib/web_ui/dev/steps/compile_tests_step.dart @@ -384,12 +384,12 @@ Future compileUnitTestToWasm(FilePath input, {required Renderer renderer}) '-DFLUTTER_WEB_USE_SKIA=${renderer == Renderer.canvasKit}', '-DFLUTTER_WEB_USE_SKWASM=${renderer == Renderer.skwasm}', - if (renderer == Renderer.skwasm) + if (renderer == Renderer.skwasm) ...[ '--import-shared-memory', '--shared-memory-max-pages=32768', ], - + input.relativeToWebUi, // current path. targetFileName, // target path. ]; diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index c163dccede240..d249edc81847f 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -451,7 +451,7 @@ class BrowserPlatform extends PlatformPlugin { // Link to the Dart wrapper. final String scriptBase = htmlEscape.convert(p.basename(test)); - final String link = ''; + final String link = ''; final String testRunner = isWasm ? '/test_dart2wasm.js' : 'packages/test/dart.js'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart index f6db3faf2e8eb..beb4fb6a012d3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart @@ -1,9 +1,12 @@ +// 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 'dart:ffi'; import 'dart:typed_data'; -import 'package:ui/ui.dart' as ui; - import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; +import 'package:ui/ui.dart' as ui; class SkwasmCanvas implements ui.Canvas { factory SkwasmCanvas(SkwasmPictureRecorder recorder, ui.Rect cullRect) => diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart index 9c7a10eea1b54..8497043370575 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart @@ -1,3 +1,7 @@ +// 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 'dart:typed_data'; import 'package:ui/ui.dart' as ui; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart index 7d5a2f105acc1..daabca6a03ce8 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart @@ -1,5 +1,9 @@ -import 'package:ui/ui.dart' as ui; +// 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/skwasm/skwasm_impl.dart'; +import 'package:ui/ui.dart' as ui; class SkwasmPaint implements ui.Paint { factory SkwasmPaint() { diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index ec90efb5471b0..7a3d48bd43568 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -1,3 +1,7 @@ +// 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/ui.dart' as ui; // TODO(jacksongardner): implement this diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart index e64588fbe799d..829a4e0058bf4 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart @@ -1,3 +1,7 @@ +// 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 'dart:ffi'; import 'dart:typed_data'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart index 1625f16a8e7b3..1c99606504f9a 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart @@ -1,3 +1,7 @@ +// 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/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart index 9cefeb87908c0..196e283543740 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart @@ -1,3 +1,7 @@ +// 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. + @DefaultAsset('skwasm') library skwasm_impl; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart index ced5b0b79b6d9..fbca81353f807 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart @@ -1,3 +1,7 @@ +// 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 'dart:ffi'; typedef RawRect = Pointer; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart index 1753cead33680..11430f84cd568 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart @@ -1,3 +1,7 @@ +// 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. + @DefaultAsset('skwasm') library skwasm_impl; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart index d532276e11372..b796d460bbcd5 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart @@ -1,3 +1,7 @@ +// 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. + @DefaultAsset('skwasm') library skwasm_impl; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart index 9adb2509be5ff..6062b44d2b670 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart @@ -1,3 +1,7 @@ +// 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. + @DefaultAsset('skwasm') library skwasm_impl; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart index 3e4049522d2cc..c04093994d2c4 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart @@ -1,3 +1,7 @@ +// 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. + @DefaultAsset('skwasm') library skwasm_impl; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart index 16a0b3165ed9a..7bbb02c76151e 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart @@ -1,3 +1,7 @@ +// 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. + @DefaultAsset('skwasm') library skwasm_impl; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart index 09a04fb564361..ca8216096c9e2 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart @@ -1,3 +1,7 @@ +// 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 'dart:ffi'; import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart index 043ef96a437b4..895861c235088 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart @@ -1,3 +1,7 @@ +// 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 'dart:typed_data'; import 'package:ui/ui.dart' as ui; diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index bfac03b2bfd8e..18320b96ed6df 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -1,3 +1,7 @@ +# Copyright 2019 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("//build/toolchain/wasm.gni") wasm_lib("skwasm") { @@ -51,26 +55,8 @@ wasm_lib("skwasm") { ] } - # extra_outputs = [ "$root_out_dir/skwasm.worker.js" ] - deps = [ "//third_party/skia", "//third_party/skia/modules/canvaskit:create_notomono_cpp", ] } - -# copy("copy_skwasm") { -# skwasm_target = ":skwasm(//build/toolchain/wasm)" - -# deps = [ skwasm_target ] - -# skwasm_out_dir = get_label_info(skwasm_target, "root_out_dir") - -# sources = [ -# "$skwasm_out_dir/skwasm.js", -# "$skwasm_out_dir/skwasm.wasm", -# "$skwasm_out_dir/skwasm.worker.js", -# ] - -# outputs = [ "$root_out_dir/skwasm/{{source_file_part}}" ] -# } diff --git a/lib/web_ui/skwasm/canvas.cpp b/lib/web_ui/skwasm/canvas.cpp index c4dae9f81f8b2..8f11ccd09dd41 100644 --- a/lib/web_ui/skwasm/canvas.cpp +++ b/lib/web_ui/skwasm/canvas.cpp @@ -1,3 +1,7 @@ +// 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. + #include #include "export.h" #include "helpers.h" diff --git a/lib/web_ui/skwasm/export.h b/lib/web_ui/skwasm/export.h index 45757c746ef7d..cb0172e0bf621 100644 --- a/lib/web_ui/skwasm/export.h +++ b/lib/web_ui/skwasm/export.h @@ -1,3 +1,7 @@ +// 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. + #pragma once #define SKWASM_EXPORT extern "C" EMSCRIPTEN_KEEPALIVE diff --git a/lib/web_ui/skwasm/helpers.h b/lib/web_ui/skwasm/helpers.h index 7c47922ff1119..89b00beefa2af 100644 --- a/lib/web_ui/skwasm/helpers.h +++ b/lib/web_ui/skwasm/helpers.h @@ -1,3 +1,6 @@ +// 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. #pragma once diff --git a/lib/web_ui/skwasm/paint.cpp b/lib/web_ui/skwasm/paint.cpp index 53a5f3cc6ddf7..17f89ca2e3d54 100644 --- a/lib/web_ui/skwasm/paint.cpp +++ b/lib/web_ui/skwasm/paint.cpp @@ -1,3 +1,7 @@ +// 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. + #include #include "export.h" #include "helpers.h" diff --git a/lib/web_ui/skwasm/path.cpp b/lib/web_ui/skwasm/path.cpp index 8b41ba08166c6..f8fe6e1452e30 100644 --- a/lib/web_ui/skwasm/path.cpp +++ b/lib/web_ui/skwasm/path.cpp @@ -1,3 +1,7 @@ +// 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. + #include #include "export.h" #include "helpers.h" diff --git a/lib/web_ui/skwasm/picture.cpp b/lib/web_ui/skwasm/picture.cpp index b53f8de1d61af..849f3833124c6 100644 --- a/lib/web_ui/skwasm/picture.cpp +++ b/lib/web_ui/skwasm/picture.cpp @@ -1,3 +1,7 @@ +// 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. + #include #include "export.h" #include "helpers.h" diff --git a/lib/web_ui/skwasm/surface.cpp b/lib/web_ui/skwasm/surface.cpp index 06d31e8a64807..f23e757419bc7 100644 --- a/lib/web_ui/skwasm/surface.cpp +++ b/lib/web_ui/skwasm/surface.cpp @@ -1,3 +1,7 @@ +// 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. + #include #include #include diff --git a/lib/web_ui/skwasm/window.cpp b/lib/web_ui/skwasm/window.cpp deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/lib/web_ui/skwasm/wrappers.h b/lib/web_ui/skwasm/wrappers.h index d2b94dd2f2737..2acc209015d36 100644 --- a/lib/web_ui/skwasm/wrappers.h +++ b/lib/web_ui/skwasm/wrappers.h @@ -1,3 +1,7 @@ +// 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. + #pragma once #include From 7a80ffed3b6b5ae9758d40aa917e129b39a4b223 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 27 Jan 2023 21:43:46 -0800 Subject: [PATCH 19/34] Implemented path metrics. --- .../lib/src/engine/skwasm/skwasm_impl.dart | 2 + .../engine/skwasm/skwasm_impl/paragraph.dart | 2 + .../src/engine/skwasm/skwasm_impl/path.dart | 13 ++- .../skwasm/skwasm_impl/path_metrics.dart | 90 +++++++++++++++++++ .../skwasm_impl/raw/raw_path_metrics.dart | 51 +++++++++++ .../engine/skwasm/skwasm_impl/vertices.dart | 2 + lib/web_ui/skwasm/BUILD.gn | 1 + lib/web_ui/skwasm/contour_measure.cpp | 56 ++++++++++++ 8 files changed, 210 insertions(+), 7 deletions(-) create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart create mode 100644 lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart create mode 100644 lib/web_ui/skwasm/contour_measure.cpp diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart index 40f6cc8b9bdc8..d048c10959166 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart @@ -9,12 +9,14 @@ export 'skwasm_impl/image.dart'; export 'skwasm_impl/paint.dart'; export 'skwasm_impl/paragraph.dart'; export 'skwasm_impl/path.dart'; +export 'skwasm_impl/path_metrics.dart'; export 'skwasm_impl/picture.dart'; export 'skwasm_impl/raw/raw_canvas.dart'; export 'skwasm_impl/raw/raw_geometry.dart'; export 'skwasm_impl/raw/raw_memory.dart'; export 'skwasm_impl/raw/raw_paint.dart'; export 'skwasm_impl/raw/raw_path.dart'; +export 'skwasm_impl/raw/raw_path_metrics.dart'; export 'skwasm_impl/raw/raw_picture.dart'; export 'skwasm_impl/raw/raw_surface.dart'; export 'skwasm_impl/renderer.dart'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index 7a3d48bd43568..0ae57a16f2242 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// ignore_for_file: avoid_unused_constructor_parameters + import 'package:ui/ui.dart' as ui; // TODO(jacksongardner): implement this diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart index 829a4e0058bf4..ad24acaa72d74 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart @@ -21,14 +21,14 @@ enum PathArcSize { class SkwasmPath implements ui.Path { factory SkwasmPath() { - return SkwasmPath._fromHandle(pathCreate()); + return SkwasmPath.fromHandle(pathCreate()); } factory SkwasmPath.from(SkwasmPath source) { - return SkwasmPath._fromHandle(pathCopy(source._handle)); + return SkwasmPath.fromHandle(pathCopy(source._handle)); } - SkwasmPath._fromHandle(this._handle); + SkwasmPath.fromHandle(this._handle); final PathHandle _handle; PathHandle get handle => _handle; @@ -232,7 +232,7 @@ class SkwasmPath implements ui.Path { return withStackScope((StackScope s) { final PathHandle newPathHandle = pathCopy(_handle); pathTransform(newPathHandle, s.convertMatrix4toSkMatrix(matrix4)); - return SkwasmPath._fromHandle(newPathHandle); + return SkwasmPath.fromHandle(newPathHandle); }); } @@ -254,12 +254,11 @@ class SkwasmPath implements ui.Path { ui.PathOperation operation, SkwasmPath path1, SkwasmPath path2) => - SkwasmPath._fromHandle(pathCombine( + SkwasmPath.fromHandle(pathCombine( operation.index, path1._handle, path2._handle)); @override ui.PathMetrics computeMetrics({bool forceClosed = false}) { - // TODO(jacksongardner): implement computeMetrics - throw UnimplementedError(); + return SkwasmPathMetrics(path: this, forceClosed: forceClosed); } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart new file mode 100644 index 0000000000000..da753adbc9cda --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart @@ -0,0 +1,90 @@ +// 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 'dart:collection'; +import 'dart:ffi'; + +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; +import 'package:ui/ui.dart' as ui; + +class SkwasmPathMetrics extends IterableBase + implements ui.PathMetrics { + SkwasmPathMetrics({required this.path, required this.forceClosed}); + + SkwasmPath path; + bool forceClosed; + + @override + late Iterator iterator = SkwasmPathMetricIterator(path, forceClosed); +} + +class SkwasmPathMetricIterator implements Iterator { + SkwasmPathMetricIterator(SkwasmPath path, bool forceClosed) + : _handle = contourMeasureIterCreate(path.handle, forceClosed, 1.0); + + final ContourMeasureIterHandle _handle; + SkwasmPathMetric? _current; + int _nextIndex = 0; + + @override + ui.PathMetric get current { + if (_current == null) { + throw RangeError( + 'PathMetricIterator is not pointing to a PathMetric. This can happen in two situations:\n' + '- The iteration has not started yet. If so, call "moveNext" to start iteration.\n' + '- The iterator ran out of elements. If so, check that "moveNext" returns true prior to calling "current".'); + } + return _current!; + } + + @override + bool moveNext() { + final ContourMeasureHandle measureHandle = contourMeasureIterNext(_handle); + if (measureHandle == nullptr) { + _current = null; + return false; + } else { + _current = SkwasmPathMetric(measureHandle, _nextIndex); + _nextIndex++; + return true; + } + } +} + +class SkwasmPathMetric implements ui.PathMetric { + SkwasmPathMetric(this._handle, this.contourIndex); + + final ContourMeasureHandle _handle; + + @override + final int contourIndex; + + @override + ui.Path extractPath(double start, double end, {bool startWithMoveTo = true}) { + return SkwasmPath.fromHandle( + contourMeasureGetSegment(_handle, start, end, startWithMoveTo)); + } + + @override + ui.Tangent? getTangentForOffset(double distance) { + return withStackScope((StackScope scope) { + final Pointer outPosition = scope.allocFloatArray(4); + final Pointer outTangent = + Pointer.fromAddress(outPosition.address + sizeOf() * 2); + final bool result = + contourMeasureGetPosTan(_handle, distance, outPosition, outTangent); + assert(result); + return ui.Tangent( + ui.Offset(outPosition[0], outPosition[1]), + ui.Offset(outTangent[0], outTangent[1]) + ); + }); + } + + @override + bool get isClosed => contourMeasureIsClosed(_handle); + + @override + double get length => contourMeasureLength(_handle); +} diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart new file mode 100644 index 0000000000000..0202b49e39c9e --- /dev/null +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart @@ -0,0 +1,51 @@ +// 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. + +@DefaultAsset('skwasm') +library skwasm_impl; + +import 'dart:ffi'; + +import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; + +class RawContourMeasure extends Opaque {} + +class RawContourMeasureIter extends Opaque {} + +typedef ContourMeasureHandle = Pointer; +typedef ContourMeasureIterHandle = Pointer; + +@Native( + symbol: 'contourMeasureIter_create') +external ContourMeasureIterHandle contourMeasureIterCreate( + PathHandle path, bool forceClosed, double resScale); + +@Native( + symbol: 'contourMeasureIter_next') +external ContourMeasureHandle contourMeasureIterNext( + ContourMeasureIterHandle handle); + +@Native( + symbol: 'contourMeasureIter_dispose') +external void contourMeasureIterDispose(ContourMeasureIterHandle handle); + +@Native(symbol: 'contourMesaure_dispose') +external void contourMeasureDispose(ContourMeasureHandle handle); + +@Native(symbol: 'contourMeasure_length') +external double contourMeasureLength(ContourMeasureHandle handle); + +@Native(symbol: 'contourMeasure_isClosed') +external bool contourMeasureIsClosed(ContourMeasureHandle handle); + +@Native< + Bool Function(ContourMeasureHandle, Float, RawPointArray, + RawPointArray)>(symbol: 'contourMeasure_getPosTan') +external bool contourMeasureGetPosTan(ContourMeasureHandle handle, + double distance, RawPointArray outPosition, RawPointArray outTangent); + +@Native( + symbol: 'contourMeasure_getSegment') +external PathHandle contourMeasureGetSegment(ContourMeasureHandle handle, + double start, double stop, bool startWithMoveTo); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart index 895861c235088..977c68f9705c8 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// ignore_for_file: avoid_unused_constructor_parameters + import 'dart:typed_data'; import 'package:ui/ui.dart' as ui; diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index 18320b96ed6df..a67cae130c21f 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -7,6 +7,7 @@ import("//build/toolchain/wasm.gni") wasm_lib("skwasm") { sources = [ "canvas.cpp", + "contour_measure.cpp", "export.h", "helpers.h", "paint.cpp", diff --git a/lib/web_ui/skwasm/contour_measure.cpp b/lib/web_ui/skwasm/contour_measure.cpp new file mode 100644 index 0000000000000..fcc30ad407967 --- /dev/null +++ b/lib/web_ui/skwasm/contour_measure.cpp @@ -0,0 +1,56 @@ +// 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. + +#include +#include "export.h" +#include "helpers.h" + +#include "third_party/skia/include/core/SkContourMeasure.h" + +using namespace Skwasm; + +SKWASM_EXPORT SkContourMeasureIter* +contourMeasureIter_create(SkPath* path, bool forceClosed, SkScalar resScale) { + return new SkContourMeasureIter(*path, forceClosed, resScale); +} + +SKWASM_EXPORT SkContourMeasure* contourMeasureIter_next( + SkContourMeasureIter* iter) { + auto next = iter->next(); + if (next) { + next->ref(); + } + return next.get(); +} + +SKWASM_EXPORT void contourMeasure_dispose(SkContourMeasure* measure) { + measure->unref(); +} + +SKWASM_EXPORT SkScalar contourMeasure_length(SkContourMeasure* measure) { + return measure->length(); +} + +SKWASM_EXPORT bool contourMeasure_isClosed(SkContourMeasure* measure) { + return measure->isClosed(); +} + +SKWASM_EXPORT bool contourMeasure_getPosTan(SkContourMeasure* measure, + SkScalar distance, + SkPoint* outPosition, + SkVector* outTangent) { + return measure->getPosTan(distance, outPosition, outTangent); +} + +SKWASM_EXPORT SkPath* contourMeasure_getSegment(SkContourMeasure* measure, + SkScalar startD, + SkScalar stopD, + bool startWithMoveTo) { + SkPath* outPath = new SkPath(); + if (!measure->getSegment(startD, stopD, outPath, startWithMoveTo)) { + delete outPath; + return nullptr; + } + return outPath; +} From 38ef597e454473fa918c087f9c645eaf1f005227 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 27 Jan 2023 22:05:16 -0800 Subject: [PATCH 20/34] Only run general UI tests on skwasm if we're in wasm mode. --- lib/web_ui/dev/steps/compile_tests_step.dart | 2 +- lib/web_ui/dev/steps/run_tests_step.dart | 2 +- lib/web_ui/dev/utils.dart | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart index 3bffdfa4a49a3..1090e9e3d05b3 100644 --- a/lib/web_ui/dev/steps/compile_tests_step.dart +++ b/lib/web_ui/dev/steps/compile_tests_step.dart @@ -238,7 +238,7 @@ Future copyCanvasKitFiles({bool useLocalCanvasKit = false}) async { Future compileTests(List testFiles, bool isWasm) async { final Stopwatch stopwatch = Stopwatch()..start(); - final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles); + final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles, isWasm); await Future.wait(>[ if (sortedTests.htmlTests.isNotEmpty) diff --git a/lib/web_ui/dev/steps/run_tests_step.dart b/lib/web_ui/dev/steps/run_tests_step.dart index a30f1fce51ab2..196a5617d2a97 100644 --- a/lib/web_ui/dev/steps/run_tests_step.dart +++ b/lib/web_ui/dev/steps/run_tests_step.dart @@ -70,7 +70,7 @@ class RunTestsStep implements PipelineStep { final SkiaGoldClient? skiaClient = await _createSkiaClient(); final List testFiles = this.testFiles ?? findAllTests(); - final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles); + final TestsByRenderer sortedTests = sortTestsByRenderer(testFiles, isWasm); bool testsPassed = true; diff --git a/lib/web_ui/dev/utils.dart b/lib/web_ui/dev/utils.dart index fe07bf3d3fe92..c198c0008f0ce 100644 --- a/lib/web_ui/dev/utils.dart +++ b/lib/web_ui/dev/utils.dart @@ -408,7 +408,7 @@ class TestsByRenderer { } /// Given a list of test files, organizes them by which renderer should run them. -TestsByRenderer sortTestsByRenderer(List testFiles) { +TestsByRenderer sortTestsByRenderer(List testFiles, bool forWasm) { final List htmlTargets = []; final List canvasKitTargets = []; final List skwasmTargets = []; @@ -426,7 +426,10 @@ TestsByRenderer sortTestsByRenderer(List testFiles) { } else if (path.isWithin(uiTestDirectory, testFile.absolute)) { htmlTargets.add(testFile); canvasKitTargets.add(testFile); - skwasmTargets.add(testFile); + if (forWasm) { + // Only add these tests in wasm mode, since JS mode has a stub renderer. + skwasmTargets.add(testFile); + } } else { htmlTargets.add(testFile); } From 156f9bcd4b238e5da266efd03d2d583b87a79fe6 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 27 Jan 2023 22:24:57 -0800 Subject: [PATCH 21/34] Update license goldens. --- ci/licenses_golden/licenses_flutter | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 19fcdcfa36442..1cc1c859c1ed3 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2033,7 +2033,24 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/services/serialization.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart + ../../../flutter/LICENSE @@ -2074,6 +2091,15 @@ ORIGIN: ../../../flutter/lib/web_ui/lib/text.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/tile_mode.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/ui.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/lib/web_ui/lib/window.dart + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/canvas.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/contour_measure.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/export.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/helpers.h + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/paint.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/path.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/picture.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/surface.cpp + ../../../flutter/LICENSE +ORIGIN: ../../../flutter/lib/web_ui/skwasm/wrappers.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/runtime/dart_isolate.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/runtime/dart_isolate.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/runtime/dart_isolate_group_data.cc + ../../../flutter/LICENSE @@ -4510,7 +4536,24 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/message_codecs.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/services/serialization.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/shadow.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paint.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path_metrics.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_paint.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_path_metrics.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_surface.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart +FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/vertices.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_stub/renderer.dart FILE: ../../../flutter/lib/web_ui/lib/src/engine/svg.dart @@ -4551,6 +4594,15 @@ FILE: ../../../flutter/lib/web_ui/lib/text.dart FILE: ../../../flutter/lib/web_ui/lib/tile_mode.dart FILE: ../../../flutter/lib/web_ui/lib/ui.dart FILE: ../../../flutter/lib/web_ui/lib/window.dart +FILE: ../../../flutter/lib/web_ui/skwasm/canvas.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/contour_measure.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/export.h +FILE: ../../../flutter/lib/web_ui/skwasm/helpers.h +FILE: ../../../flutter/lib/web_ui/skwasm/paint.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/path.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/picture.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/surface.cpp +FILE: ../../../flutter/lib/web_ui/skwasm/wrappers.h FILE: ../../../flutter/runtime/dart_isolate.cc FILE: ../../../flutter/runtime/dart_isolate.h FILE: ../../../flutter/runtime/dart_isolate_group_data.cc From 406fb8b72386249aabb84070d060658fae1d8d9d Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 27 Jan 2023 23:06:07 -0800 Subject: [PATCH 22/34] Converted picture test to a generic ui test. --- lib/web_ui/dev/test_dart2wasm.js | 1 - .../engine/skwasm/skwasm_impl/picture.dart | 21 ++++++++++++------- .../skwasm/skwasm_impl/raw/raw_picture.dart | 4 ++-- .../test/{engine => ui}/picture_test.dart | 4 ++++ 4 files changed, 20 insertions(+), 10 deletions(-) rename lib/web_ui/test/{engine => ui}/picture_test.dart (98%) diff --git a/lib/web_ui/dev/test_dart2wasm.js b/lib/web_ui/dev/test_dart2wasm.js index 3fd63d7d926a9..01b1e07089007 100644 --- a/lib/web_ui/dev/test_dart2wasm.js +++ b/lib/web_ui/dev/test_dart2wasm.js @@ -55,7 +55,6 @@ window.onload = async function () { let moduleInstance; try { const isSkwasm = link.getAttribute('skwasm'); - console.log(`isSkwasm: ${isSkwasm}`) const imports = isSkwasm === null ? {} : new Promise((resolve, reject) => { const skwasmScript = document.createElement('script'); skwasmScript.src = '/skwasm/skwasm.js'; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart index 1c99606504f9a..7d5abdb56dce7 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/picture.dart @@ -17,14 +17,17 @@ class SkwasmPicture implements ui.Picture { } @override - void dispose() => pictureDispose(_handle); + void dispose() { + ui.Picture.onDispose?.call(this); + pictureDispose(_handle); + debugDisposed = true; + } @override int get approximateBytesUsed => pictureApproximateBytesUsed(_handle); @override - // TODO(jacksongardner): implement debugDisposed - bool get debugDisposed => throw UnimplementedError(); + bool debugDisposed = false; @override ui.Image toImageSync(int width, int height) { @@ -45,10 +48,14 @@ class SkwasmPictureRecorder implements ui.PictureRecorder { void delete() => pictureRecorderDestroy(_handle); @override - SkwasmPicture endRecording() => - SkwasmPicture.fromHandle(pictureRecorderEndRecording(_handle)); + SkwasmPicture endRecording() { + isRecording = false; + + final SkwasmPicture picture = SkwasmPicture.fromHandle(pictureRecorderEndRecording(_handle)); + ui.Picture.onCreate?.call(picture); + return picture; + } @override - // TODO(jacksongardner): implement isRecording - bool get isRecording => throw UnimplementedError(); + bool isRecording = true; } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart index c04093994d2c4..ed2c7184c57e6 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_picture.dart @@ -37,11 +37,11 @@ external CanvasHandle pictureRecorderBeginRecording( external PictureHandle pictureRecorderEndRecording(PictureRecorderHandle picture); @Native( - symbol: 'pictureRecorder_dispose', + symbol: 'picture_dispose', isLeaf: true) external void pictureDispose(PictureHandle handle); @Native( - symbol: 'pictureRecorder_approximateBytesUsed', + symbol: 'picture_approximateBytesUsed', isLeaf: true) external int pictureApproximateBytesUsed(PictureHandle handle); diff --git a/lib/web_ui/test/engine/picture_test.dart b/lib/web_ui/test/ui/picture_test.dart similarity index 98% rename from lib/web_ui/test/engine/picture_test.dart rename to lib/web_ui/test/ui/picture_test.dart index d4c5928d38fdb..daa9f9d8075c9 100644 --- a/lib/web_ui/test/engine/picture_test.dart +++ b/lib/web_ui/test/ui/picture_test.dart @@ -6,11 +6,15 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; +import 'utils.dart'; + void main() { internalBootstrapBrowserTest(() => testMain); } Future testMain() async { + setUpUiTest(); + test('Picture construction invokes onCreate once', () async { int onCreateInvokedCount = 0; ui.Picture? createdPicture; From 91de627f81953de7281a8ed4c7b4e00039dc7ca3 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Sun, 29 Jan 2023 13:03:50 -0800 Subject: [PATCH 23/34] Converted canvas_test.dart to a ui test. --- .../src/engine/skwasm/skwasm_impl/canvas.dart | 102 +++++++++++------- .../src/engine/skwasm/skwasm_impl/path.dart | 19 ++-- .../skwasm/skwasm_impl/raw/raw_canvas.dart | 84 ++++++++++----- .../skwasm/skwasm_impl/raw/raw_geometry.dart | 1 + .../skwasm/skwasm_impl/raw/raw_memory.dart | 50 ++++++++- .../engine/skwasm/skwasm_impl/surface.dart | 2 +- lib/web_ui/skwasm/canvas.cpp | 19 ++++ lib/web_ui/test/canvaskit/canvas_test.dart | 28 ----- .../test/{engine => ui}/canvas_test.dart | 8 +- 9 files changed, 205 insertions(+), 108 deletions(-) delete mode 100644 lib/web_ui/test/canvaskit/canvas_test.dart rename lib/web_ui/test/{engine => ui}/canvas_test.dart (98%) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart index beb4fb6a012d3..b51ee5e43d6f2 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart @@ -5,14 +5,15 @@ import 'dart:ffi'; import 'dart:typed_data'; +import 'package:ui/src/engine.dart'; import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; class SkwasmCanvas implements ui.Canvas { factory SkwasmCanvas(SkwasmPictureRecorder recorder, ui.Rect cullRect) => - SkwasmCanvas.fromHandle(withStackScope((StackScope s) => - pictureRecorderBeginRecording(recorder.handle, s.convertRect(cullRect)) - )); + SkwasmCanvas.fromHandle(withStackScope((StackScope s) => + pictureRecorderBeginRecording( + recorder.handle, s.convertRectToNative(cullRect)))); SkwasmCanvas.fromHandle(this._handle); CanvasHandle _handle; @@ -32,7 +33,7 @@ class SkwasmCanvas implements ui.Canvas { final SkwasmPaint paint = uiPaint as SkwasmPaint; if (bounds != null) { withStackScope((StackScope s) { - canvasSaveLayer(_handle, s.convertRect(bounds), paint.handle); + canvasSaveLayer(_handle, s.convertRectToNative(bounds), paint.handle); }); } else { canvasSaveLayer(_handle, nullptr, paint.handle); @@ -44,6 +45,11 @@ class SkwasmCanvas implements ui.Canvas { canvasRestore(_handle); } + @override + void restoreToCount(int count) { + canvasRestoreToCount(_handle, count); + } + @override int getSaveCount() => canvasGetSaveCount(_handle); @@ -62,7 +68,7 @@ class SkwasmCanvas implements ui.Canvas { @override void transform(Float64List matrix4) { withStackScope((StackScope s) { - canvasTransform(_handle, s.convertMatrix4toSkM44(matrix4)); + canvasTransform(_handle, s.convertMatrix44toNative(matrix4)); }); } @@ -70,14 +76,14 @@ class SkwasmCanvas implements ui.Canvas { void clipRect(ui.Rect rect, {ui.ClipOp clipOp = ui.ClipOp.intersect, bool doAntiAlias = true}) { withStackScope((StackScope s) { - canvasClipRect(_handle, s.convertRect(rect), clipOp.index, doAntiAlias); + canvasClipRect(_handle, s.convertRectToNative(rect), clipOp.index, doAntiAlias); }); } @override void clipRRect(ui.RRect rrect, {bool doAntiAlias = true}) { withStackScope((StackScope s) { - canvasClipRRect(_handle, s.convertRRect(rrect), doAntiAlias); + canvasClipRRect(_handle, s.convertRRectToNative(rrect), doAntiAlias); }); } @@ -90,7 +96,7 @@ class SkwasmCanvas implements ui.Canvas { @override void drawColor(ui.Color color, ui.BlendMode blendMode) => - canvasDrawColor(_handle, color.value, blendMode.index); + canvasDrawColor(_handle, color.value, blendMode.index); @override void drawLine(ui.Offset p1, ui.Offset p2, ui.Paint uiPaint) { @@ -108,7 +114,11 @@ class SkwasmCanvas implements ui.Canvas { void drawRect(ui.Rect rect, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvasDrawRect(_handle, s.convertRect(rect), paint.handle); + canvasDrawRect( + _handle, + s.convertRectToNative(rect), + paint.handle + ); }); } @@ -116,7 +126,11 @@ class SkwasmCanvas implements ui.Canvas { void drawRRect(ui.RRect rrect, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvasDrawRRect(_handle, s.convertRRect(rrect), paint.handle); + canvasDrawRRect( + _handle, + s.convertRRectToNative(rrect), + paint.handle + ); }); } @@ -125,7 +139,11 @@ class SkwasmCanvas implements ui.Canvas { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvasDrawDRRect( - _handle, s.convertRRect(outer), s.convertRRect(inner), paint.handle); + _handle, + s.convertRRectToNative(outer), + s.convertRRectToNative(inner), + paint.handle + ); }); } @@ -133,7 +151,7 @@ class SkwasmCanvas implements ui.Canvas { void drawOval(ui.Rect rect, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { - canvasDrawOval(_handle, s.convertRect(rect), paint.handle); + canvasDrawOval(_handle, s.convertRectToNative(rect), paint.handle); }); } @@ -144,17 +162,18 @@ class SkwasmCanvas implements ui.Canvas { } @override - void drawArc(ui.Rect rect, double startAngle, double sweepAngle, bool useCenter, - ui.Paint uiPaint) { + void drawArc(ui.Rect rect, double startAngle, double sweepAngle, + bool useCenter, ui.Paint uiPaint) { final SkwasmPaint paint = uiPaint as SkwasmPaint; withStackScope((StackScope s) { canvasDrawArc( - _handle, - s.convertRect(rect), - ui.toDegrees(startAngle), - ui.toDegrees(sweepAngle), - useCenter, - paint.handle); + _handle, + s.convertRectToNative(rect), + ui.toDegrees(startAngle), + ui.toDegrees(sweepAngle), + useCenter, + paint.handle + ); }); } @@ -171,12 +190,14 @@ class SkwasmCanvas implements ui.Canvas { } @override - void drawImageRect(ui.Image uiImage, ui.Rect src, ui.Rect dst, ui.Paint uiPaint) { + void drawImageRect( + ui.Image uiImage, ui.Rect src, ui.Rect dst, ui.Paint uiPaint) { throw UnimplementedError(); } @override - void drawImageNine(ui.Image uiImage, ui.Rect center, ui.Rect dst, ui.Paint uiPaint) { + void drawImageNine( + ui.Image uiImage, ui.Rect center, ui.Rect dst, ui.Paint uiPaint) { throw UnimplementedError(); } @@ -191,17 +212,20 @@ class SkwasmCanvas implements ui.Canvas { } @override - void drawPoints(ui.PointMode pointMode, List points, ui.Paint paint) { + void drawPoints( + ui.PointMode pointMode, List points, ui.Paint paint) { throw UnimplementedError(); } @override - void drawRawPoints(ui.PointMode pointMode, Float32List points, ui.Paint paint) { + void drawRawPoints( + ui.PointMode pointMode, Float32List points, ui.Paint paint) { throw UnimplementedError(); } @override - void drawVertices(ui.Vertices vertices, ui.BlendMode blendMode, ui.Paint paint) { + void drawVertices( + ui.Vertices vertices, ui.BlendMode blendMode, ui.Paint paint) { throw UnimplementedError(); } @@ -243,24 +267,30 @@ class SkwasmCanvas implements ui.Canvas { @override ui.Rect getDestinationClipBounds() { - // TODO(jacksongardner): implement getDestinationClipBounds - throw UnimplementedError(); + return withStackScope((StackScope scope) { + final Pointer outRect = scope.allocInt32Array(4); + canvasGetDeviceClipBounds(_handle, outRect); + return scope.convertIRectFromNative(outRect); + }); } @override ui.Rect getLocalClipBounds() { - // TODO(jacksongardner): implement getLocalClipBounds - throw UnimplementedError(); + final Float64List transform = getTransform(); + final Matrix4 matrix = Matrix4.fromFloat32List(Float32List.fromList(transform)); + if (matrix.invert() == 0) { + // non-invertible transforms collapse space to a line or point + return ui.Rect.zero; + } + return transformRect(matrix, getDestinationClipBounds()); } @override Float64List getTransform() { - // TODO(jacksongardner): implement getTransform - throw UnimplementedError(); - } - - @override - void restoreToCount(int count) { - // TODO(jacksongardner): implement restoreToCount + return withStackScope((StackScope scope) { + final Pointer outMatrix = scope.allocFloatArray(16); + canvasGetTransform(_handle, outMatrix); + return scope.convertMatrix44FromNative(outMatrix); + }); } } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart index ad24acaa72d74..78a2e9f0044f6 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/path.dart @@ -97,7 +97,7 @@ class SkwasmPath implements ui.Path { withStackScope((StackScope s) { pathArcToOval( _handle, - s.convertRect(rect), + s.convertRectToNative(rect), ui.toDegrees(startAngle), ui.toDegrees(sweepAngle), forceMoveTo @@ -156,14 +156,14 @@ class SkwasmPath implements ui.Path { @override void addRect(ui.Rect rect) { withStackScope((StackScope s) { - pathAddRect(_handle, s.convertRect(rect)); + pathAddRect(_handle, s.convertRectToNative(rect)); }); } @override void addOval(ui.Rect rect) { withStackScope((StackScope s) { - pathAddOval(_handle, s.convertRect(rect)); + pathAddOval(_handle, s.convertRectToNative(rect)); }); } @@ -172,7 +172,7 @@ class SkwasmPath implements ui.Path { withStackScope((StackScope s) { pathAddArc( _handle, - s.convertRect(rect), + s.convertRectToNative(rect), ui.toDegrees(startAngle), ui.toDegrees(sweepAngle) ); @@ -182,14 +182,14 @@ class SkwasmPath implements ui.Path { @override void addPolygon(List points, bool close) { withStackScope((StackScope s) { - pathAddPolygon(_handle, s.convertPointArray(points), points.length, close); + pathAddPolygon(_handle, s.convertPointArrayToNative(points), points.length, close); }); } @override void addRRect(ui.RRect rrect) { withStackScope((StackScope s) { - pathAddRRect(_handle, s.convertRRect(rrect)); + pathAddRRect(_handle, s.convertRRectToNative(rrect)); }); } @@ -241,12 +241,7 @@ class SkwasmPath implements ui.Path { return withStackScope((StackScope s) { final Pointer rectBuffer = s.allocFloatArray(4); pathGetBounds(_handle, rectBuffer); - return ui.Rect.fromLTRB( - rectBuffer[0], - rectBuffer[1], - rectBuffer[2], - rectBuffer[3] - ); + return s.convertRectFromNative(rectBuffer); }); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart index 196e283543740..97f1c89fd42c5 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_canvas.dart @@ -10,6 +10,7 @@ import 'dart:ffi'; import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class CanvasWrapper extends Opaque {} + typedef CanvasHandle = Pointer; @Native(symbol: 'canvas_destroy', isLeaf: true) @@ -18,75 +19,96 @@ external void canvasDestroy(CanvasHandle canvas); @Native(symbol: 'canvas_save', isLeaf: true) external void canvasSave(CanvasHandle canvas); -@Native(symbol: 'canvas_saveLayer', isLeaf: true) +@Native( + symbol: 'canvas_saveLayer', isLeaf: true) external void canvasSaveLayer( CanvasHandle canvas, RawRect rect, PaintHandle paint); @Native(symbol: 'canvas_restore', isLeaf: true) external void canvasRestore(CanvasHandle canvas); +@Native( + symbol: 'canvas_restoreToCount', isLeaf: true) +external void canvasRestoreToCount(CanvasHandle canvas, int count); + @Native(symbol: 'canvas_getSaveCount', isLeaf: true) external int canvasGetSaveCount(CanvasHandle canvas); -@Native(symbol: 'canvas_translate', isLeaf: true) +@Native( + symbol: 'canvas_translate', isLeaf: true) external void canvasTranslate(CanvasHandle canvas, double dx, double dy); -@Native(symbol: 'canvas_scale', isLeaf: true) +@Native( + symbol: 'canvas_scale', isLeaf: true) external void canvasScale(CanvasHandle canvas, double sx, double sy); -@Native(symbol: 'canvas_rotate', isLeaf: true) +@Native( + symbol: 'canvas_rotate', isLeaf: true) external void canvasRotate(CanvasHandle canvas, double degrees); -@Native(symbol: 'canvas_skew', isLeaf: true) +@Native( + symbol: 'canvas_skew', isLeaf: true) external void canvasSkew(CanvasHandle canvas, double sx, double sy); -@Native(symbol: 'canvas_transform', isLeaf: true) +@Native( + symbol: 'canvas_transform', isLeaf: true) external void canvasTransform(CanvasHandle canvas, RawMatrix44 matrix); -@Native(symbol: 'canvas_clipRect', isLeaf: true) +@Native( + symbol: 'canvas_clipRect', isLeaf: true) external void canvasClipRect( CanvasHandle canvas, RawRect rect, int op, bool antialias); -@Native(symbol: 'canvas_clipRRect', isLeaf: true) +@Native( + symbol: 'canvas_clipRRect', isLeaf: true) external void canvasClipRRect( CanvasHandle canvas, RawRRect rrect, bool antialias); -@Native(symbol: 'canvas_clipPath', isLeaf: true) +@Native( + symbol: 'canvas_clipPath', isLeaf: true) external void canvasClipPath( CanvasHandle canvas, PathHandle path, bool antialias); -@Native(symbol: 'canvas_drawColor', isLeaf: true) -external void canvasDrawColor( - CanvasHandle canvas, int color, int blendMode); +@Native( + symbol: 'canvas_drawColor', isLeaf: true) +external void canvasDrawColor(CanvasHandle canvas, int color, int blendMode); -@Native(symbol: 'canvas_drawLine', isLeaf: true) +@Native( + symbol: 'canvas_drawLine', isLeaf: true) external void canvasDrawLine(CanvasHandle canvas, double x1, double y1, double x2, double y2, PaintHandle paint); -@Native(symbol: 'canvas_drawPaint', isLeaf: true) +@Native( + symbol: 'canvas_drawPaint', isLeaf: true) external void canvasDrawPaint(CanvasHandle canvas, PaintHandle paint); -@Native(symbol: 'canvas_drawRect', isLeaf: true) +@Native( + symbol: 'canvas_drawRect', isLeaf: true) external void canvasDrawRect( CanvasHandle canvas, RawRect rect, PaintHandle paint); -@Native(symbol: 'canvas_drawRRect', isLeaf: true) +@Native( + symbol: 'canvas_drawRRect', isLeaf: true) external void canvasDrawRRect( CanvasHandle canvas, RawRRect rrect, PaintHandle paint); -@Native(symbol: 'canvas_drawDRRect', isLeaf: true) +@Native( + symbol: 'canvas_drawDRRect', isLeaf: true) external void canvasDrawDRRect( CanvasHandle canvas, RawRRect outer, RawRRect inner, PaintHandle paint); -@Native(symbol: 'canvas_drawOval', isLeaf: true) +@Native( + symbol: 'canvas_drawOval', isLeaf: true) external void canvasDrawOval( CanvasHandle canvas, RawRect oval, PaintHandle paint); -@Native(symbol: 'canvas_drawCircle', isLeaf: true) -external void canvasDrawCircle(CanvasHandle canvas, double x, double y, - double radius, PaintHandle paint); +@Native( + symbol: 'canvas_drawCircle', isLeaf: true) +external void canvasDrawCircle( + CanvasHandle canvas, double x, double y, double radius, PaintHandle paint); -@Native(symbol: 'canvas_drawCircle', isLeaf: true) +@Native( + symbol: 'canvas_drawCircle', isLeaf: true) external void canvasDrawArc( CanvasHandle canvas, RawRect rect, @@ -95,9 +117,23 @@ external void canvasDrawArc( bool useCenter, PaintHandle paint); -@Native(symbol: 'canvas_drawPath', isLeaf: true) +@Native( + symbol: 'canvas_drawPath', isLeaf: true) external void canvasDrawPath( CanvasHandle canvas, PathHandle path, PaintHandle paint); -@Native(symbol: 'canvas_drawPicture', isLeaf: true) +@Native( + symbol: 'canvas_drawPicture', isLeaf: true) external void canvasDrawPicture(CanvasHandle canvas, PictureHandle picture); + +@Native( + symbol: 'canvas_getTransform', isLeaf: true) +external void canvasGetTransform(CanvasHandle canvas, RawMatrix44 outMatrix); + +@Native( + symbol: 'canvas_getLocalClipBounds', isLeaf: true) +external void canvasGetLocalClipBounds(CanvasHandle canvas, RawRect outRect); + +@Native( + symbol: 'canvas_getDeviceClipBounds', isLeaf: true) +external void canvasGetDeviceClipBounds(CanvasHandle canvas, RawIRect outRect); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart index fbca81353f807..74fc835bb920b 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_geometry.dart @@ -5,6 +5,7 @@ import 'dart:ffi'; typedef RawRect = Pointer; +typedef RawIRect = Pointer; typedef RawRRect = Pointer; typedef RawPointArray = Pointer; typedef RawMatrix33 = Pointer; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart index 11430f84cd568..22ac87f07d7f3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/raw/raw_memory.dart @@ -25,7 +25,7 @@ external StackPointer stackSave(); external void stackRestore(StackPointer pointer); class StackScope { - Pointer convertString(String string) { + Pointer convertStringToNative(String string) { final Utf8Encoder utf8Encoder = utf8.encoder; final Uint8List encoded = utf8Encoder.convert(string); final Pointer pointer = allocInt8Array(encoded.length + 1); @@ -59,7 +59,7 @@ class StackScope { return pointer; } - Pointer convertMatrix4toSkM44(Float64List matrix4) { + Pointer convertMatrix44toNative(Float64List matrix4) { assert(matrix4.length == 16); final Pointer pointer = allocFloatArray(16); for (int i = 0; i < 16; i++) { @@ -68,7 +68,15 @@ class StackScope { return pointer; } - Pointer convertRect(ui.Rect rect) { + Float64List convertMatrix44FromNative(Pointer buffer) { + final Float64List matrix = Float64List(16); + for (int i = 0; i < 16; i++) { + matrix[i] = buffer[i]; + } + return matrix; + } + + Pointer convertRectToNative(ui.Rect rect) { final Pointer pointer = allocFloatArray(4); pointer[0] = rect.left; pointer[1] = rect.top; @@ -77,7 +85,34 @@ class StackScope { return pointer; } - Pointer convertRRect(ui.RRect rect) { + ui.Rect convertRectFromNative(Pointer buffer) { + return ui.Rect.fromLTRB( + buffer[0], + buffer[1], + buffer[2], + buffer[3], + ); + } + + Pointer convertIRectToNative(ui.Rect rect) { + final Pointer pointer = allocInt32Array(4); + pointer[0] = rect.left.floor(); + pointer[1] = rect.top.floor(); + pointer[2] = rect.right.ceil(); + pointer[3] = rect.bottom.ceil(); + return pointer; + } + + ui.Rect convertIRectFromNative(Pointer buffer) { + return ui.Rect.fromLTRB( + buffer[0].toDouble(), + buffer[1].toDouble(), + buffer[2].toDouble(), + buffer[3].toDouble(), + ); + } + + Pointer convertRRectToNative(ui.RRect rect) { final Pointer pointer = allocFloatArray(12); pointer[0] = rect.left; pointer[1] = rect.top; @@ -97,7 +132,7 @@ class StackScope { return pointer; } - Pointer convertPointArray(List points) { + Pointer convertPointArrayToNative(List points) { final Pointer pointer = allocFloatArray(points.length * 2); for (int i = 0; i < points.length; i++) { pointer[i * 2] = points[i].dx; @@ -111,6 +146,11 @@ class StackScope { return stackAlloc(length).cast(); } + Pointer allocInt32Array(int count) { + final int length = count * sizeOf(); + return stackAlloc(length).cast(); + } + Pointer allocFloatArray(int count) { final int length = count * sizeOf(); return stackAlloc(length).cast(); diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart index ca8216096c9e2..961924777740d 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/surface.dart @@ -9,7 +9,7 @@ import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; class Surface { factory Surface(String canvasQuerySelector) { final SurfaceHandle surfaceHandle = withStackScope((StackScope scope) { - final Pointer pointer = scope.convertString(canvasQuerySelector); + final Pointer pointer = scope.convertStringToNative(canvasQuerySelector); return surfaceCreateFromCanvas(pointer); }); return Surface._fromHandle(surfaceHandle); diff --git a/lib/web_ui/skwasm/canvas.cpp b/lib/web_ui/skwasm/canvas.cpp index 8f11ccd09dd41..750897d1060f7 100644 --- a/lib/web_ui/skwasm/canvas.cpp +++ b/lib/web_ui/skwasm/canvas.cpp @@ -27,6 +27,10 @@ SKWASM_EXPORT void canvas_restore(CanvasWrapper* wrapper) { wrapper->canvas->restore(); } +SKWASM_EXPORT void canvas_restoreToCount(CanvasWrapper* wrapper, int count) { + wrapper->canvas->restoreToCount(count); +} + SKWASM_EXPORT int canvas_getSaveCount(CanvasWrapper* wrapper) { return wrapper->canvas->getSaveCount(); } @@ -164,3 +168,18 @@ SKWASM_EXPORT void canvas_drawPicture(CanvasWrapper* wrapper, wrapper->canvas->drawPicture(picture); } + +SKWASM_EXPORT void canvas_getTransform(CanvasWrapper* wrapper, + SkM44* outTransform) { + *outTransform = wrapper->canvas->getLocalToDevice(); +} + +SKWASM_EXPORT void canvas_getLocalClipBounds(CanvasWrapper* wrapper, + SkRect* outRect) { + *outRect = wrapper->canvas->getLocalClipBounds(); +} + +SKWASM_EXPORT void canvas_getDeviceClipBounds(CanvasWrapper* wrapper, + SkIRect* outRect) { + *outRect = wrapper->canvas->getDeviceClipBounds(); +} diff --git a/lib/web_ui/test/canvaskit/canvas_test.dart b/lib/web_ui/test/canvaskit/canvas_test.dart deleted file mode 100644 index cacb5ed4c6c3f..0000000000000 --- a/lib/web_ui/test/canvaskit/canvas_test.dart +++ /dev/null @@ -1,28 +0,0 @@ -// 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. - -@TestOn('chrome || safari || firefox') - -import 'dart:async'; - -import 'package:test/bootstrap/browser.dart'; -import 'package:test/test.dart'; - -import '../engine/canvas_test.dart'; -import 'common.dart'; - -void main() { - internalBootstrapBrowserTest(() => testMain); -} - -// Run the same semantics tests in CanvasKit mode because as of today we do not -// yet share platform view logic with the HTML renderer, which affects -// semantics. -Future testMain() async { - group('CanvasKit semantics', () { - setUpCanvasKitTest(); - - runCanvasTests(deviceClipRoundsOut: true); - }); -} diff --git a/lib/web_ui/test/engine/canvas_test.dart b/lib/web_ui/test/ui/canvas_test.dart similarity index 98% rename from lib/web_ui/test/engine/canvas_test.dart rename to lib/web_ui/test/ui/canvas_test.dart index 053cd9c155b6b..2ab393aa4da0d 100644 --- a/lib/web_ui/test/engine/canvas_test.dart +++ b/lib/web_ui/test/ui/canvas_test.dart @@ -11,13 +11,17 @@ import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'utils.dart'; + void main() { internalBootstrapBrowserTest(() => testMain); } Future testMain() async { - await ui.webOnlyInitializePlatform(); - runCanvasTests(deviceClipRoundsOut: false); + setUpUiTest(); + + final bool deviceClipRoundsOut = renderer is! HtmlRenderer; + runCanvasTests(deviceClipRoundsOut: deviceClipRoundsOut); } void runCanvasTests({required bool deviceClipRoundsOut}) { From d787922a17ee2fb04f81f10bba58a44d647bbf66 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Sun, 29 Jan 2023 13:12:26 -0800 Subject: [PATCH 24/34] Port path_metrics_test.dart to ui. --- lib/web_ui/test/{engine => ui}/path_metrics_test.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename lib/web_ui/test/{engine => ui}/path_metrics_test.dart (99%) diff --git a/lib/web_ui/test/engine/path_metrics_test.dart b/lib/web_ui/test/ui/path_metrics_test.dart similarity index 99% rename from lib/web_ui/test/engine/path_metrics_test.dart rename to lib/web_ui/test/ui/path_metrics_test.dart index d237d696fb9db..006c59df2450e 100644 --- a/lib/web_ui/test/engine/path_metrics_test.dart +++ b/lib/web_ui/test/ui/path_metrics_test.dart @@ -9,14 +9,16 @@ import 'package:test/test.dart'; import 'package:ui/ui.dart'; import '../matchers.dart'; +import 'utils.dart'; -const double kTolerance = 0.001; +const double kTolerance = 0.1; void main() { internalBootstrapBrowserTest(() => testMain); } void testMain() { + setUpUiTest(); group('PathMetric length', () { test('empty path', () { final Path path = Path(); From 4eaa927f395627af576681c48e7ecc5d2fb0e10e Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Sun, 29 Jan 2023 22:45:49 -0800 Subject: [PATCH 25/34] Coop/Coep headers. --- lib/web_ui/dev/test_platform.dart | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index d249edc81847f..b3040d7cc9f4e 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -40,6 +40,11 @@ import 'browser.dart'; import 'environment.dart' as env; import 'utils.dart'; +const Map coopCoepHeaders = { + 'Cross-Origin-Opener-Policy': 'same-origin', + 'Cross-Origin-Embedder-Policy': 'require-corp', +}; + /// Custom test platform that serves web engine unit tests. class BrowserPlatform extends PlatformPlugin { BrowserPlatform._({ @@ -92,15 +97,7 @@ class BrowserPlatform extends PlatformPlugin { .add(_screenshotHandler) .add(_fileNotFoundCatcher); - final shelf.Handler rootHandler = const shelf.Pipeline() - .addMiddleware(shelf.createMiddleware( - responseHandler: (shelf.Response response) => response.change(headers: { - 'Cross-Origin-Opener-Policy': 'same-origin', - 'Cross-Origin-Embedder-Policy': 'require-corp', - }) - )) - .addHandler(cascade.handler); - server.mount(rootHandler); + server.mount(cascade.handler); } /// Starts the server. @@ -434,10 +431,16 @@ class BrowserPlatform extends PlatformPlugin { return shelf.Response.internalServerError(body: error); } + final bool needsCoopCoep = + extension == '.js' || + extension == '.mjs' || + extension == '.html'; return shelf.Response.ok( fileInBuild.readAsBytesSync(), headers: { HttpHeaders.contentTypeHeader: contentType, + if (needsCoopCoep) + ...coopCoepHeaders, }, ); } @@ -472,6 +475,7 @@ class BrowserPlatform extends PlatformPlugin { ''', headers: { 'Content-Type': 'text/html', + ...coopCoepHeaders }); } From 704d299e27eb0180d7391b3d3ab5b65ae6a1f4be Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 1 Feb 2023 13:34:19 -0800 Subject: [PATCH 26/34] Make `felt build` take ninja targets as arguments. --- common/config.gni | 3 - lib/web_ui/dev/build.dart | 58 +++++++---------- third_party/canvaskit/BUILD.gn | 45 ++++++------- third_party/canvaskit/canvaskit.gni | 9 --- tools/gn | 44 +------------ wasm/BUILD.gn | 4 +- web_sdk/BUILD.gn | 98 +++++++++++------------------ 7 files changed, 78 insertions(+), 183 deletions(-) delete mode 100644 third_party/canvaskit/canvaskit.gni diff --git a/common/config.gni b/common/config.gni index afb8f0b2b2c92..030a7bb3211a8 100644 --- a/common/config.gni +++ b/common/config.gni @@ -22,9 +22,6 @@ declare_args() { # Whether to use a prebuilt Dart SDK instead of building one. flutter_prebuilt_dart_sdk = false - - # Whether to build the flutter web sdk outline/DDC artifacts. - flutter_build_web_sdk = false } # feature_defines_list --------------------------------------------------------- diff --git a/lib/web_ui/dev/build.dart b/lib/web_ui/dev/build.dart index a8e4fc37ffca4..bf803b7f239f5 100644 --- a/lib/web_ui/dev/build.dart +++ b/lib/web_ui/dev/build.dart @@ -13,6 +13,14 @@ import 'environment.dart'; import 'pipeline.dart'; import 'utils.dart'; +const Map targetAliases = { + 'sdk': 'flutter/web_sdk', + 'web_sdk': 'flutter/web_sdk', + 'canvaskit': 'flutter/third_party/canvaskit:canvaskit_group', + 'canvaskit_chromium': 'flutter/third_party/canvaskit:canvaskit_chromium_group', + 'skwasm': 'flutter/lib/web_ui/skwasm', +}; + class BuildCommand extends Command with ArgUtils { BuildCommand() { argParser.addFlag( @@ -21,20 +29,6 @@ class BuildCommand extends Command with ArgUtils { help: 'Run the build in watch mode so it rebuilds whenever a change is ' 'made. Disabled by default.', ); - argParser.addFlag( - 'build-canvaskit', - help: 'Build CanvasKit locally instead of getting it from CIPD. Enabled ' - 'by default.', - defaultsTo: true - ); - argParser.addFlag( - 'build-canvaskit-chromium', - help: 'Build the Chromium variant of CanvasKit. Disabled by default.', - ); - argParser.addFlag( - 'build-skwasm', - help: 'Build skwasm library', - ); argParser.addFlag( 'host', help: 'Build the host build instead of the wasm build, which is ' @@ -50,23 +44,19 @@ class BuildCommand extends Command with ArgUtils { bool get isWatchMode => boolArg('watch'); - bool get buildCanvasKit => boolArg('build-canvaskit'); - bool get buildCanvasKitChromium => boolArg('build-canvaskit-chromium'); - bool get buildSkwasm => boolArg('build-skwasm'); - bool get host => boolArg('host'); + List get targets => argResults?.rest ?? []; + @override FutureOr run() async { final FilePath libPath = FilePath.fromWebUi('lib'); final List steps = [ - GnPipelineStep( - buildCanvasKit: buildCanvasKit, - buildCanvasKitChromium: buildCanvasKitChromium, - buildSkwasm: buildSkwasm, - host: host, + GnPipelineStep(host: host), + NinjaPipelineStep( + buildDirectory: host ? environment.hostDebugUnoptDir : environment.wasmReleaseOutDir, + targets: targets.map((String target) => targetAliases[target] ?? target), ), - NinjaPipelineStep(target: host ? environment.hostDebugUnoptDir : environment.wasmReleaseOutDir), ]; final Pipeline buildPipeline = Pipeline(steps: steps); await buildPipeline.run(); @@ -91,15 +81,9 @@ class BuildCommand extends Command with ArgUtils { /// state. GN is pretty quick though, so it's OK to not support interruption. class GnPipelineStep extends ProcessStep { GnPipelineStep({ - required this.buildCanvasKit, - required this.buildCanvasKitChromium, - required this.buildSkwasm, required this.host, }); - final bool buildCanvasKit; - final bool buildCanvasKitChromium; - final bool buildSkwasm; final bool host; @override @@ -118,9 +102,6 @@ class GnPipelineStep extends ProcessStep { return [ '--web', '--runtime-mode=release', - if (buildCanvasKit) '--build-canvaskit', - if (buildCanvasKitChromium) '--build-canvaskit-chromium', - if (buildSkwasm) '--build-skwasm', ]; } } @@ -139,7 +120,7 @@ class GnPipelineStep extends ProcessStep { /// /// Can be safely interrupted. class NinjaPipelineStep extends ProcessStep { - NinjaPipelineStep({required this.target}); + NinjaPipelineStep({required this.buildDirectory, required this.targets}); @override String get description => 'ninja'; @@ -147,8 +128,10 @@ class NinjaPipelineStep extends ProcessStep { @override bool get isSafeToInterrupt => true; - /// The target directory to build. - final Directory target; + /// The directory to build. + final Directory buildDirectory; + + final Iterable targets; @override Future createProcess() { @@ -157,7 +140,8 @@ class NinjaPipelineStep extends ProcessStep { 'autoninja', [ '-C', - target.path, + buildDirectory.path, + ...targets, ], ); } diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn index 429af65e42c24..f083f3b8fe997 100644 --- a/third_party/canvaskit/BUILD.gn +++ b/third_party/canvaskit/BUILD.gn @@ -3,36 +3,31 @@ # found in the LICENSE file. import("//build/toolchain/wasm.gni") -import("canvaskit.gni") -if (build_canvaskit) { - # This toolchain is only to be used by canvaskit_group below. - wasm_toolchain("canvaskit") { - extra_toolchain_args = { - skia_use_icu = true - skia_use_client_icu = false - } +# This toolchain is only to be used by the canvaskit target below. +wasm_toolchain("canvaskit") { + extra_toolchain_args = { + skia_use_icu = true + skia_use_client_icu = false } +} - group("canvaskit_group") { - visibility = [ "//flutter/web_sdk:*" ] - public_deps = [ "//third_party/skia/modules/canvaskit(:canvaskit)" ] - } +group("canvaskit_group") { + visibility = [ "//flutter/web_sdk:*" ] + public_deps = [ "//third_party/skia/modules/canvaskit(:canvaskit)" ] } -if (build_canvaskit_chromium) { - # This toolchain is only to be used by canvaskit_chromium_group below. - wasm_toolchain("canvaskit_chromium") { - extra_toolchain_args = { - skia_use_icu = false - skia_use_client_icu = true - skia_icu_bidi_third_party_dir = "//flutter/third_party/canvaskit/icu_bidi" - } +# This toolchain is only to be used by canvaskit_chromium_group below. +wasm_toolchain("canvaskit_chromium") { + extra_toolchain_args = { + skia_use_icu = false + skia_use_client_icu = true + skia_icu_bidi_third_party_dir = "//flutter/third_party/canvaskit/icu_bidi" } +} - group("canvaskit_chromium_group") { - visibility = [ "//flutter/web_sdk:*" ] - public_deps = - [ "//third_party/skia/modules/canvaskit(:canvaskit_chromium)" ] - } +group("canvaskit_chromium_group") { + visibility = [ "//flutter/web_sdk:*" ] + public_deps = + [ "//third_party/skia/modules/canvaskit(:canvaskit_chromium)" ] } diff --git a/third_party/canvaskit/canvaskit.gni b/third_party/canvaskit/canvaskit.gni deleted file mode 100644 index 4a22ede25ac6a..0000000000000 --- a/third_party/canvaskit/canvaskit.gni +++ /dev/null @@ -1,9 +0,0 @@ -# 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. - -declare_args() { - build_canvaskit = false - build_canvaskit_chromium = false - build_skwasm = false -} diff --git a/tools/gn b/tools/gn index 682820ba7c17c..24f074117b3b2 100755 --- a/tools/gn +++ b/tools/gn @@ -261,11 +261,7 @@ def to_gn_args(args): to_gn_wasm_args(args, gn_args) return gn_args - gn_args['flutter_build_web_sdk'] = args.build_web_sdk gn_args['full_dart_sdk'] = args.full_dart_sdk - if args.build_web_sdk or args.full_dart_sdk: - gn_args['build_canvaskit'] = args.build_canvaskit - gn_args['build_skwasm'] = args.build_skwasm if args.enable_unittests: gn_args['enable_unittests'] = args.enable_unittests @@ -658,14 +654,6 @@ def to_gn_wasm_args(args, gn_args): gn_args['skia_canvaskit_profile_build'] = is_profile_build gn_args['flutter_prebuilt_dart_sdk'] = True - # TODO(jacksongardner): Make this based off of the input argument rather - # than forced to true, once the recipes are updated. - # https://github.com/flutter/flutter/issues/113303 - gn_args['build_canvaskit'] = True - gn_args['build_skwasm'] = args.build_skwasm - gn_args['build_canvaskit_chromium'] = args.build_canvaskit_chromium - gn_args['flutter_build_web_sdk'] = True - def parse_args(args): args = args[1:] @@ -871,41 +859,11 @@ def parse_args(args): '--no-full-dart-sdk', dest='full_dart_sdk', action='store_false' ) - parser.add_argument( - '--build-web-sdk', - default=False, - action='store_true', - help='build the flutter web sdk' - ) - parser.add_argument( - '--no-build-web-sdk', dest='build_web_sdk', action='store_false' - ) - parser.add_argument( '--build-canvaskit', default=False, action='store_true', - help='build canvaskit from source' - ) - parser.add_argument( - '--no-build-canvaskit', dest='build_canvaskit', action='store_false' - ) - - parser.add_argument( - '--build-skwasm', - default=False, - action='store_true', - help='build skwasm library' - ) - parser.add_argument( - '--no-build-skwasm', dest='build_skwasm', action='store_false' - ) - parser.add_argument( - '--build-canvaskit-chromium', - default=False, - dest='build_canvaskit_chromium', - action='store_true', - help='build the Chromium variant of CanvasKit from sources' + help='build canvaskit from source (DEPRECATED: use ninja targets to select what to build)' ) parser.add_argument( diff --git a/wasm/BUILD.gn b/wasm/BUILD.gn index f4d6a54ee5e76..ccd1ef8450b7f 100644 --- a/wasm/BUILD.gn +++ b/wasm/BUILD.gn @@ -10,7 +10,5 @@ import("//flutter/common/config.gni") # This is the default target when building when the target CPU is WASM. group("wasm") { - if (flutter_build_web_sdk) { - deps = [ "//flutter/web_sdk" ] - } + deps = [ "//flutter/web_sdk:flutter_web_sdk_archive" ] } diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 6bc8eb4859bb1..473353f342ea0 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -4,13 +4,8 @@ import("//flutter/build/zip_bundle.gni") import("//flutter/common/config.gni") -import("//flutter/third_party/canvaskit/canvaskit.gni") import("//third_party/dart/build/dart/dart_action.gni") -declare_args() { - archive_flutter_web_sdk = true -} - dart_sdk_package_config = "//third_party/dart/.dart_tool/package_config.json" web_ui_sources = exec_script("//third_party/dart/tools/list_dart_files.py", @@ -35,10 +30,6 @@ group("web_sdk") { ":flutter_ddc_modules", ":flutter_platform_dills", ] - - if (archive_flutter_web_sdk && !is_fuchsia) { - deps += [ ":flutter_web_sdk_archive" ] - } } template("sdk_rewriter") { @@ -558,18 +549,11 @@ if (!is_fuchsia) { deps = [ ":flutter_ddc_modules", ":flutter_platform_dills", - ] + web_engine_libraries + "//flutter/third_party/canvaskit:canvaskit_group", + "//flutter/third_party/canvaskit:canvaskit_chromium_group", + "//flutter/lib/web_ui/skwasm" - if (build_canvaskit) { - deps += [ "//flutter/third_party/canvaskit:canvaskit_group" ] - } - if (build_canvaskit_chromium) { - deps += [ "//flutter/third_party/canvaskit:canvaskit_chromium_group" ] - } - - if (build_skwasm) { - deps += [ "//flutter/lib/web_ui/skwasm" ] - } + ] + web_engine_libraries # flutter_ddc_modules sources = get_target_outputs(":flutter_dartdevc_kernel_sdk") @@ -608,49 +592,37 @@ if (!is_fuchsia) { }, ] } - if (build_canvaskit) { - tmp_files += [ - { - source = rebase_path("$root_out_dir/canvaskit/canvaskit.js") - destination = "flutter_web_sdk/canvaskit/canvaskit.js" - }, - { - source = rebase_path("$root_out_dir/canvaskit/canvaskit.wasm") - destination = "flutter_web_sdk/canvaskit/canvaskit.wasm" - }, - ] - } - - if (build_skwasm) { - tmp_files += [ - { - source = rebase_path("$root_out_dir/skwasm.js") - destination = "skwasm/skwasm.js" - }, - { - source = rebase_path("$root_out_dir/skwasm.js") - destination = "skwasm/skwasm.worker.js" - }, - { - source = rebase_path("$root_out_dir/canvaskit.wasm") - destination = "skwasm/skwasm.wasm" - }, - ] - } - - if (build_canvaskit_chromium) { - tmp_files += [ - { - source = rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.js") - destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.js" - }, - { - source = - rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.wasm") - destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.wasm" - }, - ] - } + tmp_files += [ + { + source = rebase_path("$root_out_dir/canvaskit/canvaskit.js") + destination = "flutter_web_sdk/canvaskit/canvaskit.js" + }, + { + source = rebase_path("$root_out_dir/canvaskit/canvaskit.wasm") + destination = "flutter_web_sdk/canvaskit/canvaskit.wasm" + }, + { + source = rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.js") + destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.js" + }, + { + source = + rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.wasm") + destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.wasm" + }, + { + source = rebase_path("$root_out_dir/skwasm.js") + destination = "skwasm/skwasm.js" + }, + { + source = rebase_path("$root_out_dir/skwasm.worker.js") + destination = "skwasm/skwasm.worker.js" + }, + { + source = rebase_path("$root_out_dir/skwasm.wasm") + destination = "skwasm/skwasm.wasm" + }, + ] files = tmp_files } } From 7ff5d86895d43ed960ec5e0a6dbb98f0546a873b Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 1 Feb 2023 13:58:17 -0800 Subject: [PATCH 27/34] Formatting stuff. --- lib/web_ui/dev/test_platform.dart | 6 +++--- third_party/canvaskit/BUILD.gn | 3 +-- web_sdk/BUILD.gn | 8 +++----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 3c5394864082e..60b13dbae10b8 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -431,9 +431,9 @@ class BrowserPlatform extends PlatformPlugin { return shelf.Response.internalServerError(body: error); } - final bool needsCoopCoep = - extension == '.js' || - extension == '.mjs' || + final bool needsCoopCoep = + extension == '.js' || + extension == '.mjs' || extension == '.html'; return shelf.Response.ok( fileInBuild.readAsBytesSync(), diff --git a/third_party/canvaskit/BUILD.gn b/third_party/canvaskit/BUILD.gn index f083f3b8fe997..63776f68d8585 100644 --- a/third_party/canvaskit/BUILD.gn +++ b/third_party/canvaskit/BUILD.gn @@ -28,6 +28,5 @@ wasm_toolchain("canvaskit_chromium") { group("canvaskit_chromium_group") { visibility = [ "//flutter/web_sdk:*" ] - public_deps = - [ "//third_party/skia/modules/canvaskit(:canvaskit_chromium)" ] + public_deps = [ "//third_party/skia/modules/canvaskit(:canvaskit_chromium)" ] } diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 473353f342ea0..7f01543e74799 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -551,8 +551,7 @@ if (!is_fuchsia) { ":flutter_platform_dills", "//flutter/third_party/canvaskit:canvaskit_group", "//flutter/third_party/canvaskit:canvaskit_chromium_group", - "//flutter/lib/web_ui/skwasm" - + "//flutter/lib/web_ui/skwasm", ] + web_engine_libraries # flutter_ddc_modules @@ -606,11 +605,10 @@ if (!is_fuchsia) { destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.js" }, { - source = - rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.wasm") + source = rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.wasm") destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.wasm" }, - { + { source = rebase_path("$root_out_dir/skwasm.js") destination = "skwasm/skwasm.js" }, From 54bad71507a3a5b51e57b62cd31dcaa72a2eb479 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 9 Feb 2023 13:48:11 -0800 Subject: [PATCH 28/34] Remove --skwasm flag from felt test. --- lib/web_ui/dev/steps/compile_tests_step.dart | 9 +++------ lib/web_ui/dev/test_runner.dart | 7 ------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/lib/web_ui/dev/steps/compile_tests_step.dart b/lib/web_ui/dev/steps/compile_tests_step.dart index 1090e9e3d05b3..de9243b0d1384 100644 --- a/lib/web_ui/dev/steps/compile_tests_step.dart +++ b/lib/web_ui/dev/steps/compile_tests_step.dart @@ -26,12 +26,11 @@ class CompileTestsStep implements PipelineStep { CompileTestsStep({ this.testFiles, this.useLocalCanvasKit = false, - this.useSkwasm = false, - this.isWasm = false}); + this.isWasm = false + }); final List? testFiles; final bool isWasm; - final bool useSkwasm; final bool useLocalCanvasKit; @@ -51,11 +50,9 @@ class CompileTestsStep implements PipelineStep { await environment.webUiBuildDir.create(); if (isWasm) { await copyDart2WasmTestScript(); - } - await copyCanvasKitFiles(useLocalCanvasKit: useLocalCanvasKit); - if (useSkwasm) { await copySkwasm(); } + await copyCanvasKitFiles(useLocalCanvasKit: useLocalCanvasKit); await buildHostPage(); await copyTestFonts(); await copySkiaTestImages(); diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index 1da9749872aac..f3756a82ba480 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -82,10 +82,6 @@ class TestCommand extends Command with ArgUtils { 'use-local-canvaskit', help: 'Optional. Whether or not to use the locally built version of ' 'CanvasKit in the tests.', - ) - ..addFlag( - 'skwasm', - help: 'Run unit tests for skwasm renderer.' ); } @@ -101,8 +97,6 @@ class TestCommand extends Command with ArgUtils { bool get isWasm => boolArg('wasm'); - bool get isSkwasm => boolArg('skwasm'); - /// Whether to start the browser in debug mode. /// /// In this mode the browser pauses before running the test to allow @@ -146,7 +140,6 @@ class TestCommand extends Command with ArgUtils { CompileTestsStep( testFiles: testFiles, useLocalCanvasKit: useLocalCanvasKit, - useSkwasm: isSkwasm, isWasm: isWasm ), RunTestsStep( From 21f4f5dfed45868eac2c85848920b519581d7991 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 9 Feb 2023 13:48:39 -0800 Subject: [PATCH 29/34] Only include COOP/COEP headers when compiling to wasm with skwasm renderer. --- lib/web_ui/dev/test_platform.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 60b13dbae10b8..c63f6af6ec651 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -439,7 +439,7 @@ class BrowserPlatform extends PlatformPlugin { fileInBuild.readAsBytesSync(), headers: { HttpHeaders.contentTypeHeader: contentType, - if (needsCoopCoep) + if (needsCoopCoep && isWasm && renderer == Renderer.skwasm) ...coopCoepHeaders, }, ); @@ -475,7 +475,8 @@ class BrowserPlatform extends PlatformPlugin { ''', headers: { 'Content-Type': 'text/html', - ...coopCoepHeaders + if (isWasm && renderer == Renderer.skwasm) + ...coopCoepHeaders }); } From 7fcbc8e052559d9eaf60a3e992d90cc9e8157ef1 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 16 Feb 2023 17:47:06 -0800 Subject: [PATCH 30/34] Update sdk_rewriter_test. --- web_sdk/test/sdk_rewriter_test.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/web_sdk/test/sdk_rewriter_test.dart b/web_sdk/test/sdk_rewriter_test.dart index 54902cfc14e1e..0c6a6f6ac8aee 100644 --- a/web_sdk/test/sdk_rewriter_test.dart +++ b/web_sdk/test/sdk_rewriter_test.dart @@ -141,6 +141,7 @@ void printSomething() { "import 'dart:_engine';", "import 'dart:_web_unicode';", "import 'dart:_web_locale_keymap' as locale_keymap;", + "import 'dart:ffi';", ]); // Other libraries (should not have extra imports). From f58b5bc19dd0657c8f21a47baabdf637a0e32283 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 27 Feb 2023 10:20:29 -0800 Subject: [PATCH 31/34] Update lib/web_ui/dev/test_dart2wasm.js Co-authored-by: Mouad Debbar --- lib/web_ui/dev/test_dart2wasm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/dev/test_dart2wasm.js b/lib/web_ui/dev/test_dart2wasm.js index 01b1e07089007..2393881c2d71c 100644 --- a/lib/web_ui/dev/test_dart2wasm.js +++ b/lib/web_ui/dev/test_dart2wasm.js @@ -54,8 +54,8 @@ window.onload = async function () { let dart2wasm_runtime; let moduleInstance; try { - const isSkwasm = link.getAttribute('skwasm'); - const imports = isSkwasm === null ? {} : new Promise((resolve, reject) => { + const isSkwasm = link.hasAttribute('skwasm'); + const imports = isSkwasm ? {} : new Promise((resolve, reject) => { const skwasmScript = document.createElement('script'); skwasmScript.src = '/skwasm/skwasm.js'; From 6cfe6440c2bebf187be334fc2633611f84e7884d Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 27 Feb 2023 13:31:47 -0800 Subject: [PATCH 32/34] Fixed some skwasm build rules. --- lib/web_ui/skwasm/BUILD.gn | 9 +-------- web_sdk/BUILD.gn | 6 +++--- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/web_ui/skwasm/BUILD.gn b/lib/web_ui/skwasm/BUILD.gn index a67cae130c21f..8745b6a064d62 100644 --- a/lib/web_ui/skwasm/BUILD.gn +++ b/lib/web_ui/skwasm/BUILD.gn @@ -17,10 +17,6 @@ wasm_lib("skwasm") { "wrappers.h", ] - # embedded font, generated by the :create_notomono_cpp target - sources += - [ "$root_out_dir/modules/canvaskit/fonts/NotoMono-Regular.ttf.ninja.cpp" ] - ldflags = [ "-std=c++20", "-lGL", @@ -56,8 +52,5 @@ wasm_lib("skwasm") { ] } - deps = [ - "//third_party/skia", - "//third_party/skia/modules/canvaskit:create_notomono_cpp", - ] + deps = [ "//third_party/skia" ] } diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 7f01543e74799..69e5b9e7908fa 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -610,15 +610,15 @@ if (!is_fuchsia) { }, { source = rebase_path("$root_out_dir/skwasm.js") - destination = "skwasm/skwasm.js" + destination = "flutter_web_sdk/canvaskit/skwasm.js" }, { source = rebase_path("$root_out_dir/skwasm.worker.js") - destination = "skwasm/skwasm.worker.js" + destination = "flutter_web_sdk/canvaskit/skwasm.worker.js" }, { source = rebase_path("$root_out_dir/skwasm.wasm") - destination = "skwasm/skwasm.wasm" + destination = "flutter_web_sdk/canvaskit/skwasm.wasm" }, ] files = tmp_files From ec5b08e47d69b6a9d92e903cfd71d1c252da4d0e Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Mon, 27 Feb 2023 14:53:53 -0800 Subject: [PATCH 33/34] Whoops, we reversed the isSkwasm logic. Fixed. --- lib/web_ui/dev/test_dart2wasm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/dev/test_dart2wasm.js b/lib/web_ui/dev/test_dart2wasm.js index 2393881c2d71c..884fbc81fdecc 100644 --- a/lib/web_ui/dev/test_dart2wasm.js +++ b/lib/web_ui/dev/test_dart2wasm.js @@ -55,7 +55,7 @@ window.onload = async function () { let moduleInstance; try { const isSkwasm = link.hasAttribute('skwasm'); - const imports = isSkwasm ? {} : new Promise((resolve, reject) => { + const imports = isSkwasm ? new Promise((resolve) => { const skwasmScript = document.createElement('script'); skwasmScript.src = '/skwasm/skwasm.js'; @@ -69,7 +69,7 @@ window.onload = async function () { } }); }); - }); + }) : {}; let baseName = link.href + '.browser_test.dart'; dart2wasm_runtime = await import(baseName + '.mjs'); From 9b439482c320d00ab1226d700d30bd87584d8e51 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Wed, 1 Mar 2023 14:23:53 -0800 Subject: [PATCH 34/34] Address Harry's comments and change the archive structure. --- .../src/engine/skwasm/skwasm_impl/canvas.dart | 2 -- .../lib/src/engine/skwasm/skwasm_impl/image.dart | 2 +- .../src/engine/skwasm/skwasm_impl/renderer.dart | 4 ---- web_sdk/BUILD.gn | 16 ++++++++-------- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart index b51ee5e43d6f2..5ddefa82eebe3 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/canvas.dart @@ -29,7 +29,6 @@ class SkwasmCanvas implements ui.Canvas { @override void saveLayer(ui.Rect? bounds, ui.Paint uiPaint) { - assert(uiPaint is SkwasmPaint); final SkwasmPaint paint = uiPaint as SkwasmPaint; if (bounds != null) { withStackScope((StackScope s) { @@ -89,7 +88,6 @@ class SkwasmCanvas implements ui.Canvas { @override void clipPath(ui.Path uiPath, {bool doAntiAlias = true}) { - assert(uiPath is SkwasmPath); final SkwasmPath path = uiPath as SkwasmPath; canvasClipPath(_handle, path.handle, doAntiAlias); } diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart index 8497043370575..3ca0b738b14e8 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/image.dart @@ -37,7 +37,7 @@ class SkwasmImage implements ui.Image { SkwasmImage clone() => this; @override - bool isCloneOf(ui.Image other) => other == this; + bool isCloneOf(ui.Image other) => identical(this, other); @override List? debugGetOpenHandleStackTraces() => null; diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart index ffb15c7d66243..11fff7a89efbf 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/renderer.dart @@ -18,8 +18,6 @@ import '../../renderer.dart'; class SkwasmRenderer implements Renderer { @override ui.Path combinePaths(ui.PathOperation op, ui.Path path1, ui.Path path2) { - assert(path1 is SkwasmPath); - assert(path2 is SkwasmPath); return SkwasmPath.combine(op, path1 as SkwasmPath, path2 as SkwasmPath); } @@ -30,7 +28,6 @@ class SkwasmRenderer implements Renderer { @override ui.Path copyPath(ui.Path src) { - assert(src is SkwasmPath); return SkwasmPath.from(src as SkwasmPath); } @@ -41,7 +38,6 @@ class SkwasmRenderer implements Renderer { @override ui.Canvas createCanvas(ui.PictureRecorder recorder, [ui.Rect? cullRect]) { - assert(recorder is SkwasmPictureRecorder); return SkwasmCanvas(recorder as SkwasmPictureRecorder, cullRect ?? ui.Rect.largest); } diff --git a/web_sdk/BUILD.gn b/web_sdk/BUILD.gn index 69e5b9e7908fa..c09e5ca0dba02 100644 --- a/web_sdk/BUILD.gn +++ b/web_sdk/BUILD.gn @@ -587,38 +587,38 @@ if (!is_fuchsia) { tmp_files += [ { source = rebase_path(source) - destination = rebase_path(source, "$root_build_dir") + destination = rebase_path(source, "$root_build_dir/flutter_web_sdk") }, ] } tmp_files += [ { source = rebase_path("$root_out_dir/canvaskit/canvaskit.js") - destination = "flutter_web_sdk/canvaskit/canvaskit.js" + destination = "canvaskit/canvaskit.js" }, { source = rebase_path("$root_out_dir/canvaskit/canvaskit.wasm") - destination = "flutter_web_sdk/canvaskit/canvaskit.wasm" + destination = "canvaskit/canvaskit.wasm" }, { source = rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.js") - destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.js" + destination = "canvaskit/chromium/canvaskit.js" }, { source = rebase_path("$root_out_dir/canvaskit_chromium/canvaskit.wasm") - destination = "flutter_web_sdk/canvaskit_chromium/canvaskit.wasm" + destination = "canvaskit/chromium/canvaskit.wasm" }, { source = rebase_path("$root_out_dir/skwasm.js") - destination = "flutter_web_sdk/canvaskit/skwasm.js" + destination = "canvaskit/skwasm.js" }, { source = rebase_path("$root_out_dir/skwasm.worker.js") - destination = "flutter_web_sdk/canvaskit/skwasm.worker.js" + destination = "canvaskit/skwasm.worker.js" }, { source = rebase_path("$root_out_dir/skwasm.wasm") - destination = "flutter_web_sdk/canvaskit/skwasm.wasm" + destination = "canvaskit/skwasm.wasm" }, ] files = tmp_files