Skip to content

[web] Unify font collections between CanvasKit and Skwasm - #195539

Merged
auto-submit[bot] merged 8 commits into
flutter:masterfrom
mdebbar:migrate-font-renderer-primitives
Nov 3, 2026
Merged

auto-submit[bot] merged 8 commits into
flutter:masterfrom
mdebbar:migrate-font-renderer-primitives

Conversation

@mdebbar

@mdebbar mdebbar commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Part of #175630
Fixes #194215

This moves font handling to the same Engine* -> Backend* layering that Paragraph, Path, Shader and ImageFilter already use. EngineFontCollection (shared by both renderers) now owns everything that used to be duplicated between SkiaFontCollection and SkwasmFontCollection: downloading asset fonts, the implicit Roboto default, the registered font bookkeeping, the fallback font registry and the FontFallbackManager.

CkFontCollection and SkwasmFontCollection only implement BackendFontCollection: parse bytes into a BackendTypeface, register a typeface under a family name, receive the fallback family list, and clear. CkTypeface/SkwasmTypeface implement BackendTypeface and expose the typeface's family name, which is what loadFontFromBytes uses when no family is given. Skwasm gets a new typeface_getFamilyName export for that.

SkiaFontCollection, SkiaFallbackRegistry, SkwasmFallbackRegistry and the CanvasKit-only skia_font_collection_test.dart are gone; the shared font_collection_test.dart covers the same cases for both renderers.

Behavior differences worth calling out:

  • CanvasKit clear() now actually unregisters fonts (it was a no-op before).
  • CanvasKit no longer rebuilds the whole TypefaceFontProvider on every registration; it registers incrementally and recreates the skparagraph FontCollection lazily, same as Skwasm's clearCaches.
  • Skwasm now prints the same warnings as CanvasKit for missing/invalid fonts, and no longer mutates the caller's FontManifest.
  • Registration order is deterministic (manifest order) on both renderers.
  • SkwasmFontCollection.createTypeface checks for a null typeface before wrapping it, so an invalid font no longer disposes a null handle.

@github-actions github-actions Bot added a: text input Entering text in a text field or keyboard related problems engine flutter/engine related. See also e: labels. platform-web Web applications specifically team-web Owned by Web platform team labels Oct 28, 2026
@mdebbar
mdebbar marked this pull request as ready for review November 2, 2026 17:42
@mdebbar mdebbar added the CICD Run CI/CD label Nov 2, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a unified BackendFontCollection interface to standardize font management across the CanvasKit and Skwasm backends. It refactors the existing font collection logic into a shared EngineFontCollection class, updates the renderer to use this new architecture, and adds necessary native API bindings for retrieving font family names. The review comments identify potential resource leaks when handling native typefaces and suggest using try-finally blocks to ensure proper disposal of native resources.

@harryterkelsen

harryterkelsen commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

@mdebbar since this removes SkwasmFontCollection.registeredTypefaces entirely (and EngineFontCollection._register disposes each BackendTypeface right after registration), it also fixes #194215, where clear() recreated the native collection but kept the old SkwasmTypeface wrappers alive in that map. Could you add Fixes #194215 to the PR description so the issue gets closed when this lands?

@harryterkelsen harryterkelsen added autosubmit Merge PR when tree becomes green via auto submit App and removed autosubmit Merge PR when tree becomes green via auto submit App labels Nov 2, 2026
@mdebbar mdebbar added the autosubmit Merge PR when tree becomes green via auto submit App label Nov 2, 2026
@auto-submit
auto-submit Bot added this pull request to the merge queue Nov 3, 2026
Merged via the queue into flutter:master with commit b3df20c Nov 3, 2026
29 checks passed
@flutter-dashboard flutter-dashboard Bot removed the autosubmit Merge PR when tree becomes green via auto submit App label Nov 3, 2026
auto-submit Bot pushed a commit to flutter/packages that referenced this pull request Nov 3, 2026
Roll Flutter from fcfb4f203eae to 934720261be0 (38 revisions)

flutter/flutter@fcfb4f2...9347202

