Skip to content

Commit eff27c7

Browse files
author
Harry Terkelsen
authored
[CanvasKit] Automatically fall back to Noto fonts (flutter#23096)
1 parent 06227ed commit eff27c7

File tree

11 files changed

+1049
-81
lines changed

11 files changed

+1049
-81
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
12091209
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/canvaskit_canvas.dart
12101210
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/color_filter.dart
12111211
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart
1212+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/font_fallbacks.dart
12121213
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
12131214
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/image.dart
12141215
FILE: ../../../flutter/lib/web_ui/lib/src/engine/canvaskit/image_filter.dart

lib/web_ui/lib/src/engine.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ part 'engine/canvaskit/canvaskit_api.dart';
3232
part 'engine/canvaskit/color_filter.dart';
3333
part 'engine/canvaskit/embedded_views.dart';
3434
part 'engine/canvaskit/fonts.dart';
35+
part 'engine/canvaskit/font_fallbacks.dart';
3536
part 'engine/canvaskit/image.dart';
3637
part 'engine/canvaskit/image_filter.dart';
3738
part 'engine/canvaskit/initialization.dart';

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

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ class CkCanvas {
176176
void drawPoints(CkPaint paint, ui.PointMode pointMode, Float32List points) {
177177
skCanvas.drawPoints(
178178
toSkPointMode(pointMode),
179-
points,
179+
// TODO(hterkelsen): Don't convert this to 2d after we move to CK 0.21.
180+
rawPointsToSkPoints2d(points),
180181
paint.skiaObject,
181182
);
182183
}
@@ -192,10 +193,10 @@ class CkCanvas {
192193
skCanvas.drawRect(toSkRect(rect), paint.skiaObject);
193194
}
194195

195-
void drawShadow(CkPath path, ui.Color color, double elevation,
196-
bool transparentOccluder) {
197-
drawSkShadow(skCanvas, path, color, elevation,
198-
transparentOccluder, ui.window.devicePixelRatio);
196+
void drawShadow(
197+
CkPath path, ui.Color color, double elevation, bool transparentOccluder) {
198+
drawSkShadow(skCanvas, path, color, elevation, transparentOccluder,
199+
ui.window.devicePixelRatio);
199200
}
200201

201202
void drawVertices(
@@ -237,7 +238,8 @@ class CkCanvas {
237238
}
238239

239240
void saveLayerWithFilter(ui.Rect bounds, ui.ImageFilter filter) {
240-
final _CkManagedSkImageFilterConvertible convertible = filter as _CkManagedSkImageFilterConvertible;
241+
final _CkManagedSkImageFilterConvertible convertible =
242+
filter as _CkManagedSkImageFilterConvertible;
241243
return skCanvas.saveLayer(
242244
null,
243245
toSkRect(bounds),
@@ -267,8 +269,8 @@ class CkCanvas {
267269

268270
class RecordingCkCanvas extends CkCanvas {
269271
RecordingCkCanvas(SkCanvas skCanvas, ui.Rect bounds)
270-
: pictureSnapshot = CkPictureSnapshot(bounds),
271-
super(skCanvas);
272+
: pictureSnapshot = CkPictureSnapshot(bounds),
273+
super(skCanvas);
272274

273275
@override
274276
final CkPictureSnapshot pictureSnapshot;
@@ -310,7 +312,8 @@ class RecordingCkCanvas extends CkCanvas {
310312
CkPaint paint,
311313
) {
312314
super.drawArc(oval, startAngle, sweepAngle, useCenter, paint);
313-
_addCommand(CkDrawArcCommand(oval, startAngle, sweepAngle, useCenter, paint));
315+
_addCommand(
316+
CkDrawArcCommand(oval, startAngle, sweepAngle, useCenter, paint));
314317
}
315318

316319
@override
@@ -323,7 +326,8 @@ class RecordingCkCanvas extends CkCanvas {
323326
ui.BlendMode blendMode,
324327
) {
325328
super.drawAtlasRaw(paint, atlas, rstTransforms, rects, colors, blendMode);
326-
_addCommand(CkDrawAtlasCommand(paint, atlas, rstTransforms, rects, colors, blendMode));
329+
_addCommand(CkDrawAtlasCommand(
330+
paint, atlas, rstTransforms, rects, colors, blendMode));
327331
}
328332

329333
@override
@@ -418,10 +422,11 @@ class RecordingCkCanvas extends CkCanvas {
418422
}
419423

420424
@override
421-
void drawShadow(CkPath path, ui.Color color, double elevation,
422-
bool transparentOccluder) {
425+
void drawShadow(
426+
CkPath path, ui.Color color, double elevation, bool transparentOccluder) {
423427
super.drawShadow(path, color, elevation, transparentOccluder);
424-
_addCommand(CkDrawShadowCommand(path, color, elevation, transparentOccluder));
428+
_addCommand(
429+
CkDrawShadowCommand(path, color, elevation, transparentOccluder));
425430
}
426431

427432
@override
@@ -627,7 +632,7 @@ class CkTransformCommand extends CkPaintCommand {
627632
@override
628633
void apply(SkCanvas canvas) {
629634
canvas.concat(toSkMatrixFromFloat32(matrix4));
630-
}
635+
}
631636
}
632637

633638
class CkSkewCommand extends CkPaintCommand {
@@ -660,7 +665,8 @@ class CkClipRectCommand extends CkPaintCommand {
660665
}
661666

662667
class CkDrawArcCommand extends CkPaintCommand {
663-
CkDrawArcCommand(this.oval, this.startAngle, this.sweepAngle, this.useCenter, this.paint);
668+
CkDrawArcCommand(
669+
this.oval, this.startAngle, this.sweepAngle, this.useCenter, this.paint);
664670

665671
final ui.Rect oval;
666672
final double startAngle;
@@ -682,7 +688,8 @@ class CkDrawArcCommand extends CkPaintCommand {
682688
}
683689

684690
class CkDrawAtlasCommand extends CkPaintCommand {
685-
CkDrawAtlasCommand(this.paint, this.atlas, this.rstTransforms, this.rects, this.colors, this.blendMode);
691+
CkDrawAtlasCommand(this.paint, this.atlas, this.rstTransforms, this.rects,
692+
this.colors, this.blendMode);
686693

687694
final CkPaint paint;
688695
final CkImage atlas;
@@ -807,7 +814,8 @@ class CkDrawPointsCommand extends CkPaintCommand {
807814
void apply(SkCanvas canvas) {
808815
canvas.drawPoints(
809816
toSkPointMode(pointMode),
810-
points,
817+
// TODO(hterkelsen): Don't convert this to 2d after we move to CK 0.21.
818+
rawPointsToSkPoints2d(points),
811819
paint.skiaObject,
812820
);
813821
}
@@ -924,7 +932,7 @@ class CkDrawImageCommand extends CkPaintCommand {
924932
final CkPaint paint;
925933

926934
CkDrawImageCommand(CkImage image, this.offset, this.paint)
927-
: this.image = image.clone();
935+
: this.image = image.clone();
928936

929937
@override
930938
void apply(SkCanvas canvas) {
@@ -949,7 +957,7 @@ class CkDrawImageRectCommand extends CkPaintCommand {
949957
final CkPaint paint;
950958

951959
CkDrawImageRectCommand(CkImage image, this.src, this.dst, this.paint)
952-
: this.image = image.clone();
960+
: this.image = image.clone();
953961

954962
@override
955963
void apply(SkCanvas canvas) {
@@ -970,7 +978,7 @@ class CkDrawImageRectCommand extends CkPaintCommand {
970978

971979
class CkDrawImageNineCommand extends CkPaintCommand {
972980
CkDrawImageNineCommand(CkImage image, this.center, this.dst, this.paint)
973-
: this.image = image.clone();
981+
: this.image = image.clone();
974982

975983
final CkImage image;
976984
final ui.Rect center;
@@ -1061,7 +1069,8 @@ class CkSaveLayerWithFilterCommand extends CkPaintCommand {
10611069

10621070
@override
10631071
void apply(SkCanvas canvas) {
1064-
final _CkManagedSkImageFilterConvertible convertible = filter as _CkManagedSkImageFilterConvertible;
1072+
final _CkManagedSkImageFilterConvertible convertible =
1073+
filter as _CkManagedSkImageFilterConvertible;
10651074
return canvas.saveLayer(
10661075
null,
10671076
toSkRect(bounds),

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

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class CanvasKit {
4949
external SkMaskFilterNamespace get MaskFilter;
5050
external SkColorFilterNamespace get ColorFilter;
5151
external SkImageFilterNamespace get ImageFilter;
52-
external SkPath MakePathFromOp(SkPath path1, SkPath path2, SkPathOp pathOp);
52+
external SkPathNamespace get Path;
5353
external SkTonalColors computeTonalColors(SkTonalColors inTonalColors);
5454
external SkVertices MakeVertices(
5555
SkVertexMode mode,
@@ -96,10 +96,6 @@ class CanvasKit {
9696
external SkSurface MakeSWCanvasSurface(html.CanvasElement canvas);
9797
external void setCurrentContext(int glContext);
9898

99-
/// Creates an [SkPath] using commands obtained from [SkPath.toCmds].
100-
// TODO(yjbanov): switch to CanvasKit.Path.MakeFromCmds when it's available.
101-
external SkPath MakePathFromCmds(List<dynamic> pathCommands);
102-
10399
/// Creates an image from decoded pixels represented as a list of bytes.
104100
///
105101
/// The pixel data must match the [width], [height], [alphaType], [colorType],
@@ -723,7 +719,7 @@ class SkImage {
723719
SkTileMode tileModeY,
724720
Float32List? matrix, // 3x3 matrix
725721
);
726-
external Uint8List readPixels(SkImageInfo imageInfo, int srcX, int srcY);
722+
external Uint8List readPixels(int srcX, int srcY, SkImageInfo imageInfo);
727723
external SkData encodeToData();
728724
external bool isAliasOf(SkImage other);
729725
external bool isDeleted();
@@ -783,7 +779,7 @@ class SkShader {
783779
@JS()
784780
class SkMaskFilterNamespace {
785781
external SkMaskFilter MakeBlur(
786-
SkBlurStyle blurStyle, double sigma, bool respectCTM);
782+
SkBlurStyle blurStyle, double sigma, bool respectCTM);
787783
}
788784

789785
// This needs to be bound to top-level because SkPaint is initialized
@@ -864,6 +860,14 @@ class SkImageFilter {
864860
external void delete();
865861
}
866862

863+
@JS()
864+
class SkPathNamespace {
865+
external SkPath MakeFromOp(SkPath path1, SkPath path2, SkPathOp pathOp);
866+
867+
/// Creates an [SkPath] using commands obtained from [SkPath.toCmds].
868+
external SkPath MakeFromCmds(List<dynamic> pathCommands);
869+
}
870+
867871
// Mappings from SkMatrix-index to input-index.
868872
const List<int> _skMatrixIndexToMatrix4Index = <int>[
869873
0, 4, 12, // Row 1
@@ -1183,7 +1187,8 @@ class SkPath {
11831187

11841188
/// Serializes the path into a list of commands.
11851189
///
1186-
/// The list can be used to create a new [SkPath] using [CanvasKit.MakePathFromCmds].
1190+
/// The list can be used to create a new [SkPath] using
1191+
/// [CanvasKit.Path.MakeFromCmds].
11871192
external List<dynamic> toCmds();
11881193

11891194
external void delete();
@@ -1404,7 +1409,7 @@ class SkCanvas {
14041409
);
14051410
external void drawPoints(
14061411
SkPointMode pointMode,
1407-
Float32List points,
1412+
List<Float32List> points,
14081413
SkPaint paint,
14091414
);
14101415
external void drawRRect(
@@ -1786,7 +1791,8 @@ abstract class Collector {
17861791
/// Uses timers to delete objects in batches and outside the animation frame.
17871792
class ProductionCollector implements Collector {
17881793
ProductionCollector() {
1789-
_skObjectFinalizationRegistry = SkObjectFinalizationRegistry(js.allowInterop((SkDeletable deletable) {
1794+
_skObjectFinalizationRegistry =
1795+
SkObjectFinalizationRegistry(js.allowInterop((SkDeletable deletable) {
17901796
// This is called when GC decides to collect the wrapper object and
17911797
// notify us, which may happen after the object is already deleted
17921798
// explicitly, e.g. when its ref count drops to zero. When that happens
@@ -1967,7 +1973,8 @@ bool browserSupportsFinalizationRegistry =
19671973

19681974
/// Sets the value of [browserSupportsFinalizationRegistry] to its true value.
19691975
void debugResetBrowserSupportsFinalizationRegistry() {
1970-
browserSupportsFinalizationRegistry = _finalizationRegistryConstructor != null;
1976+
browserSupportsFinalizationRegistry =
1977+
_finalizationRegistryConstructor != null;
19711978
}
19721979

19731980
@JS()

0 commit comments

Comments
 (0)