linebender / parley

Rich text layout library
Apache License 2.0
157 stars 18 forks source link

Building for WebAssembly #70

Open waywardmonkeys opened 1 month ago

waywardmonkeys commented 1 month ago

Building for WebAssembly targets with default features (read: system) is broken as there isn't an implementation for WebAssembly.

xorgy commented 1 month ago

system is the main point of fontique, so it being default makes sense, but that leads to the issue you describe. There is also the issue of how to make a useful collection at all in WebAssembly, which I think would probably involve a considerable amount of support from the JavaScript side, or inlining a font into the wasm module (not necessarily the greatest solution either).

waywardmonkeys commented 4 weeks ago

There is https://developer.mozilla.org/en-US/docs/Web/API/Local_Font_Access_API (only currently supported in Chrome and Edge 103 and later, but not Chrome for Android) ... but that would require having async APIs for WebAssembly.

xorgy commented 4 weeks ago

Well, may not require async APIs for wasm, but rather that the loader take care of that stuff before starting the module (or that calls for the system fonts involve waiting). I was not aware that the Local Fonts API had rolled out to any stable browsers!

xorgy commented 4 weeks ago

Looking into this, apparently it gives you the font data as Blob, which unfortunately can not be mapped zero-copy into wasm memory (at least, not explicitly); so probably the useful way to implement this would be some sort of limited font library selected by the host and copied into the wasm memory.

xorgy commented 4 weeks ago

Looking into it further, the Local Font Access API has to prompt for permission in a browser, and the message used is something about ‘creating high fidelity content’. If you're building something other than a graphics editor or a tech demo, then presumably a lot of people will click block on this and break your app.

torokati44 commented 3 weeks ago

FWIW: Aside from Chrome, the promise of this working well in either Firefox or Safari is not particularly rosy: https://github.com/mozilla/standards-positions/issues/401#issuecomment-2139560235