У меня странная проблема при рисовании строк с некоторыми конкретными шрифтами истинного типа в 32-битной Java в Windows 10.
Начиная с Java 7u13, всякий раз, когда символ / глиф шрифта шире, чем в 4 раза больше его высоты, он вообще не отображается с использованием Graphics2D.drawString (например, глиф шириной 4001em с базовым размером шрифта 1000em):
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setFont(new Font("myFontWithWideGlyphForX", Font.PLAIN, 12));
g2.drawString("XXXX", 10, 10);
}
Однако шрифт отображается правильно на JLabel, поэтому после некоторого исследования базового кода Swing я понял, что установка подсказки рендеринга KEY_TEXT_ANTIALIASING на VALUE_TEXT_ANTIALIAS_LCD_HRGB обеспечивает правильную визуализацию текста:
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
g2.setFont(new Font("myFontWithWideGlyphForX", Font.PLAIN, 12));
g2.drawString("XXXX", 10, 10);
}
Кажется, что алгоритм рендеринга работает по-другому после установки субпиксельного atialiasig и правильно отображает шрифт.
Если я переключусь на Java 7u11 или более раннюю версию, текст будет отображаться без проблем и без установки VALUE_TEXT_ANTIALIAS_LCD_HRGB.
То же самое происходит с любым другим шрифтом с такими широкими глифами - например, этот случайный шрифт имеет такой широкий глиф для символа "J": http://www.fontspace.com/digital-magic/hdgems5 - он нормально обрабатывает с Java 7u11, но не отображает вообще с чем-либо новее.
Установка субпиксельного сглаживания VALUE_TEXT_ANTIALIAS_LCD_HRGB только для рендеринга шрифта кажется хакерской, уродливой и не всегда возможной (например, при использовании сторонних библиотек). Кто-нибудь знает, в чем причина того, что awt не отображает такие символы с 7u13? Такой шрифт просто не поддерживается? А может это ошибка?