Как заставить Red Hat OpenJDK 8 отображать шрифты так же ясно, как AdoptOpenJDK и Oracle JDK в Windows? - PullRequest
2 голосов
/ 19 апреля 2019

Наши пользователи запускают наше приложение Java GUI на своих рабочих столах Windows, и мы планируем перейти с Oracle Java 8 на OpenJDK 8. Но мы обнаружили, что различные сборки OpenJDK несовместимы по качеству рендеринга шрифтов с Oracle и AdoptOpenJDK эквивалентны, но Red Hat остро не хватает.

На следующем снимке экрана показана простая программа Java AWT / Swing для Windows на трех разных JDK:

  • Oracle 1.8.0_201-b26
  • AdoptOpenJDK 1.8.0_202-b08
  • Red Hat 1.8.0_201-2-redhat-b09

Windows Java Default Font on each JDK - Oracle, AdoptOpenJDK, Red Hat

Существует некоторая проблема с рендерингом в Red Hat JDK, поскольку каждый символ искажен.

Программа просто отображает Swing JLabel с указанным в командной строке шрифтом Dialog / bold / 12 (который каждый JDK сопоставляет со шрифтом Arial Windows OS):

    $ cat fontname.groovy
    import javax.swing.*
    import java.awt.Font
    import sun.font.*

    styles=[bold:Font.BOLD,italic:Font.ITALIC,plain:Font.PLAIN]
    SwingUtilities.invokeLater({
     l = new JLabel("${args}: ${System.getProperty('java.runtime.name')} ${System.getProperty('java.runtime.version')}")
     l.setFont(new Font(args[0],styles[args[1]],Integer.valueOf(args[2])))
     f = new JFrame()
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE)
     f.getContentPane().setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10))
     f.getContentPane().add(l)
     f.pack()
     f.setVisible(true)
     logicalFont = l.getGraphics().getFont()
     print(logicalFont)
     physicalFont = FontManagerFactory.getInstance().findFont2D( logicalFont.getName(), 0, FontManager.NO_FALLBACK )
     print(physicalFont)
    })

На дополнительном снимке экрана ниже показан тот же шрифт для 3 PLAF Swing, доступных в этой системе Windows, и показано, что внешний вид Red Hat OpenJDK одинаков для каждого PLAF (задается с помощью параметра системного свойства "-Dswing.defaultlaf ="):

  • Внешний вид по умолчанию (javax.swing.plaf.metal.MetalLookAndFeel)
  • Windows Look and Feel (com.sun.java.swing.plaf.windows.WindowsLookAndFeel)
  • Nimbus Look and Feel (javax.swing.plaf.nimbus.NimbusLookAndFeel)

Windows Java Default Font on multiple Swing PLAFs and JDKs

Кто-нибудь знает, почему в сборке Red Hat OpenJDK шрифты отображаются таким образом, что это так отличается? Возможно, потребуется дополнительная конфигурация JDK или настройка, которая может потребоваться в Red Hat OpenJDK?

Обновление - Обход в ответе Алеккаско (спасибо!) Об установке переменной среды FREETYPE_PROPERTIES исправляет проблему со шрифтом, начиная с версии OpenJDK 1.8.0_201-2-redhat-b09:

Windows Java Default Font with/without FREETYPE_PROPERTIES

1 Ответ

0 голосов
/ 10 мая 2019

Это регрессия в сборке Red Hat, вызванная обновлением FreeType до 2.8 .AdoptOpenJDK jdk8 build использует более старый FreeType 2.5.3 .Это будет исправлено в сборках Red Hat, в то время как старое поведение может быть повторно включено с помощью переменной среды:

FREETYPE_PROPERTIES=truetype:interpreter-version=35
...