RFR: 8234916: [macos 10.15] Garbled text running with native-image
Jose Pereda
jpereda at openjdk.java.net
Wed Nov 27 17:06:13 UTC 2019
Running on MacOS Catalina, when doing static builds of `libjavafx_font.a` and linking against this in a JavaFX app compiled with GraalVM native-image, if default fonts are used, the rendered text is garbled, and a warning message is printed:
CoreText note: Client requested name ".SFUI-Regular", it will get TimesNewRomanPSMT rather than the intended font. All system UI font access should be through proper APIs such as CTFontCreateUIFontForLanguage() or +[UIFont systemFontOfSize:].
CoreText note: Set a breakpoint on CTFontLogSystemFontNameRequest to debug.
On Mac OS, when a map with all the regular fonts is created, we also add two system fonts: [System regular](https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/native-font/MacFontFinder.c#L178), and [System bold](https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/native-font/MacFontFinder.c#L187). These will be the default fonts to be used if the project doesn't specify a font.
On runtime, when a font is [created](https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/java/com/sun/javafx/font/coretext/CTFontStrike.java#L90), `CTFontCreateWithName` is [used](https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/native-font/coretext.c#L391), which according to Apple guidelines should be used only for the regular fonts (those that are not system fonts). In fact the above warning doesn't happen when creating any of those fonts.
Following the warning message, one of the options to create system fonts is to use `CTFontCreateUIFontForLanguage`, which according to the documentation in `CTFont.h`:
> Returns the special UI font for the given language and UI type.
and matches what we already do in `MacFontFinder` to create such fonts. (The other option will require the use of UIKit.)
This PR modifies `CTFontCreateWithName` in `coretext.c` to detect if the font is a system font in the first place, else use the same existing mechanism.
As an aside, the constants `kCTFontSystemFontType` and `kCTFontEmphasizedSystemFontType` are deprecated, and this PR uses now the new ones, but in both cases their int value is the same (2 and 3, in that order). As a follow-up PR, we could replace these deprecated constants.
----------------
Commits:
- 693dfa78: Use CTFontCreateUIFontForLanguage for system fonts
Changes: https://git.openjdk.java.net/jfx/pull/55/files
Webrev: https://webrevs.openjdk.java.net/jfx/55/webrev.00
Issue: https://bugs.openjdk.java.net/browse/JDK-8234916
Stats: 9 lines in 1 file changed: 8 ins; 0 del; 1 mod
Patch: https://git.openjdk.java.net/jfx/pull/55.diff
Fetch: git fetch https://git.openjdk.java.net/jfx pull/55/head:pull/55
PR: https://git.openjdk.java.net/jfx/pull/55
More information about the openjfx-dev
mailing list