2026-11-03 [email protected] Roll Skia from 5bceaa033999 to c733ad3e37cb (5 revisions) (flutter/flutter#195872)
2026-11-03 [email protected] Roll Skia from 34d2bf479385 to 5bceaa033999 (9 revisions) (flutter/flutter#195864)
2026-11-03 [email protected] fix: prefer pointer events over semantics tap for mouse clicks on web (flutter/flutter#191529)
2026-11-03 [email protected] [VPAT] Expose a semantics text field value while it is not being edited (flutter/flutter#195445)
2026-11-03 [email protected] [Impeller] Make a GL context current before constructing an AiksContext without a surface (flutter/flutter#195629)
2026-11-03 [email protected] [flutter_tools] Eliminate globals.dart from project.dart (flutter/flutter#194066)
2026-11-03 [email protected] [tool] Complete context runner elimination and migrate AppContext usages to ToolContext (flutter/flutter#190797)
2026-11-03 [email protected] [web] Unify font collections between CanvasKit and Skwasm (flutter/flutter#195539)
2026-11-03 [email protected] [Android] Replay predictive back state for retained engines (flutter/flutter#192286)
2026-11-03 [email protected] [vulkan]: Adds depth/stencil synchronization for subpasses (flutter/flutter#195689)
2026-11-03 [email protected] [web] Honor requested upscaling in instantiateImageCodecWithSize and ImageDescriptor.instantiateCodec (flutter/flutter#195836)
2026-11-03 [email protected] Roll Skia from 866b61ca92c9 to 34d2bf479385 (9 revisions) (flutter/flutter#195848)
2026-11-03 [email protected] Roll Fuchsia Test Scripts from xl1LWBuppzu-BnOzV... to B6zarykZp6PKWRueg... (flutter/flutter#195847)
2026-11-03 [email protected] Remove unused ffi (flutter/flutter#195710)
2026-11-02 [email protected] Revert: [Android] Let the raster thread use every core of a chip without little cores (flutter/flutter#195838)
2026-11-02 [email protected] Run 10 impeller iOS benchmarks as one devicelab task (flutter/flutter#195661)
2026-11-02 [email protected] Use named uniforms instead of setFloat in StretchEffect (flutter/flutter#195372)
2026-11-02 [email protected] [flutter_tools] Report when the browser disconnects during a web test run (flutter/flutter#192198)
2026-11-02 [email protected] fix: Resolve memory leak in image_list example (flutter/flutter#189526)
2026-11-02 [email protected] Only run the common local engine configurations in presubmit (flutter/flutter#195688)
2026-11-02 [email protected] Update gcloud_version to version [email protected] (flutter/flutter#195769)
2026-11-02 [email protected] [Impeller] Order the Vulkan copy-texture-to-texture layout transition after the copy (flutter/flutter#195814)
2026-11-02 [email protected] [Impeller] Order the Vulkan ResizeTexture layout transition after its blit (flutter/flutter#195721)
2026-11-02 [email protected] [web] Fix CanvasKit fragment shader uniforms being freed or mutated after recording (flutter/flutter#195718)
2026-11-02 [email protected] Roll Fuchsia Linux SDK from MqypI6RNyVZ_FLUE-... to T_-6-6X1lDMghhAvX... (flutter/flutter#195809)
2026-11-02 [email protected] [Android] Log why Impeller falls back to OpenGLES (flutter/flutter#194764)
2026-11-02 [email protected] Roll Skia from 3f35fb6e591b to 866b61ca92c9 (11 revisions) (flutter/flutter#195802)
2026-11-02 [email protected] Roll Skia from 3f35fb6e591b to 866b61ca92c9 (11 revisions) (flutter/flutter#195802)
2026-11-02 [email protected] Only run the common local engine configurations in presubmit (flutter/flutter#195688)
2026-11-02 [email protected] Balance tool_integration_tests subshards by expected duration (flutter/flutter#195628)
2026-11-02 [email protected] [web_paragraph] Map code units without a cluster to a cluster (flutter/flutter#195384)
2026-11-02 [email protected] [web] Hide synthetic autofill inputs from assistive technology (flutter/flutter#195618)
2026-11-02 [email protected] Roll Packages from 3742a4e to 3f34a6f (8 revisions) (flutter/flutter#195795)
2026-11-02 [email protected] [web] Unskip web tests that pass on CanvasKit and Skwasm: platform_view_test, route_notification_messages_test (flutter/flutter#195605)
2026-11-02 [email protected] Roll Skia from e5ad3868b8db to 3f35fb6e591b (1 revision) (flutter/flutter#195789)
2026-11-02 [email protected] Roll Skia from f5215e74aa16 to e5ad3868b8db (3 revisions) (flutter/flutter#195779)
2026-11-02 [email protected] Roll Skia from e43478a2f9f8 to f5215e74aa16 (1 revision) (flutter/flutter#195776)
2026-11-01 [email protected] Roll Fuchsia Linux SDK from kW0A0xxNkqf38ljm4... to MqypI6RNyVZ_FLUE-... (flutter/flutter#195768)

If this roll has caused a breakage, revert this CL and set the roller
to dry run mode using the controls here:
https://autoroll.skia.org/r/flutter-packages
Please CC [email protected],[email protected] on the revert to ensure that a human
is aware of the problem.

To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a: text input Entering text in a text field or keyboard related problems CICD Run CI/CD engine flutter/engine related. See also e: labels. platform-web Web applications specifically team-web Owned by Web platform team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[web] SkwasmFontCollection.clear retains registered typeface references

2 participants