[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-openjfx-dev
Subject:    Re: RFR: 8234916: [macos 10.15] Garbled text running with native-image
From:       Kevin Rushforth <kcr () openjdk ! java ! net>
Date:       2019-11-27 19:51:38
Message-ID: wT8lpRGn7EvfCBa4aXWUGWaGAETYMlyEWJ642HE7R9o=.814310d1-08cd-4cfa-bf59-a7a8f3220e59 () github ! com
[Download RAW message or body]

On Wed, 27 Nov 2019 17:06:13 GMT, Jose Pereda <jpereda@openjdk.org> wrote:

> 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

This seems simple enough that one reviewer should be sufficient (unless Phil thinks \
otherwise).

PR: https://git.openjdk.java.net/jfx/pull/55


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic