未验证 提交 e51642e4 编写于 作者: Y Yegor 提交者: GitHub

JS-interop clean-up (#19850)

上级 83c45b29
...@@ -16,7 +16,7 @@ class CkCanvas { ...@@ -16,7 +16,7 @@ class CkCanvas {
skCanvas.clear(toSharedSkColor1(color)); skCanvas.clear(toSharedSkColor1(color));
} }
static final SkClipOp _clipOpIntersect = canvasKitJs.ClipOp.Intersect; static final SkClipOp _clipOpIntersect = canvasKit.ClipOp.Intersect;
void clipPath(ui.Path path, bool doAntiAlias) { void clipPath(ui.Path path, bool doAntiAlias) {
final CkPath ckPath = path as CkPath; final CkPath ckPath = path as CkPath;
...@@ -158,7 +158,7 @@ class CkCanvas { ...@@ -158,7 +158,7 @@ class CkCanvas {
void drawParagraph(CkParagraph paragraph, ui.Offset offset) { void drawParagraph(CkParagraph paragraph, ui.Offset offset) {
skCanvas.drawParagraph( skCanvas.drawParagraph(
_jsObjectWrapper.unwrapSkParagraph(paragraph.legacySkiaObject), paragraph.skiaObject,
offset.dx, offset.dx,
offset.dy, offset.dy,
); );
...@@ -232,12 +232,12 @@ class CkCanvas { ...@@ -232,12 +232,12 @@ class CkCanvas {
} }
void saveLayerWithoutBounds(CkPaint paint) { void saveLayerWithoutBounds(CkPaint paint) {
final SkCanvasSaveLayerWithoutBoundsOverride override = _jsObjectWrapper.castToSkCanvasSaveLayerWithoutBoundsOverride(skCanvas); final SkCanvasSaveLayerWithoutBoundsOverload override = skCanvas as SkCanvasSaveLayerWithoutBoundsOverload;
override.saveLayer(paint.skiaObject); override.saveLayer(paint.skiaObject);
} }
void saveLayerWithFilter(ui.Rect bounds, ui.ImageFilter filter) { void saveLayerWithFilter(ui.Rect bounds, ui.ImageFilter filter) {
final SkCanvasSaveLayerWithFilterOverride override = _jsObjectWrapper.castToSkCanvasSaveLayerWithFilterOverride(skCanvas); final SkCanvasSaveLayerWithFilterOverload override = skCanvas as SkCanvasSaveLayerWithFilterOverload;
final CkImageFilter skImageFilter = filter as CkImageFilter; final CkImageFilter skImageFilter = filter as CkImageFilter;
return override.saveLayer( return override.saveLayer(
null, null,
......
...@@ -8,162 +8,15 @@ ...@@ -8,162 +8,15 @@
/// the API behind these bindings in the Skia source code. /// the API behind these bindings in the Skia source code.
part of engine; part of engine;
final js.JsObject _jsWindow = js.JsObject.fromBrowserObject(html.window); /// Entrypoint into the CanvasKit API.
late CanvasKit canvasKit;
/// This and [_jsObjectWrapper] below are used to convert `@JS`-backed /// Sets the [CanvasKit] object on `window` so we can use `@JS()` to bind to
/// objects to [js.JsObject]s. To do that we use `@JS` to pass the object /// static APIs.
/// to JavaScript (see [JsObjectWrapper]), then use this variable (which
/// uses `dart:js`) to read the value back, causing it to be wrapped in
/// [js.JsObject].
/// ///
// TODO(yjbanov): this is a temporary hack until we fully migrate to @JS. /// See, e.g. [SkPaint].
final js.JsObject _jsObjectWrapperLegacy = js.JsObject(js.context['Object']);
@JS('window.flutter_js_object_wrapper')
external JsObjectWrapper get _jsObjectWrapper;
@visibleForTesting
JsObjectWrapper get debugJsObjectWrapper => _jsObjectWrapper;
void initializeCanvasKitBindings(js.JsObject canvasKit) {
// Because JsObject cannot be cast to a @JS type, we stash CanvasKit into
// a global and use the [canvasKitJs] getter to access it.
_jsWindow['flutter_canvas_kit'] = canvasKit;
_jsWindow['flutter_js_object_wrapper'] = _jsObjectWrapperLegacy;
}
@JS()
class JsObjectWrapper {
external set skPaint(SkPaint? paint);
external set skMaskFilter(SkMaskFilter? filter);
external set skColorFilter(SkColorFilter? filter);
external set skImageFilter(SkImageFilter? filter);
external set skPath(SkPath? path);
external set skImage(SkImage? image);
external SkCanvas? get skCanvas;
external set skCanvas(SkCanvas? canvas);
external SkPicture? get skPicture;
external set skPicture(SkPicture? picture);
external SkParagraph? get skParagraph;
external set skParagraph(SkParagraph? paragraph);
}
/// Reads [JsObjectWrapper.skPath] as [SkPathArcToPointOverload].
@JS('window.flutter_js_object_wrapper.skPath')
external SkPathArcToPointOverload get _skPathArcToPointOverload;
/// Reads [JsObjectWrapper.skCanvas] as [SkCanvasSaveLayerWithoutBoundsOverride].
@JS('window.flutter_js_object_wrapper.skCanvas')
external SkCanvasSaveLayerWithoutBoundsOverride get _skCanvasSaveLayerWithoutBoundsOverride;
/// Reads [JsObjectWrapper.skCanvas] as [SkCanvasSaveLayerWithFilterOverride].
@JS('window.flutter_js_object_wrapper.skCanvas')
external SkCanvasSaveLayerWithFilterOverride get _skCanvasSaveLayerWithFilterOverride;
/// Specific methods that wrap `@JS`-backed objects into a [js.JsObject]
/// for use with legacy `dart:js` API.
extension JsObjectWrappers on JsObjectWrapper {
js.JsObject wrapSkPaint(SkPaint paint) {
_jsObjectWrapper.skPaint = paint;
js.JsObject wrapped = _jsObjectWrapperLegacy['skPaint'];
_jsObjectWrapper.skPaint = null;
return wrapped;
}
js.JsObject wrapSkMaskFilter(SkMaskFilter filter) {
_jsObjectWrapper.skMaskFilter = filter;
js.JsObject wrapped = _jsObjectWrapperLegacy['skMaskFilter'];
_jsObjectWrapper.skMaskFilter = null;
return wrapped;
}
js.JsObject wrapSkColorFilter(SkColorFilter filter) {
_jsObjectWrapper.skColorFilter = filter;
js.JsObject wrapped = _jsObjectWrapperLegacy['skColorFilter'];
_jsObjectWrapper.skColorFilter = null;
return wrapped;
}
js.JsObject wrapSkImageFilter(SkImageFilter filter) {
_jsObjectWrapper.skImageFilter = filter;
js.JsObject wrapped = _jsObjectWrapperLegacy['skImageFilter'];
_jsObjectWrapper.skImageFilter = null;
return wrapped;
}
js.JsObject wrapSkPath(SkPath path) {
_jsObjectWrapper.skPath = path;
js.JsObject wrapped = _jsObjectWrapperLegacy['skPath'];
_jsObjectWrapper.skPath = null;
return wrapped;
}
js.JsObject wrapSkImage(SkImage image) {
_jsObjectWrapper.skImage = image;
js.JsObject wrapped = _jsObjectWrapperLegacy['skImage'];
_jsObjectWrapper.skImage = null;
return wrapped;
}
js.JsObject wrapSkPicture(SkPicture picture) {
_jsObjectWrapper.skPicture = picture;
js.JsObject wrapped = _jsObjectWrapperLegacy['skPicture'];
_jsObjectWrapper.skPicture = null;
return wrapped;
}
SkPicture unwrapSkPicture(js.JsObject wrapped) {
_jsObjectWrapperLegacy['skPicture'] = wrapped;
final SkPicture unwrapped = _jsObjectWrapper.skPicture!;
_jsObjectWrapper.skPicture = null;
return unwrapped;
}
js.JsObject wrapSkParagraph(SkParagraph paragraph) {
_jsObjectWrapper.skParagraph = paragraph;
js.JsObject wrapped = _jsObjectWrapperLegacy['skParagraph'];
_jsObjectWrapper.skParagraph = null;
return wrapped;
}
SkParagraph unwrapSkParagraph(js.JsObject wrapped) {
_jsObjectWrapperLegacy['skParagraph'] = wrapped;
final SkParagraph unwrapped = _jsObjectWrapper.skParagraph!;
_jsObjectWrapper.skParagraph = null;
return unwrapped;
}
SkCanvas unwrapSkCanvas(js.JsObject wrapped) {
_jsObjectWrapperLegacy['skCanvas'] = wrapped;
final SkCanvas unwrapped = _jsObjectWrapper.skCanvas!;
_jsObjectWrapper.skCanvas = null;
return unwrapped;
}
SkPathArcToPointOverload castToSkPathArcToPointOverload(SkPath path) {
_jsObjectWrapper.skPath = path;
final SkPathArcToPointOverload overload = _skPathArcToPointOverload;
_jsObjectWrapper.skPath = null;
return overload;
}
SkCanvasSaveLayerWithoutBoundsOverride castToSkCanvasSaveLayerWithoutBoundsOverride(SkCanvas canvas) {
_jsObjectWrapper.skCanvas = canvas;
final SkCanvasSaveLayerWithoutBoundsOverride overload = _skCanvasSaveLayerWithoutBoundsOverride;
_jsObjectWrapper.skCanvas = null;
return overload;
}
SkCanvasSaveLayerWithFilterOverride castToSkCanvasSaveLayerWithFilterOverride(SkCanvas canvas) {
_jsObjectWrapper.skCanvas = canvas;
final SkCanvasSaveLayerWithFilterOverride overload = _skCanvasSaveLayerWithFilterOverride;
_jsObjectWrapper.skCanvas = null;
return overload;
}
}
@JS('window.flutter_canvas_kit') @JS('window.flutter_canvas_kit')
external CanvasKit get canvasKitJs; external set windowFlutterCanvasKit(CanvasKit value);
@JS() @JS()
class CanvasKit { class CanvasKit {
...@@ -213,6 +66,66 @@ class CanvasKit { ...@@ -213,6 +66,66 @@ class CanvasKit {
// End of text decoration enum. // End of text decoration enum.
external SkFontMgrNamespace get SkFontMgr; external SkFontMgrNamespace get SkFontMgr;
external int GetWebGLContext(html.CanvasElement canvas, SkWebGLContextOptions options);
external SkGrContext MakeGrContext(int glContext);
external SkSurface MakeOnScreenGLSurface(
SkGrContext grContext,
double width,
double height,
SkColorSpace colorSpace,
);
external SkSurface MakeSWCanvasSurface(html.CanvasElement canvas);
external void setCurrentContext(int glContext);
}
@JS('window.CanvasKitInit')
external CanvasKitInitPromise CanvasKitInit(CanvasKitInitOptions options);
typedef LocateFileCallback = String Function(String file, String unusedBase);
@JS()
@anonymous
class CanvasKitInitOptions {
external factory CanvasKitInitOptions({
required LocateFileCallback locateFile,
});
}
typedef CanvasKitInitCallback = void Function(CanvasKit canvasKit);
@JS()
class CanvasKitInitPromise {
external void then(CanvasKitInitCallback callback);
}
@JS('window.flutter_canvas_kit.SkColorSpace.SRGB')
external SkColorSpace get SkColorSpaceSRGB;
@JS()
class SkColorSpace {}
@JS()
@anonymous
class SkWebGLContextOptions {
external factory SkWebGLContextOptions({
required int anitalias,
});
}
@JS()
class SkSurface {
external SkCanvas getCanvas();
external void flush();
external int width();
external int height();
external void dispose();
}
@JS()
class SkGrContext {
external void setResourceCacheLimitBytes(int limit);
external void releaseResourcesAndAbandonContext();
external void delete();
} }
@JS() @JS()
...@@ -227,8 +140,8 @@ class SkFontSlant { ...@@ -227,8 +140,8 @@ class SkFontSlant {
} }
final List<SkFontSlant> _skFontSlants = <SkFontSlant>[ final List<SkFontSlant> _skFontSlants = <SkFontSlant>[
canvasKitJs.FontSlant.Upright, canvasKit.FontSlant.Upright,
canvasKitJs.FontSlant.Italic, canvasKit.FontSlant.Italic,
]; ];
SkFontSlant toSkFontSlant(ui.FontStyle style) { SkFontSlant toSkFontSlant(ui.FontStyle style) {
...@@ -254,15 +167,15 @@ class SkFontWeight { ...@@ -254,15 +167,15 @@ class SkFontWeight {
} }
final List<SkFontWeight> _skFontWeights = <SkFontWeight>[ final List<SkFontWeight> _skFontWeights = <SkFontWeight>[
canvasKitJs.FontWeight.Thin, canvasKit.FontWeight.Thin,
canvasKitJs.FontWeight.ExtraLight, canvasKit.FontWeight.ExtraLight,
canvasKitJs.FontWeight.Light, canvasKit.FontWeight.Light,
canvasKitJs.FontWeight.Normal, canvasKit.FontWeight.Normal,
canvasKitJs.FontWeight.Medium, canvasKit.FontWeight.Medium,
canvasKitJs.FontWeight.SemiBold, canvasKit.FontWeight.SemiBold,
canvasKitJs.FontWeight.Bold, canvasKit.FontWeight.Bold,
canvasKitJs.FontWeight.ExtraBold, canvasKit.FontWeight.ExtraBold,
canvasKitJs.FontWeight.ExtraBlack, canvasKit.FontWeight.ExtraBlack,
]; ];
SkFontWeight toSkFontWeight(ui.FontWeight weight) { SkFontWeight toSkFontWeight(ui.FontWeight weight) {
...@@ -281,8 +194,8 @@ class SkAffinity { ...@@ -281,8 +194,8 @@ class SkAffinity {
} }
final List<SkAffinity> _skAffinitys = <SkAffinity>[ final List<SkAffinity> _skAffinitys = <SkAffinity>[
canvasKitJs.Affinity.Upstream, canvasKit.Affinity.Upstream,
canvasKitJs.Affinity.Downstream, canvasKit.Affinity.Downstream,
]; ];
SkAffinity toSkAffinity(ui.TextAffinity affinity) { SkAffinity toSkAffinity(ui.TextAffinity affinity) {
...@@ -303,8 +216,8 @@ class SkTextDirection { ...@@ -303,8 +216,8 @@ class SkTextDirection {
// Flutter enumerates text directions as RTL, LTR, while CanvasKit // Flutter enumerates text directions as RTL, LTR, while CanvasKit
// enumerates them LTR, RTL. // enumerates them LTR, RTL.
final List<SkTextDirection> _skTextDirections = <SkTextDirection>[ final List<SkTextDirection> _skTextDirections = <SkTextDirection>[
canvasKitJs.TextDirection.RTL, canvasKit.TextDirection.RTL,
canvasKitJs.TextDirection.LTR, canvasKit.TextDirection.LTR,
]; ];
SkTextDirection toSkTextDirection(ui.TextDirection direction) { SkTextDirection toSkTextDirection(ui.TextDirection direction) {
...@@ -327,12 +240,12 @@ class SkTextAlign { ...@@ -327,12 +240,12 @@ class SkTextAlign {
} }
final List<SkTextAlign> _skTextAligns = <SkTextAlign>[ final List<SkTextAlign> _skTextAligns = <SkTextAlign>[
canvasKitJs.TextAlign.Left, canvasKit.TextAlign.Left,
canvasKitJs.TextAlign.Right, canvasKit.TextAlign.Right,
canvasKitJs.TextAlign.Center, canvasKit.TextAlign.Center,
canvasKitJs.TextAlign.Justify, canvasKit.TextAlign.Justify,
canvasKitJs.TextAlign.Start, canvasKit.TextAlign.Start,
canvasKitJs.TextAlign.End, canvasKit.TextAlign.End,
]; ];
SkTextAlign toSkTextAlign(ui.TextAlign align) { SkTextAlign toSkTextAlign(ui.TextAlign align) {
...@@ -352,8 +265,8 @@ class SkRectHeightStyle { ...@@ -352,8 +265,8 @@ class SkRectHeightStyle {
} }
final List<SkRectHeightStyle> _skRectHeightStyles = <SkRectHeightStyle>[ final List<SkRectHeightStyle> _skRectHeightStyles = <SkRectHeightStyle>[
canvasKitJs.RectHeightStyle.Tight, canvasKit.RectHeightStyle.Tight,
canvasKitJs.RectHeightStyle.Max, canvasKit.RectHeightStyle.Max,
]; ];
SkRectHeightStyle toSkRectHeightStyle(ui.BoxHeightStyle style) { SkRectHeightStyle toSkRectHeightStyle(ui.BoxHeightStyle style) {
...@@ -373,8 +286,8 @@ class SkRectWidthStyle { ...@@ -373,8 +286,8 @@ class SkRectWidthStyle {
} }
final List<SkRectWidthStyle> _skRectWidthStyles = <SkRectWidthStyle>[ final List<SkRectWidthStyle> _skRectWidthStyles = <SkRectWidthStyle>[
canvasKitJs.RectWidthStyle.Tight, canvasKit.RectWidthStyle.Tight,
canvasKitJs.RectWidthStyle.Max, canvasKit.RectWidthStyle.Max,
]; ];
SkRectWidthStyle toSkRectWidthStyle(ui.BoxWidthStyle style) { SkRectWidthStyle toSkRectWidthStyle(ui.BoxWidthStyle style) {
...@@ -395,9 +308,9 @@ class SkVertexMode { ...@@ -395,9 +308,9 @@ class SkVertexMode {
} }
final List<SkVertexMode> _skVertexModes = <SkVertexMode>[ final List<SkVertexMode> _skVertexModes = <SkVertexMode>[
canvasKitJs.VertexMode.Triangles, canvasKit.VertexMode.Triangles,
canvasKitJs.VertexMode.TrianglesStrip, canvasKit.VertexMode.TrianglesStrip,
canvasKitJs.VertexMode.TriangleFan, canvasKit.VertexMode.TriangleFan,
]; ];
SkVertexMode toSkVertexMode(ui.VertexMode mode) { SkVertexMode toSkVertexMode(ui.VertexMode mode) {
...@@ -417,9 +330,9 @@ class SkPointMode { ...@@ -417,9 +330,9 @@ class SkPointMode {
} }
final List<SkPointMode> _skPointModes = <SkPointMode>[ final List<SkPointMode> _skPointModes = <SkPointMode>[
canvasKitJs.PointMode.Points, canvasKit.PointMode.Points,
canvasKitJs.PointMode.Lines, canvasKit.PointMode.Lines,
canvasKitJs.PointMode.Polygon, canvasKit.PointMode.Polygon,
]; ];
SkPointMode toSkPointMode(ui.PointMode mode) { SkPointMode toSkPointMode(ui.PointMode mode) {
...@@ -438,8 +351,8 @@ class SkClipOp { ...@@ -438,8 +351,8 @@ class SkClipOp {
} }
final List<SkClipOp> _skClipOps = <SkClipOp>[ final List<SkClipOp> _skClipOps = <SkClipOp>[
canvasKitJs.ClipOp.Difference, canvasKit.ClipOp.Difference,
canvasKitJs.ClipOp.Intersect, canvasKit.ClipOp.Intersect,
]; ];
SkClipOp toSkClipOp(ui.ClipOp clipOp) { SkClipOp toSkClipOp(ui.ClipOp clipOp) {
...@@ -458,8 +371,8 @@ class SkFillType { ...@@ -458,8 +371,8 @@ class SkFillType {
} }
final List<SkFillType> _skFillTypes = <SkFillType>[ final List<SkFillType> _skFillTypes = <SkFillType>[
canvasKitJs.FillType.Winding, canvasKit.FillType.Winding,
canvasKitJs.FillType.EvenOdd, canvasKit.FillType.EvenOdd,
]; ];
SkFillType toSkFillType(ui.PathFillType fillType) { SkFillType toSkFillType(ui.PathFillType fillType) {
...@@ -481,11 +394,11 @@ class SkPathOp { ...@@ -481,11 +394,11 @@ class SkPathOp {
} }
final List<SkPathOp> _skPathOps = <SkPathOp>[ final List<SkPathOp> _skPathOps = <SkPathOp>[
canvasKitJs.PathOp.Difference, canvasKit.PathOp.Difference,
canvasKitJs.PathOp.Intersect, canvasKit.PathOp.Intersect,
canvasKitJs.PathOp.Union, canvasKit.PathOp.Union,
canvasKitJs.PathOp.XOR, canvasKit.PathOp.XOR,
canvasKitJs.PathOp.ReverseDifference, canvasKit.PathOp.ReverseDifference,
]; ];
SkPathOp toSkPathOp(ui.PathOperation pathOp) { SkPathOp toSkPathOp(ui.PathOperation pathOp) {
...@@ -506,10 +419,10 @@ class SkBlurStyle { ...@@ -506,10 +419,10 @@ class SkBlurStyle {
} }
final List<SkBlurStyle> _skBlurStyles = <SkBlurStyle>[ final List<SkBlurStyle> _skBlurStyles = <SkBlurStyle>[
canvasKitJs.BlurStyle.Normal, canvasKit.BlurStyle.Normal,
canvasKitJs.BlurStyle.Solid, canvasKit.BlurStyle.Solid,
canvasKitJs.BlurStyle.Outer, canvasKit.BlurStyle.Outer,
canvasKitJs.BlurStyle.Inner, canvasKit.BlurStyle.Inner,
]; ];
SkBlurStyle toSkBlurStyle(ui.BlurStyle style) { SkBlurStyle toSkBlurStyle(ui.BlurStyle style) {
...@@ -529,9 +442,9 @@ class SkStrokeCap { ...@@ -529,9 +442,9 @@ class SkStrokeCap {
} }
final List<SkStrokeCap> _skStrokeCaps = <SkStrokeCap>[ final List<SkStrokeCap> _skStrokeCaps = <SkStrokeCap>[
canvasKitJs.StrokeCap.Butt, canvasKit.StrokeCap.Butt,
canvasKitJs.StrokeCap.Round, canvasKit.StrokeCap.Round,
canvasKitJs.StrokeCap.Square, canvasKit.StrokeCap.Square,
]; ];
SkStrokeCap toSkStrokeCap(ui.StrokeCap strokeCap) { SkStrokeCap toSkStrokeCap(ui.StrokeCap strokeCap) {
...@@ -550,8 +463,8 @@ class SkPaintStyle { ...@@ -550,8 +463,8 @@ class SkPaintStyle {
} }
final List<SkPaintStyle> _skPaintStyles = <SkPaintStyle>[ final List<SkPaintStyle> _skPaintStyles = <SkPaintStyle>[
canvasKitJs.PaintStyle.Fill, canvasKit.PaintStyle.Fill,
canvasKitJs.PaintStyle.Stroke, canvasKit.PaintStyle.Stroke,
]; ];
SkPaintStyle toSkPaintStyle(ui.PaintingStyle paintStyle) { SkPaintStyle toSkPaintStyle(ui.PaintingStyle paintStyle) {
...@@ -597,35 +510,35 @@ class SkBlendMode { ...@@ -597,35 +510,35 @@ class SkBlendMode {
} }
final List<SkBlendMode> _skBlendModes = <SkBlendMode>[ final List<SkBlendMode> _skBlendModes = <SkBlendMode>[
canvasKitJs.BlendMode.Clear, canvasKit.BlendMode.Clear,
canvasKitJs.BlendMode.Src, canvasKit.BlendMode.Src,
canvasKitJs.BlendMode.Dst, canvasKit.BlendMode.Dst,
canvasKitJs.BlendMode.SrcOver, canvasKit.BlendMode.SrcOver,
canvasKitJs.BlendMode.DstOver, canvasKit.BlendMode.DstOver,
canvasKitJs.BlendMode.SrcIn, canvasKit.BlendMode.SrcIn,
canvasKitJs.BlendMode.DstIn, canvasKit.BlendMode.DstIn,
canvasKitJs.BlendMode.SrcOut, canvasKit.BlendMode.SrcOut,
canvasKitJs.BlendMode.DstOut, canvasKit.BlendMode.DstOut,
canvasKitJs.BlendMode.SrcATop, canvasKit.BlendMode.SrcATop,
canvasKitJs.BlendMode.DstATop, canvasKit.BlendMode.DstATop,
canvasKitJs.BlendMode.Xor, canvasKit.BlendMode.Xor,
canvasKitJs.BlendMode.Plus, canvasKit.BlendMode.Plus,
canvasKitJs.BlendMode.Modulate, canvasKit.BlendMode.Modulate,
canvasKitJs.BlendMode.Screen, canvasKit.BlendMode.Screen,
canvasKitJs.BlendMode.Overlay, canvasKit.BlendMode.Overlay,
canvasKitJs.BlendMode.Darken, canvasKit.BlendMode.Darken,
canvasKitJs.BlendMode.Lighten, canvasKit.BlendMode.Lighten,
canvasKitJs.BlendMode.ColorDodge, canvasKit.BlendMode.ColorDodge,
canvasKitJs.BlendMode.ColorBurn, canvasKit.BlendMode.ColorBurn,
canvasKitJs.BlendMode.HardLight, canvasKit.BlendMode.HardLight,
canvasKitJs.BlendMode.SoftLight, canvasKit.BlendMode.SoftLight,
canvasKitJs.BlendMode.Difference, canvasKit.BlendMode.Difference,
canvasKitJs.BlendMode.Exclusion, canvasKit.BlendMode.Exclusion,
canvasKitJs.BlendMode.Multiply, canvasKit.BlendMode.Multiply,
canvasKitJs.BlendMode.Hue, canvasKit.BlendMode.Hue,
canvasKitJs.BlendMode.Saturation, canvasKit.BlendMode.Saturation,
canvasKitJs.BlendMode.Color, canvasKit.BlendMode.Color,
canvasKitJs.BlendMode.Luminosity, canvasKit.BlendMode.Luminosity,
]; ];
SkBlendMode toSkBlendMode(ui.BlendMode blendMode) { SkBlendMode toSkBlendMode(ui.BlendMode blendMode) {
...@@ -645,9 +558,9 @@ class SkStrokeJoin { ...@@ -645,9 +558,9 @@ class SkStrokeJoin {
} }
final List<SkStrokeJoin> _skStrokeJoins = <SkStrokeJoin>[ final List<SkStrokeJoin> _skStrokeJoins = <SkStrokeJoin>[
canvasKitJs.StrokeJoin.Miter, canvasKit.StrokeJoin.Miter,
canvasKitJs.StrokeJoin.Round, canvasKit.StrokeJoin.Round,
canvasKitJs.StrokeJoin.Bevel, canvasKit.StrokeJoin.Bevel,
]; ];
SkStrokeJoin toSkStrokeJoin(ui.StrokeJoin strokeJoin) { SkStrokeJoin toSkStrokeJoin(ui.StrokeJoin strokeJoin) {
...@@ -669,10 +582,10 @@ class SkFilterQuality { ...@@ -669,10 +582,10 @@ class SkFilterQuality {
} }
final List<SkFilterQuality> _skFilterQualitys = <SkFilterQuality>[ final List<SkFilterQuality> _skFilterQualitys = <SkFilterQuality>[
canvasKitJs.FilterQuality.None, canvasKit.FilterQuality.None,
canvasKitJs.FilterQuality.Low, canvasKit.FilterQuality.Low,
canvasKitJs.FilterQuality.Medium, canvasKit.FilterQuality.Medium,
canvasKitJs.FilterQuality.High, canvasKit.FilterQuality.High,
]; ];
SkFilterQuality toSkFilterQuality(ui.FilterQuality filterQuality) { SkFilterQuality toSkFilterQuality(ui.FilterQuality filterQuality) {
...@@ -693,9 +606,9 @@ class SkTileMode { ...@@ -693,9 +606,9 @@ class SkTileMode {
} }
final List<SkTileMode> _skTileModes = <SkTileMode>[ final List<SkTileMode> _skTileModes = <SkTileMode>[
canvasKitJs.TileMode.Clamp, canvasKit.TileMode.Clamp,
canvasKitJs.TileMode.Repeat, canvasKit.TileMode.Repeat,
canvasKitJs.TileMode.Mirror, canvasKit.TileMode.Mirror,
]; ];
SkTileMode toSkTileMode(ui.TileMode mode) { SkTileMode toSkTileMode(ui.TileMode mode) {
...@@ -829,6 +742,13 @@ class SkImageFilter { ...@@ -829,6 +742,13 @@ class SkImageFilter {
external void delete(); external void delete();
} }
// Mappings from SkMatrix-index to input-index.
const List<int> _skMatrixIndexToMatrix4Index = <int>[
0, 4, 12, // Row 1
1, 5, 13, // Row 2
3, 7, 15, // Row 3
];
/// Converts a 4x4 Flutter matrix (represented as a [Float32List]) to an /// Converts a 4x4 Flutter matrix (represented as a [Float32List]) to an
/// SkMatrix, which is a 3x3 transform matrix. /// SkMatrix, which is a 3x3 transform matrix.
Float32List toSkMatrixFromFloat32(Float32List matrix4) { Float32List toSkMatrixFromFloat32(Float32List matrix4) {
...@@ -1445,12 +1365,12 @@ class SkCanvas { ...@@ -1445,12 +1365,12 @@ class SkCanvas {
} }
@JS() @JS()
class SkCanvasSaveLayerWithoutBoundsOverride { class SkCanvasSaveLayerWithoutBoundsOverload {
external void saveLayer(SkPaint paint); external void saveLayer(SkPaint paint);
} }
@JS() @JS()
class SkCanvasSaveLayerWithFilterOverride { class SkCanvasSaveLayerWithFilterOverload {
external void saveLayer( external void saveLayer(
SkPaint? paint, SkPaint? paint,
SkImageFilter? imageFilter, SkImageFilter? imageFilter,
...@@ -1555,7 +1475,8 @@ class SkFontStyle { ...@@ -1555,7 +1475,8 @@ class SkFontStyle {
@JS() @JS()
class SkFontMgr { class SkFontMgr {
external String? getFamilyName(int fontId);
external void delete();
} }
@JS() @JS()
......
...@@ -23,7 +23,7 @@ class CkColorFilter extends ResurrectableSkiaObject<SkColorFilter> { ...@@ -23,7 +23,7 @@ class CkColorFilter extends ResurrectableSkiaObject<SkColorFilter> {
SkColorFilter skColorFilter; SkColorFilter skColorFilter;
switch (_engineFilter._type) { switch (_engineFilter._type) {
case EngineColorFilter._TypeMode: case EngineColorFilter._TypeMode:
skColorFilter = canvasKitJs.SkColorFilter.MakeBlend( skColorFilter = canvasKit.SkColorFilter.MakeBlend(
toSharedSkColor1(_engineFilter._color!), toSharedSkColor1(_engineFilter._color!),
toSkBlendMode(_engineFilter._blendMode!), toSkBlendMode(_engineFilter._blendMode!),
); );
...@@ -34,13 +34,13 @@ class CkColorFilter extends ResurrectableSkiaObject<SkColorFilter> { ...@@ -34,13 +34,13 @@ class CkColorFilter extends ResurrectableSkiaObject<SkColorFilter> {
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++) {
colorMatrix[i] = matrix[i]; colorMatrix[i] = matrix[i];
} }
skColorFilter = canvasKitJs.SkColorFilter.MakeMatrix(colorMatrix); skColorFilter = canvasKit.SkColorFilter.MakeMatrix(colorMatrix);
break; break;
case EngineColorFilter._TypeLinearToSrgbGamma: case EngineColorFilter._TypeLinearToSrgbGamma:
skColorFilter = canvasKitJs.SkColorFilter.MakeLinearToSRGBGamma(); skColorFilter = canvasKit.SkColorFilter.MakeLinearToSRGBGamma();
break; break;
case EngineColorFilter._TypeSrgbToLinearGamma: case EngineColorFilter._TypeSrgbToLinearGamma:
skColorFilter = canvasKitJs.SkColorFilter.MakeSRGBToLinearGamma(); skColorFilter = canvasKit.SkColorFilter.MakeSRGBToLinearGamma();
break; break;
default: default:
throw StateError( throw StateError(
...@@ -49,9 +49,6 @@ class CkColorFilter extends ResurrectableSkiaObject<SkColorFilter> { ...@@ -49,9 +49,6 @@ class CkColorFilter extends ResurrectableSkiaObject<SkColorFilter> {
return skColorFilter; return skColorFilter;
} }
@override
js.JsObject get legacySkiaObject => _jsObjectWrapper.wrapSkColorFilter(skiaObject);
@override @override
SkColorFilter createDefault() { SkColorFilter createDefault() {
return _createSkiaObjectFromFilter(); return _createSkiaObjectFromFilter();
......
...@@ -41,7 +41,7 @@ class SkiaFontCollection { ...@@ -41,7 +41,7 @@ class SkiaFontCollection {
final List<Uint8List> fontBuffers = final List<Uint8List> fontBuffers =
_registeredFonts.map<Uint8List>((f) => f!.bytes).toList(); _registeredFonts.map<Uint8List>((f) => f!.bytes).toList();
skFontMgr = canvasKitJs.SkFontMgr.FromData(fontBuffers); skFontMgr = canvasKit.SkFontMgr.FromData(fontBuffers);
} }
/// Loads all of the unloaded fonts in [_unloadedFonts] and adds them /// Loads all of the unloaded fonts in [_unloadedFonts] and adds them
...@@ -164,10 +164,9 @@ class SkiaFontCollection { ...@@ -164,10 +164,9 @@ class SkiaFontCollection {
} }
String? _readActualFamilyName(Uint8List bytes) { String? _readActualFamilyName(Uint8List bytes) {
final js.JsObject tmpFontMgr = final SkFontMgr tmpFontMgr = canvasKit.SkFontMgr.FromData([bytes])!;
canvasKit['SkFontMgr'].callMethod('FromData', <Uint8List>[bytes]); String? actualFamily = tmpFontMgr.getFamilyName(0);
String? actualFamily = tmpFontMgr.callMethod('getFamilyName', <int>[0]); tmpFontMgr.delete();
tmpFontMgr.callMethod('delete');
return actualFamily; return actualFamily;
} }
......
...@@ -8,7 +8,7 @@ part of engine; ...@@ -8,7 +8,7 @@ part of engine;
/// Instantiates a [ui.Codec] backed by an `SkImage` from Skia. /// Instantiates a [ui.Codec] backed by an `SkImage` from Skia.
void skiaInstantiateImageCodec(Uint8List list, Callback<ui.Codec> callback, void skiaInstantiateImageCodec(Uint8List list, Callback<ui.Codec> callback,
[int? width, int? height, int? format, int? rowBytes]) { [int? width, int? height, int? format, int? rowBytes]) {
final SkAnimatedImage skAnimatedImage = canvasKitJs.MakeAnimatedImageFromEncoded(list); final SkAnimatedImage skAnimatedImage = canvasKit.MakeAnimatedImageFromEncoded(list);
final CkAnimatedImage animatedImage = CkAnimatedImage(skAnimatedImage); final CkAnimatedImage animatedImage = CkAnimatedImage(skAnimatedImage);
final CkAnimatedImageCodec codec = CkAnimatedImageCodec(animatedImage); final CkAnimatedImageCodec codec = CkAnimatedImageCodec(animatedImage);
callback(codec); callback(codec);
...@@ -55,7 +55,6 @@ class CkAnimatedImage implements ui.Image { ...@@ -55,7 +55,6 @@ class CkAnimatedImage implements ui.Image {
/// A [ui.Image] backed by an `SkImage` from Skia. /// A [ui.Image] backed by an `SkImage` from Skia.
class CkImage implements ui.Image { class CkImage implements ui.Image {
final SkImage skImage; final SkImage skImage;
late final js.JsObject legacyJsObject = _jsObjectWrapper.wrapSkImage(skImage);
CkImage(this.skImage); CkImage(this.skImage);
......
...@@ -26,14 +26,11 @@ class CkImageFilter extends ResurrectableSkiaObject<SkImageFilter> implements ui ...@@ -26,14 +26,11 @@ class CkImageFilter extends ResurrectableSkiaObject<SkImageFilter> implements ui
rawSkiaObject?.delete(); rawSkiaObject?.delete();
} }
@override
js.JsObject get legacySkiaObject => _jsObjectWrapper.wrapSkImageFilter(skiaObject);
SkImageFilter _initSkiaObject() { SkImageFilter _initSkiaObject() {
return canvasKitJs.SkImageFilter.MakeBlur( return canvasKit.SkImageFilter.MakeBlur(
_sigmaX, _sigmaX,
_sigmaY, _sigmaY,
canvasKitJs.TileMode.Clamp, canvasKit.TileMode.Clamp,
null, null,
); );
} }
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
part of engine; part of engine;
/// EXPERIMENTAL: Enable the Skia-based rendering backend. /// EXPERIMENTAL: Enable the Skia-based rendering backend.
...@@ -20,26 +19,22 @@ const bool canvasKitForceCpuOnly = ...@@ -20,26 +19,22 @@ const bool canvasKitForceCpuOnly =
/// NPM, update this URL to `https://unpkg.com/canvaskit-wasm@0.34.0/bin/`. /// NPM, update this URL to `https://unpkg.com/canvaskit-wasm@0.34.0/bin/`.
const String canvasKitBaseUrl = 'https://unpkg.com/canvaskit-wasm@0.16.2/bin/'; const String canvasKitBaseUrl = 'https://unpkg.com/canvaskit-wasm@0.16.2/bin/';
/// Initialize the Skia backend. /// Initialize CanvasKit.
/// ///
/// This calls `CanvasKitInit` and assigns the global [canvasKit] object. /// This calls `CanvasKitInit` and assigns the global [canvasKit] object.
Future<void> initializeSkia() { Future<void> initializeCanvasKit() {
final Completer<void> canvasKitCompleter = Completer<void>(); final Completer<void> canvasKitCompleter = Completer<void>();
late StreamSubscription<html.Event> loadSubscription; late StreamSubscription<html.Event> loadSubscription;
loadSubscription = domRenderer.canvasKitScript!.onLoad.listen((_) { loadSubscription = domRenderer.canvasKitScript!.onLoad.listen((_) {
loadSubscription.cancel(); loadSubscription.cancel();
final js.JsObject canvasKitInitArgs = js.JsObject.jsify(<String, dynamic>{ final CanvasKitInitPromise canvasKitInitPromise = CanvasKitInit(CanvasKitInitOptions(
'locateFile': (String file, String unusedBase) => canvasKitBaseUrl + file, locateFile: js.allowInterop((String file, String unusedBase) => canvasKitBaseUrl + file),
}); ));
final js.JsObject canvasKitInitPromise = canvasKitInitPromise.then(js.allowInterop((CanvasKit ck) {
js.JsObject(js.context['CanvasKitInit'], <dynamic>[canvasKitInitArgs]); canvasKit = ck;
canvasKitInitPromise.callMethod('then', <dynamic>[ windowFlutterCanvasKit = canvasKit;
(js.JsObject ck) { canvasKitCompleter.complete();
canvasKit = ck; }));
initializeCanvasKitBindings(canvasKit);
canvasKitCompleter.complete();
},
]);
}); });
/// Add a Skia scene host. /// Add a Skia scene host.
...@@ -48,11 +43,6 @@ Future<void> initializeSkia() { ...@@ -48,11 +43,6 @@ Future<void> initializeSkia() {
return canvasKitCompleter.future; return canvasKitCompleter.future;
} }
/// The entrypoint into all CanvasKit functions and classes.
///
/// This is created by [initializeSkia].
late js.JsObject canvasKit;
/// The Skia font collection. /// The Skia font collection.
SkiaFontCollection get skiaFontCollection => _skiaFontCollection!; SkiaFontCollection get skiaFontCollection => _skiaFontCollection!;
SkiaFontCollection? _skiaFontCollection; SkiaFontCollection? _skiaFontCollection;
......
...@@ -20,16 +20,13 @@ class CkMaskFilter extends ResurrectableSkiaObject<SkMaskFilter> { ...@@ -20,16 +20,13 @@ class CkMaskFilter extends ResurrectableSkiaObject<SkMaskFilter> {
SkMaskFilter resurrect() => _initSkiaObject(); SkMaskFilter resurrect() => _initSkiaObject();
SkMaskFilter _initSkiaObject() { SkMaskFilter _initSkiaObject() {
return canvasKitJs.MakeBlurMaskFilter( return canvasKit.MakeBlurMaskFilter(
toSkBlurStyle(_blurStyle), toSkBlurStyle(_blurStyle),
_sigma, _sigma,
true, true,
); );
} }
@override
js.JsObject get legacySkiaObject => _jsObjectWrapper.wrapSkMaskFilter(skiaObject);
@override @override
void delete() { void delete() {
rawSkiaObject?.delete(); rawSkiaObject?.delete();
......
...@@ -233,7 +233,4 @@ class CkPaint extends ResurrectableSkiaObject<SkPaint> implements ui.Paint { ...@@ -233,7 +233,4 @@ class CkPaint extends ResurrectableSkiaObject<SkPaint> implements ui.Paint {
void delete() { void delete() {
rawSkiaObject?.delete(); rawSkiaObject?.delete();
} }
@override
js.JsObject get legacySkiaObject => _jsObjectWrapper.wrapSkPaint(skiaObject);
} }
...@@ -55,10 +55,10 @@ class CkPath implements ui.Path { ...@@ -55,10 +55,10 @@ class CkPath implements ui.Path {
void addPath(ui.Path path, ui.Offset offset, {Float64List? matrix4}) { void addPath(ui.Path path, ui.Offset offset, {Float64List? matrix4}) {
List<double> skMatrix; List<double> skMatrix;
if (matrix4 == null) { if (matrix4 == null) {
skMatrix = makeSkMatrixFromFloat32( skMatrix = toSkMatrixFromFloat32(
Matrix4.translationValues(offset.dx, offset.dy, 0.0).storage); Matrix4.translationValues(offset.dx, offset.dy, 0.0).storage);
} else { } else {
skMatrix = makeSkMatrixFromFloat64(matrix4); skMatrix = toSkMatrixFromFloat64(matrix4);
skMatrix[2] += offset.dx; skMatrix[2] += offset.dx;
skMatrix[5] += offset.dy; skMatrix[5] += offset.dy;
} }
...@@ -129,8 +129,7 @@ class CkPath implements ui.Path { ...@@ -129,8 +129,7 @@ class CkPath implements ui.Path {
double rotation = 0.0, double rotation = 0.0,
bool largeArc = false, bool largeArc = false,
bool clockwise = true}) { bool clockwise = true}) {
final SkPathArcToPointOverload overload = _jsObjectWrapper.castToSkPathArcToPointOverload(_skPath); (_skPath as SkPathArcToPointOverload).arcTo(
overload.arcTo(
radius.x, radius.x,
radius.y, radius.y,
rotation, rotation,
...@@ -171,10 +170,10 @@ class CkPath implements ui.Path { ...@@ -171,10 +170,10 @@ class CkPath implements ui.Path {
void extendWithPath(ui.Path path, ui.Offset offset, {Float64List? matrix4}) { void extendWithPath(ui.Path path, ui.Offset offset, {Float64List? matrix4}) {
List<double> skMatrix; List<double> skMatrix;
if (matrix4 == null) { if (matrix4 == null) {
skMatrix = makeSkMatrixFromFloat32( skMatrix = toSkMatrixFromFloat32(
Matrix4.translationValues(offset.dx, offset.dy, 0.0).storage); Matrix4.translationValues(offset.dx, offset.dy, 0.0).storage);
} else { } else {
skMatrix = makeSkMatrixFromFloat64(matrix4); skMatrix = toSkMatrixFromFloat64(matrix4);
skMatrix[2] += offset.dx; skMatrix[2] += offset.dx;
skMatrix[5] += offset.dy; skMatrix[5] += offset.dy;
} }
...@@ -276,7 +275,7 @@ class CkPath implements ui.Path { ...@@ -276,7 +275,7 @@ class CkPath implements ui.Path {
) { ) {
final CkPath path1 = uiPath1 as CkPath; final CkPath path1 = uiPath1 as CkPath;
final CkPath path2 = uiPath2 as CkPath; final CkPath path2 = uiPath2 as CkPath;
final SkPath newPath = canvasKitJs.MakePathFromOp( final SkPath newPath = canvasKit.MakePathFromOp(
path1._skPath, path1._skPath,
path2._skPath, path2._skPath,
toSkPathOp(operation), toSkPathOp(operation),
......
...@@ -30,9 +30,6 @@ class CkPicture implements ui.Picture { ...@@ -30,9 +30,6 @@ class CkPicture implements ui.Picture {
class SkPictureSkiaObject extends OneShotSkiaObject<SkPicture> { class SkPictureSkiaObject extends OneShotSkiaObject<SkPicture> {
SkPictureSkiaObject(SkPicture picture) : super(picture); SkPictureSkiaObject(SkPicture picture) : super(picture);
@override
js.JsObject get legacySkiaObject => _jsObjectWrapper.wrapSkPicture(skiaObject);
@override @override
void delete() { void delete() {
rawSkiaObject?.delete(); rawSkiaObject?.delete();
......
...@@ -89,10 +89,6 @@ abstract class SkiaObject<T> { ...@@ -89,10 +89,6 @@ abstract class SkiaObject<T> {
/// The JavaScript object that's mapped onto a Skia C++ object in the WebAssembly heap. /// The JavaScript object that's mapped onto a Skia C++ object in the WebAssembly heap.
T get skiaObject; T get skiaObject;
/// The legacy view on the [skiaObject].
// TODO(yjbanov): remove this after completing JS-interop migration.
js.JsObject? get legacySkiaObject;
/// Deletes the associated C++ object from the WebAssembly heap. /// Deletes the associated C++ object from the WebAssembly heap.
void delete(); void delete();
......
...@@ -38,7 +38,7 @@ class Surface { ...@@ -38,7 +38,7 @@ class Surface {
CkSurface? _surface; CkSurface? _surface;
html.Element? htmlElement; html.Element? htmlElement;
js.JsObject? _grContext; SkGrContext? _grContext;
int? _skiaCacheBytes; int? _skiaCacheBytes;
/// Specify the GPU resource cache limits. /// Specify the GPU resource cache limits.
...@@ -49,8 +49,7 @@ class Surface { ...@@ -49,8 +49,7 @@ class Surface {
void _syncCacheBytes() { void _syncCacheBytes() {
if(_skiaCacheBytes != null) { if(_skiaCacheBytes != null) {
_grContext?.callMethod('setResourceCacheLimitBytes', <dynamic>[ _grContext?.setResourceCacheLimitBytes(_skiaCacheBytes!);
_skiaCacheBytes]);
} }
} }
...@@ -67,7 +66,7 @@ class Surface { ...@@ -67,7 +66,7 @@ class Surface {
final CkSurface surface = acquireRenderSurface(size); final CkSurface surface = acquireRenderSurface(size);
if (surface.context != null) { if (surface.context != null) {
canvasKit.callMethod('setCurrentContext', <int?>[surface.context]); canvasKit.setCurrentContext(surface.context!);
} }
SubmitCallback submitCallback = SubmitCallback submitCallback =
(SurfaceFrame surfaceFrame, CkCanvas canvas) { (SurfaceFrame surfaceFrame, CkCanvas canvas) {
...@@ -127,19 +126,20 @@ class Surface { ...@@ -127,19 +126,20 @@ class Surface {
return _makeSoftwareCanvasSurface(htmlCanvas); return _makeSoftwareCanvasSurface(htmlCanvas);
} else { } else {
// Try WebGL first. // Try WebGL first.
final int glContext = canvasKit.callMethod('GetWebGLContext', <dynamic>[ final int glContext = canvasKit.GetWebGLContext(
htmlCanvas, htmlCanvas,
// Default to no anti-aliasing. Paint commands can be explicitly SkWebGLContextOptions(
// anti-aliased by setting their `Paint` object's `antialias` property. // Default to no anti-aliasing. Paint commands can be explicitly
js.JsObject.jsify({'antialias': 0}), // anti-aliased by setting their `Paint` object's `antialias` property.
]); anitalias: 0,
),
);
if (glContext == 0) { if (glContext == 0) {
return _makeSoftwareCanvasSurface(htmlCanvas); return _makeSoftwareCanvasSurface(htmlCanvas);
} }
_grContext = _grContext = canvasKit.MakeGrContext(glContext);
canvasKit.callMethod('MakeGrContext', <dynamic>[glContext]);
if (_grContext == null) { if (_grContext == null) {
throw CanvasKitError('Failed to initialize CanvasKit. CanvasKit.MakeGrContext returned null.'); throw CanvasKitError('Failed to initialize CanvasKit. CanvasKit.MakeGrContext returned null.');
...@@ -149,13 +149,12 @@ class Surface { ...@@ -149,13 +149,12 @@ class Surface {
// CanvasKit's default. // CanvasKit's default.
_syncCacheBytes(); _syncCacheBytes();
js.JsObject? skSurface = SkSurface? skSurface = canvasKit.MakeOnScreenGLSurface(
canvasKit.callMethod('MakeOnScreenGLSurface', <dynamic>[ _grContext!,
_grContext,
size.width, size.width,
size.height, size.height,
canvasKit['SkColorSpace']['SRGB'], SkColorSpaceSRGB,
]); );
if (skSurface == null) { if (skSurface == null) {
return _makeSoftwareCanvasSurface(htmlCanvas); return _makeSoftwareCanvasSurface(htmlCanvas);
...@@ -173,9 +172,7 @@ class Surface { ...@@ -173,9 +172,7 @@ class Surface {
_didWarnAboutWebGlInitializationFailure = true; _didWarnAboutWebGlInitializationFailure = true;
} }
return CkSurface( return CkSurface(
canvasKit.callMethod('MakeSWCanvasSurface', <dynamic>[ canvasKit.MakeSWCanvasSurface(htmlCanvas),
htmlCanvas,
]),
null, null,
null, null,
); );
...@@ -183,7 +180,7 @@ class Surface { ...@@ -183,7 +180,7 @@ class Surface {
bool _presentSurface() { bool _presentSurface() {
if (_surface!.context != null) { if (_surface!.context != null) {
canvasKit.callMethod('setCurrentContext', <int?>[_surface!.context]); canvasKit.setCurrentContext(_surface!.context!);
} }
_surface!.flush(); _surface!.flush();
return true; return true;
...@@ -192,28 +189,25 @@ class Surface { ...@@ -192,28 +189,25 @@ class Surface {
/// A Dart wrapper around Skia's CkSurface. /// A Dart wrapper around Skia's CkSurface.
class CkSurface { class CkSurface {
final js.JsObject _surface; final SkSurface _surface;
final js.JsObject? _grContext; final SkGrContext? _grContext;
final int? _glContext; final int? _glContext;
CkSurface(this._surface, this._grContext, this._glContext); CkSurface(this._surface, this._grContext, this._glContext);
CkCanvas getCanvas() { CkCanvas getCanvas() {
final js.JsObject skCanvas = _surface.callMethod('getCanvas'); return CkCanvas(_surface.getCanvas());
return CkCanvas(
_jsObjectWrapper.unwrapSkCanvas(skCanvas),
);
} }
/// Flushes the graphics to be rendered on screen. /// Flushes the graphics to be rendered on screen.
void flush() { void flush() {
_surface.callMethod('flush'); _surface.flush();
} }
int? get context => _glContext; int? get context => _glContext;
int width() => _surface.callMethod('width'); int width() => _surface.width();
int height() => _surface.callMethod('height'); int height() => _surface.height();
void dispose() { void dispose() {
if (_isDisposed) { if (_isDisposed) {
...@@ -221,14 +215,14 @@ class CkSurface { ...@@ -221,14 +215,14 @@ class CkSurface {
} }
// Only resources from the current context can be disposed. // Only resources from the current context can be disposed.
if (_glContext != null) { if (_glContext != null) {
canvasKit.callMethod('setCurrentContext', <int?>[_glContext]); canvasKit.setCurrentContext(_glContext!);
} }
_surface.callMethod('dispose'); _surface.dispose();
// In CPU-only mode there's no graphics context. // In CPU-only mode there's no graphics context.
if (_grContext != null) { if (_grContext != null) {
_grContext!.callMethod('releaseResourcesAndAbandonContext'); _grContext!.releaseResourcesAndAbandonContext();
_grContext!.callMethod('delete'); _grContext!.delete();
} }
_isDisposed = true; _isDisposed = true;
} }
......
...@@ -107,7 +107,7 @@ class CkParagraphStyle implements ui.ParagraphStyle { ...@@ -107,7 +107,7 @@ class CkParagraphStyle implements ui.ParagraphStyle {
properties.textStyle = properties.textStyle =
toSkTextStyleProperties(fontFamily, fontSize, fontWeight, fontStyle); toSkTextStyleProperties(fontFamily, fontSize, fontWeight, fontStyle);
return canvasKitJs.ParagraphStyle(properties); return canvasKit.ParagraphStyle(properties);
} }
} }
...@@ -146,15 +146,15 @@ class CkTextStyle implements ui.TextStyle { ...@@ -146,15 +146,15 @@ class CkTextStyle implements ui.TextStyle {
} }
if (decoration != null) { if (decoration != null) {
int decorationValue = canvasKitJs.NoDecoration; int decorationValue = canvasKit.NoDecoration;
if (decoration.contains(ui.TextDecoration.underline)) { if (decoration.contains(ui.TextDecoration.underline)) {
decorationValue |= canvasKitJs.UnderlineDecoration; decorationValue |= canvasKit.UnderlineDecoration;
} }
if (decoration.contains(ui.TextDecoration.overline)) { if (decoration.contains(ui.TextDecoration.overline)) {
decorationValue |= canvasKitJs.OverlineDecoration; decorationValue |= canvasKit.OverlineDecoration;
} }
if (decoration.contains(ui.TextDecoration.lineThrough)) { if (decoration.contains(ui.TextDecoration.lineThrough)) {
decorationValue |= canvasKitJs.LineThroughDecoration; decorationValue |= canvasKit.LineThroughDecoration;
} }
properties.decoration = decorationValue; properties.decoration = decorationValue;
} }
...@@ -201,7 +201,7 @@ class CkTextStyle implements ui.TextStyle { ...@@ -201,7 +201,7 @@ class CkTextStyle implements ui.TextStyle {
// - locale // - locale
// - shadows // - shadows
// - fontFeatures // - fontFeatures
return CkTextStyle._(canvasKitJs.TextStyle(properties)); return CkTextStyle._(canvasKit.TextStyle(properties));
} }
CkTextStyle._(this.skTextStyle); CkTextStyle._(this.skTextStyle);
...@@ -280,9 +280,6 @@ class CkParagraph extends ResurrectableSkiaObject<SkParagraph> implements ui.Par ...@@ -280,9 +280,6 @@ class CkParagraph extends ResurrectableSkiaObject<SkParagraph> implements ui.Par
rawSkiaObject?.delete(); rawSkiaObject?.delete();
} }
@override
js.JsObject get legacySkiaObject => _jsObjectWrapper.wrapSkParagraph(skiaObject);
@override @override
bool get isResurrectionExpensive => true; bool get isResurrectionExpensive => true;
...@@ -416,7 +413,7 @@ class CkParagraphBuilder implements ui.ParagraphBuilder { ...@@ -416,7 +413,7 @@ class CkParagraphBuilder implements ui.ParagraphBuilder {
CkParagraphBuilder(ui.ParagraphStyle style) CkParagraphBuilder(ui.ParagraphStyle style)
: _commands = <_ParagraphCommand>[], : _commands = <_ParagraphCommand>[],
_style = style as CkParagraphStyle, _style = style as CkParagraphStyle,
_paragraphBuilder = canvasKitJs.ParagraphBuilder.Make( _paragraphBuilder = canvasKit.ParagraphBuilder.Make(
style.skParagraphStyle, style.skParagraphStyle,
skiaFontCollection.skFontMgr, skiaFontCollection.skFontMgr,
); );
......
...@@ -15,44 +15,6 @@ class CanvasKitError extends Error { ...@@ -15,44 +15,6 @@ class CanvasKitError extends Error {
String toString() => 'CanvasKitError: $message'; String toString() => 'CanvasKitError: $message';
} }
js.JsObject _mallocColorArray() {
return canvasKit
.callMethod('Malloc', <dynamic>[js.context['Float32Array'], 4]);
}
js.JsObject? sharedSkColor1;
js.JsObject? sharedSkColor2;
js.JsObject? sharedSkColor3;
void _setSharedColor(js.JsObject sharedColor, ui.Color color) {
Float32List array = sharedColor.callMethod('toTypedArray');
array[0] = color.red / 255.0;
array[1] = color.green / 255.0;
array[2] = color.blue / 255.0;
array[3] = color.alpha / 255.0;
}
void setSharedSkColor1(ui.Color color) {
if (sharedSkColor1 == null) {
sharedSkColor1 = _mallocColorArray();
}
_setSharedColor(sharedSkColor1!, color);
}
void setSharedSkColor2(ui.Color color) {
if (sharedSkColor2 == null) {
sharedSkColor2 = _mallocColorArray();
}
_setSharedColor(sharedSkColor2!, color);
}
void setSharedSkColor3(ui.Color color) {
if (sharedSkColor3 == null) {
sharedSkColor3 = _mallocColorArray();
}
_setSharedColor(sharedSkColor3!, color);
}
/// Creates a new color array. /// Creates a new color array.
Float32List makeFreshSkColor(ui.Color color) { Float32List makeFreshSkColor(ui.Color color) {
final Float32List result = Float32List(4); final Float32List result = Float32List(4);
...@@ -63,34 +25,6 @@ Float32List makeFreshSkColor(ui.Color color) { ...@@ -63,34 +25,6 @@ Float32List makeFreshSkColor(ui.Color color) {
return result; return result;
} }
js.JsObject makeSkRect(ui.Rect rect) {
return js.JsObject(canvasKit['LTRBRect'],
<double>[rect.left, rect.top, rect.right, rect.bottom]);
}
js.JsObject makeSkRRect(ui.RRect rrect) {
return js.JsObject.jsify({
'rect': makeSkRect(rrect.outerRect),
'rx1': rrect.tlRadiusX,
'ry1': rrect.tlRadiusY,
'rx2': rrect.trRadiusX,
'ry2': rrect.trRadiusY,
'rx3': rrect.brRadiusX,
'ry3': rrect.brRadiusY,
'rx4': rrect.blRadiusX,
'ry4': rrect.blRadiusY,
});
}
ui.Rect fromSkRect(js.JsObject skRect) {
return ui.Rect.fromLTRB(
skRect['fLeft'],
skRect['fTop'],
skRect['fRight'],
skRect['fBottom'],
);
}
ui.TextPosition fromPositionWithAffinity(SkTextPosition positionWithAffinity) { ui.TextPosition fromPositionWithAffinity(SkTextPosition positionWithAffinity) {
final ui.TextAffinity affinity = ui.TextAffinity.values[positionWithAffinity.affinity.value]; final ui.TextAffinity affinity = ui.TextAffinity.values[positionWithAffinity.affinity.value];
return ui.TextPosition( return ui.TextPosition(
...@@ -99,194 +33,6 @@ ui.TextPosition fromPositionWithAffinity(SkTextPosition positionWithAffinity) { ...@@ -99,194 +33,6 @@ ui.TextPosition fromPositionWithAffinity(SkTextPosition positionWithAffinity) {
); );
} }
js.JsArray<double> makeSkPoint(ui.Offset point) {
final js.JsArray<double> skPoint = js.JsArray<double>();
skPoint.length = 2;
skPoint[0] = point.dx;
skPoint[1] = point.dy;
return skPoint;
}
// TODO(hterkelsen): https://github.com/flutter/flutter/issues/58824
/// Creates a point list using a 2D JS array.
js.JsArray<js.JsArray<double>>? encodePointList(List<ui.Offset>? points) {
if (points == null) {
return null;
}
final int pointCount = points.length;
final js.JsArray<js.JsArray<double>> result =
js.JsArray<js.JsArray<double>>();
result.length = pointCount;
for (int i = 0; i < pointCount; ++i) {
final ui.Offset point = points[i];
assert(_offsetIsValid(point));
final js.JsArray<double> skPoint = js.JsArray<double>();
skPoint.length = 2;
skPoint[0] = point.dx;
skPoint[1] = point.dy;
result[i] = skPoint;
}
return result;
}
// TODO(hterkelsen): https://github.com/flutter/flutter/issues/58824
/// Creates a point list using a 2D JS array.
List<List<double>>? encodeRawPointList(Float32List? points) {
if (points == null) {
return null;
}
assert(points.length % 2 == 0);
var pointLength = points.length ~/ 2;
final js.JsArray<js.JsArray<double>> result =
js.JsArray<js.JsArray<double>>();
result.length = pointLength;
for (var i = 0; i < pointLength; i++) {
var x = i * 2;
var y = x + 1;
final js.JsArray<double> skPoint = js.JsArray<double>();
skPoint.length = 2;
skPoint[0] = points[x];
skPoint[1] = points[y];
result[i] = skPoint;
}
return result;
}
js.JsObject? makeSkPointMode(ui.PointMode pointMode) {
switch (pointMode) {
case ui.PointMode.points:
return canvasKit['PointMode']['Points'];
case ui.PointMode.lines:
return canvasKit['PointMode']['Lines'];
case ui.PointMode.polygon:
return canvasKit['PointMode']['Polygon'];
default:
throw StateError('Unrecognized point mode $pointMode');
}
}
js.JsObject? makeSkBlendMode(ui.BlendMode? blendMode) {
switch (blendMode) {
case ui.BlendMode.clear:
return canvasKit['BlendMode']['Clear'];
case ui.BlendMode.src:
return canvasKit['BlendMode']['Src'];
case ui.BlendMode.dst:
return canvasKit['BlendMode']['Dst'];
case ui.BlendMode.srcOver:
return canvasKit['BlendMode']['SrcOver'];
case ui.BlendMode.dstOver:
return canvasKit['BlendMode']['DstOver'];
case ui.BlendMode.srcIn:
return canvasKit['BlendMode']['SrcIn'];
case ui.BlendMode.dstIn:
return canvasKit['BlendMode']['DstIn'];
case ui.BlendMode.srcOut:
return canvasKit['BlendMode']['SrcOut'];
case ui.BlendMode.dstOut:
return canvasKit['BlendMode']['DstOut'];
case ui.BlendMode.srcATop:
return canvasKit['BlendMode']['SrcATop'];
case ui.BlendMode.dstATop:
return canvasKit['BlendMode']['DstATop'];
case ui.BlendMode.xor:
return canvasKit['BlendMode']['Xor'];
case ui.BlendMode.plus:
return canvasKit['BlendMode']['Plus'];
case ui.BlendMode.modulate:
return canvasKit['BlendMode']['Modulate'];
case ui.BlendMode.screen:
return canvasKit['BlendMode']['Screen'];
case ui.BlendMode.overlay:
return canvasKit['BlendMode']['Overlay'];
case ui.BlendMode.darken:
return canvasKit['BlendMode']['Darken'];
case ui.BlendMode.lighten:
return canvasKit['BlendMode']['Lighten'];
case ui.BlendMode.colorDodge:
return canvasKit['BlendMode']['ColorDodge'];
case ui.BlendMode.colorBurn:
return canvasKit['BlendMode']['ColorBurn'];
case ui.BlendMode.hardLight:
return canvasKit['BlendMode']['HardLight'];
case ui.BlendMode.softLight:
return canvasKit['BlendMode']['SoftLight'];
case ui.BlendMode.difference:
return canvasKit['BlendMode']['Difference'];
case ui.BlendMode.exclusion:
return canvasKit['BlendMode']['Exclusion'];
case ui.BlendMode.multiply:
return canvasKit['BlendMode']['Multiply'];
case ui.BlendMode.hue:
return canvasKit['BlendMode']['Hue'];
case ui.BlendMode.saturation:
return canvasKit['BlendMode']['Saturation'];
case ui.BlendMode.color:
return canvasKit['BlendMode']['Color'];
case ui.BlendMode.luminosity:
return canvasKit['BlendMode']['Luminosity'];
default:
return null;
}
}
// Mappings from SkMatrix-index to input-index.
const List<int> _skMatrixIndexToMatrix4Index = <int>[
0, 4, 12, // Row 1
1, 5, 13, // Row 2
3, 7, 15, // Row 3
];
/// Converts a 4x4 Flutter matrix (represented as a [Float32List]) to an
/// SkMatrix, which is a 3x3 transform matrix.
js.JsArray<double> makeSkMatrixFromFloat32(Float32List? matrix4) {
final js.JsArray<double> skMatrix = js.JsArray<double>();
skMatrix.length = 9;
for (int i = 0; i < 9; ++i) {
final int matrix4Index = _skMatrixIndexToMatrix4Index[i];
if (matrix4Index < matrix4!.length)
skMatrix[i] = matrix4[matrix4Index];
else
skMatrix[i] = 0.0;
}
return skMatrix;
}
js.JsArray<double> makeSkMatrixFromFloat64(Float64List matrix4) {
final js.JsArray<double> skMatrix = js.JsArray<double>();
skMatrix.length = 9;
for (int i = 0; i < 9; ++i) {
final int matrix4Index = _skMatrixIndexToMatrix4Index[i];
if (matrix4Index < matrix4.length)
skMatrix[i] = matrix4[matrix4Index];
else
skMatrix[i] = 0.0;
}
return skMatrix;
}
/// Color stops used when the framework specifies `null`.
final js.JsArray<double> _kDefaultColorStops = () {
final js.JsArray<double> jsColorStops = js.JsArray<double>();
jsColorStops.length = 2;
jsColorStops[0] = 0;
jsColorStops[1] = 1;
return jsColorStops;
}();
/// Converts a list of color stops into a Skia-compatible JS array or color stops.
///
/// In Flutter `null` means two color stops `[0, 1]` that in Skia must be specified explicitly.
js.JsArray<double> makeSkiaColorStops(List<double>? colorStops) {
if (colorStops == null) {
return _kDefaultColorStops;
}
final js.JsArray<double> jsColorStops = js.JsArray<double>.from(colorStops);
jsColorStops.length = colorStops.length;
return jsColorStops;
}
void drawSkShadow( void drawSkShadow(
SkCanvas skCanvas, SkCanvas skCanvas,
CkPath path, CkPath path,
...@@ -313,7 +59,7 @@ void drawSkShadow( ...@@ -313,7 +59,7 @@ void drawSkShadow(
); );
final SkTonalColors tonalColors = final SkTonalColors tonalColors =
canvasKitJs.computeTonalColors(inTonalColors); canvasKit.computeTonalColors(inTonalColors);
skCanvas.drawShadow( skCanvas.drawShadow(
path._skPath, path._skPath,
......
...@@ -27,7 +27,7 @@ class CkVertices implements ui.Vertices { ...@@ -27,7 +27,7 @@ class CkVertices implements ui.Vertices {
throw ArgumentError( throw ArgumentError(
'"indices" values must be valid indices in the positions list.'); '"indices" values must be valid indices in the positions list.');
skVertices = canvasKitJs.MakeSkVertices( skVertices = canvasKit.MakeSkVertices(
toSkVertexMode(mode), toSkVertexMode(mode),
toSkPoints2d(positions), toSkPoints2d(positions),
textureCoordinates != null ? toSkPoints2d(textureCoordinates) : null, textureCoordinates != null ? toSkPoints2d(textureCoordinates) : null,
...@@ -55,7 +55,7 @@ class CkVertices implements ui.Vertices { ...@@ -55,7 +55,7 @@ class CkVertices implements ui.Vertices {
throw ArgumentError( throw ArgumentError(
'"indices" values must be valid indices in the positions list.'); '"indices" values must be valid indices in the positions list.');
skVertices = canvasKitJs.MakeSkVertices( skVertices = canvasKit.MakeSkVertices(
toSkVertexMode(mode), toSkVertexMode(mode),
rawPointsToSkPoints2d(positions), rawPointsToSkPoints2d(positions),
textureCoordinates != null ? rawPointsToSkPoints2d(textureCoordinates) : null, textureCoordinates != null ? rawPointsToSkPoints2d(textureCoordinates) : null,
......
...@@ -158,7 +158,7 @@ class GradientLinear extends EngineGradient { ...@@ -158,7 +158,7 @@ class GradientLinear extends EngineGradient {
SkShader createSkiaShader() { SkShader createSkiaShader() {
assert(experimentalUseSkia); assert(experimentalUseSkia);
return canvasKitJs.SkShader.MakeLinearGradient( return canvasKit.SkShader.MakeLinearGradient(
toSkPoint(from), toSkPoint(from),
toSkPoint(to), toSkPoint(to),
toSkFloatColorList(colors), toSkFloatColorList(colors),
...@@ -212,7 +212,7 @@ class GradientRadial extends EngineGradient { ...@@ -212,7 +212,7 @@ class GradientRadial extends EngineGradient {
SkShader createSkiaShader() { SkShader createSkiaShader() {
assert(experimentalUseSkia); assert(experimentalUseSkia);
return canvasKitJs.SkShader.MakeRadialGradient( return canvasKit.SkShader.MakeRadialGradient(
toSkPoint(center), toSkPoint(center),
radius, radius,
toSkFloatColorList(colors), toSkFloatColorList(colors),
...@@ -246,7 +246,7 @@ class GradientConical extends EngineGradient { ...@@ -246,7 +246,7 @@ class GradientConical extends EngineGradient {
@override @override
SkShader createSkiaShader() { SkShader createSkiaShader() {
assert(experimentalUseSkia); assert(experimentalUseSkia);
return canvasKitJs.SkShader.MakeTwoPointConicalGradient( return canvasKit.SkShader.MakeTwoPointConicalGradient(
toSkPoint(focal), toSkPoint(focal),
focalRadius, focalRadius,
toSkPoint(center), toSkPoint(center),
......
...@@ -31,7 +31,7 @@ Future<void> _initializePlatform({ ...@@ -31,7 +31,7 @@ Future<void> _initializePlatform({
// This needs to be after `webOnlyInitializeEngine` because that is where the // This needs to be after `webOnlyInitializeEngine` because that is where the
// canvaskit script is added to the page. // canvaskit script is added to the page.
if (engine.experimentalUseSkia) { if (engine.experimentalUseSkia) {
await engine.initializeSkia(); await engine.initializeCanvasKit();
} }
assetManager ??= const engine.AssetManager(); assetManager ??= const engine.AssetManager();
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.6 // @dart = 2.6
import 'dart:js';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
...@@ -45,7 +44,7 @@ void _tests() { ...@@ -45,7 +44,7 @@ void _tests() {
expect(testObject.deleteCount, 0); expect(testObject.deleteCount, 0);
// Check that the getter does not have side-effects // Check that the getter does not have side-effects
final JsObject skiaObject1 = testObject.legacySkiaObject; final SkPaint skiaObject1 = testObject.skiaObject;
expect(skiaObject1, isNotNull); expect(skiaObject1, isNotNull);
expect(SkiaObjects.resurrectableObjects.single, testObject); expect(SkiaObjects.resurrectableObjects.single, testObject);
expect(testObject.createDefaultCount, 1); expect(testObject.createDefaultCount, 1);
...@@ -61,7 +60,7 @@ void _tests() { ...@@ -61,7 +60,7 @@ void _tests() {
expect(testObject.deleteCount, 1); expect(testObject.deleteCount, 1);
// Trigger resurrect // Trigger resurrect
final JsObject skiaObject2 = testObject.legacySkiaObject; final SkPaint skiaObject2 = testObject.skiaObject;
expect(skiaObject2, isNotNull); expect(skiaObject2, isNotNull);
expect(skiaObject2, isNot(same(skiaObject1))); expect(skiaObject2, isNot(same(skiaObject1)));
expect(SkiaObjects.resurrectableObjects.single, testObject); expect(SkiaObjects.resurrectableObjects.single, testObject);
...@@ -146,9 +145,6 @@ class TestOneShotSkiaObject extends OneShotSkiaObject<SkPaint> { ...@@ -146,9 +145,6 @@ class TestOneShotSkiaObject extends OneShotSkiaObject<SkPaint> {
TestOneShotSkiaObject() : super(SkPaint()); TestOneShotSkiaObject() : super(SkPaint());
@override
JsObject get legacySkiaObject => debugJsObjectWrapper.wrapSkPaint(skiaObject);
@override @override
void delete() { void delete() {
rawSkiaObject?.delete(); rawSkiaObject?.delete();
...@@ -183,9 +179,6 @@ class TestSkiaObject extends ResurrectableSkiaObject<SkPaint> { ...@@ -183,9 +179,6 @@ class TestSkiaObject extends ResurrectableSkiaObject<SkPaint> {
deleteCount++; deleteCount++;
} }
@override
JsObject get legacySkiaObject => debugJsObjectWrapper.wrapSkPaint(skiaObject);
@override @override
bool get isResurrectionExpensive => isExpensive; bool get isResurrectionExpensive => isExpensive;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册