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

Reply via email to