Revert "Revert "[canvaskit] Use FontCollection API from CanvasKit to mitigate caching issues (#40673)" (#40705)" (#40740)
Reland "[canvaskit] Use FontCollection API from CanvasKit to mitigate caching issues"
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 125c42c..6d70ee2 100644
--- a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
+++ b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
@@ -153,6 +153,7 @@
external SkFontMgrNamespace get FontMgr;
external TypefaceFontProviderNamespace get TypefaceFontProvider;
+ external FontCollectionNamespace get FontCollection;
external SkTypefaceFactory get Typeface;
@JS('GetWebGLContext')
@@ -2603,9 +2604,9 @@
class SkParagraphBuilderNamespace {}
extension SkParagraphBuilderNamespaceExtension on SkParagraphBuilderNamespace {
- external SkParagraphBuilder MakeFromFontProvider(
+ external SkParagraphBuilder MakeFromFontCollection(
SkParagraphStyle paragraphStyle,
- TypefaceFontProvider? fontManager,
+ SkFontCollection? fontCollection,
);
bool RequiresClientICU() {
@@ -3074,7 +3075,6 @@
@JS('window.flutterCanvasKit.TypefaceFontProvider')
@staticInterop
class TypefaceFontProvider extends SkFontMgr {
- external factory TypefaceFontProvider();
}
extension TypefaceFontProviderExtension on TypefaceFontProvider {
@@ -3087,6 +3087,17 @@
@JS()
@anonymous
@staticInterop
+class SkFontCollection {}
+
+extension SkFontCollectionExtension on SkFontCollection {
+ external void enableFontFallback();
+ external void setDefaultFontManager(TypefaceFontProvider? fontManager);
+ external void delete();
+}
+
+@JS()
+@anonymous
+@staticInterop
class SkLineMetrics {}
extension SkLineMetricsExtension on SkLineMetrics {
@@ -3320,6 +3331,14 @@
}
@JS()
+@staticInterop
+class FontCollectionNamespace{}
+
+extension FontCollectionNamespaceExtension on FontCollectionNamespace {
+ external SkFontCollection Make();
+}
+
+@JS()
@anonymous
@staticInterop
class SkTypefaceFactory {}
diff --git a/lib/web_ui/lib/src/engine/canvaskit/fonts.dart b/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
index cc3acca..86c5ab5 100644
--- a/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
+++ b/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
@@ -48,15 +48,20 @@
final Map<String, List<SkFont>> familyToFontMap = <String, List<SkFont>>{};
void _registerWithFontProvider() {
- if (fontProvider != null) {
- fontProvider!.delete();
- fontProvider = null;
+ if (_fontProvider != null) {
+ _fontProvider!.delete();
+ _fontProvider = null;
+ skFontCollection?.delete();
+ skFontCollection = null;
}
- fontProvider = canvasKit.TypefaceFontProvider.Make();
+ _fontProvider = canvasKit.TypefaceFontProvider.Make();
+ skFontCollection = canvasKit.FontCollection.Make();
+ skFontCollection!.enableFontFallback();
+ skFontCollection!.setDefaultFontManager(_fontProvider);
familyToFontMap.clear();
for (final RegisteredFont font in _registeredFonts) {
- fontProvider!.registerFont(font.bytes, font.family);
+ _fontProvider!.registerFont(font.bytes, font.family);
familyToFontMap
.putIfAbsent(font.family, () => <SkFont>[])
.add(SkFont(font.typeface));
@@ -64,7 +69,7 @@
for (final RegisteredFont font
in FontFallbackData.instance.registeredFallbackFonts) {
- fontProvider!.registerFont(font.bytes, font.family);
+ _fontProvider!.registerFont(font.bytes, font.family);
familyToFontMap
.putIfAbsent(font.family, () => <SkFont>[])
.add(SkFont(font.typeface));
@@ -230,7 +235,8 @@
return actualFamily;
}
- TypefaceFontProvider? fontProvider;
+ TypefaceFontProvider? _fontProvider;
+ SkFontCollection? skFontCollection;
@override
void clear() {}
diff --git a/lib/web_ui/lib/src/engine/canvaskit/text.dart b/lib/web_ui/lib/src/engine/canvaskit/text.dart
index 94a5544..4c47223 100644
--- a/lib/web_ui/lib/src/engine/canvaskit/text.dart
+++ b/lib/web_ui/lib/src/engine/canvaskit/text.dart
@@ -880,9 +880,9 @@
_placeholderCount = 0,
_placeholderScales = <double>[],
_styleStack = <CkTextStyle>[],
- _paragraphBuilder = canvasKit.ParagraphBuilder.MakeFromFontProvider(
+ _paragraphBuilder = canvasKit.ParagraphBuilder.MakeFromFontCollection(
style.skParagraphStyle,
- CanvasKitRenderer.instance.fontCollection.fontProvider,
+ CanvasKitRenderer.instance.fontCollection.skFontCollection,
) {
_styleStack.add(_style.getTextStyle());
}
diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart
index 0861290..6920f5e 100644
--- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart
+++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart
@@ -1591,9 +1591,9 @@
..forceStrutHeight = false;
final SkParagraphStyle paragraphStyle = canvasKit.ParagraphStyle(props);
- final SkParagraphBuilder builder = canvasKit.ParagraphBuilder.MakeFromFontProvider(
+ final SkParagraphBuilder builder = canvasKit.ParagraphBuilder.MakeFromFontCollection(
paragraphStyle,
- CanvasKitRenderer.instance.fontCollection.fontProvider,
+ CanvasKitRenderer.instance.fontCollection.skFontCollection,
);
builder.addText('Hello');
@@ -1737,9 +1737,9 @@
..fontStyle = (SkFontStyle()..weight = canvasKit.FontWeight.Normal);
final SkParagraphStyle paragraphStyle = canvasKit.ParagraphStyle(props);
final SkParagraphBuilder builder =
- canvasKit.ParagraphBuilder.MakeFromFontProvider(
+ canvasKit.ParagraphBuilder.MakeFromFontCollection(
paragraphStyle,
- CanvasKitRenderer.instance.fontCollection.fontProvider,
+ CanvasKitRenderer.instance.fontCollection.skFontCollection,
);
builder.addText('hello');