On Tue, 7 Feb 2023 17:20:19 GMT, Alexander Scherbatiy <alex...@openjdk.org> wrote:
>> [JDK-8278549](https://bugs.openjdk.org/browse/JDK-8278549)` UNIX sun/font >> coding misses SUSE distro detection on recent distro SUSE 15` adds SuSE >> detection by checking SLES os name property in `/etc/os-release` file. >> >> `opensuse/leap:15.4` docker defines os name property as `"openSUSE Leap"` in >> `/etc/os-release` file which is not recognized as SuSE. >> >> The issue is reproduced with Oracle jdk-19.0.2 with custom >> fontconfig.SuSE.properties file copied to jdk-19.0.2/lib directory. >> >> The fix checks if os name property from `/etc/os-release` contains `SUSE` >> substring. >> >> Steps to reproduce. >> - Download Oracle jdk-19.0.2 >> - Copy custom >> [fontconfig.SuSE.properties](https://bugs.openjdk.org/secure/attachment/102435/fontconfig.SuSE.properties) >> file to jdk-19.0.2/lib directory. >> - Run the `opensuse/leap:15.4` docker and install freetype and dejavu fonts >> (do not install fontconfig) >> >> docker run --rm --security-opt seccomp=unconfined -it opensuse/leap:15.4 bash >> zypper install -y dejavu-fonts >> zypper install -y freetype2 >> >> - Run HelloImage java sample in the docker >> >> import javax.imageio.ImageIO; >> import java.awt.*; >> import java.awt.image.BufferedImage; >> import java.io.File; >> >> public class HelloImage { >> >> public static void main(String[] args) throws Exception { >> >> BufferedImage buff = new BufferedImage(300, 200, >> BufferedImage.TYPE_INT_RGB); >> Graphics2D g = buff.createGraphics(); >> g.setColor(Color.WHITE); >> g.fillRect(0, 0, buff.getWidth(), buff.getHeight()); >> >> g.setColor(Color.BLUE); >> g.setFont(g.getFont().deriveFont(32f)); >> g.drawString("Hello, Image!", 50, 50); >> g.dispose(); >> >> File file = new File("hello-image.png"); >> ImageIO.write(buff, "png", file); >> } >> } >> >> >> >> ./jdk-19.0.2/bin/javac HelloImage.java >> ./jdk-19.0.2/bin/java HelloImage >> Exception in thread "main" java.lang.NullPointerException: Cannot load from >> short array because "sun.awt.FontConfiguration.head" is null >> at >> java.desktop/sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1261) >> at >> java.desktop/sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:221) >> at >> java.desktop/sun.awt.FontConfiguration.init(FontConfiguration.java:105) >> at >> java.desktop/sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:706) >> at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:352) >> at java.desktop/sun.font.SunFontManager$2.run(SunFontManager.java:309) >> at >> java.base/java.security.AccessController.doPrivileged(AccessController.java:318) >> at java.desktop/sun.font.SunFontManager.<init>(SunFontManager.java:309) >> at java.desktop/sun.awt.FcFontManager.<init>(FcFontManager.java:35) >> at java.desktop/sun.awt.X11FontManager.<init>(X11FontManager.java:56) >> at >> java.desktop/sun.font.PlatformFontInfo.createFontManager(PlatformFontInfo.java:37) >> at >> java.desktop/sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:51) >> at java.desktop/java.awt.Font.getFont2D(Font.java:526) >> at java.desktop/java.awt.Font$FontAccessImpl.getFont2D(Font.java:265) >> at java.desktop/sun.font.FontUtilities.getFont2D(FontUtilities.java:151) >> at >> java.desktop/sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:671) >> at >> java.desktop/sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:837) >> at >> java.desktop/sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:46) >> at >> java.desktop/sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2931) >> at HelloImage.main(HelloImage.java:17) > > Alexander Scherbatiy has updated the pull request incrementally with one > additional commit since the last revision: > > Extract os name as ID from /etc/os-release file for fonts configuration Marked as reviewed by prr (Reviewer). If I read the code right, what you have now is good enough. If the code really is duplicated 100% - just with different orders - then unifying seems like a good thing. Up to you if you do it. For the ordering I would need to research to be sure, but I'd be inclined towards the order in MFontConfiguration unless research shows that the names like fedora-release are going out of fashion and everyone is using lsb-release these days. If they are then I'd move that to the front .. More logging is also fine. A mapping file is something I'd leave until there's a demonstrated need for more than the suse family ------------- PR: https://git.openjdk.org/jdk/pull/12260