OpenJDK 11 Swing проблема рендеринга моноширинного шрифта в macOS Retina, несмотря на отключение дробной ширины

Я пытаюсь исправить проблему с разрабатываемым мной редактором кода, который появляется только при использовании OpenJDK 11 на Mac с дисплеем Retina. Следующие снимки экрана иллюстрируют проблему. Сверху - OpenJDK 11 (AdoptOpenJDK 11.0.5 HotSpot), внизу - JDK 8 (я считаю, Apple/Oracle JDK 8):

Как видите, OpenJDK 11 делает шрифт шире. Это большая проблема, потому что я используюFontRenderContext#getStringBoundsдля определения ширины моноширинной колонны. Сообщается, что с моноширинным шрифтом по умолчанию (выглядит как Menlo) и размером шрифта 14 на 8 пикселей на символ, что правильно соответствует рендерингу JDK 8, но не рендерингу OpenJDK 11. Что еще хуже, кажется, что в последнем случае мы получаем не целое число пикселей, а 8,5 пикселей (первая строка без комментариев содержит 38 символов, она занимает 38 * 8 * 2 = 608 пикселей на JDK 8, но около 646 пикселей в OpenJDK 11.

Что еще более странно, так это то, что эта проблема вызвана рендерингомAttributedTextэкземпляры, использующиеGraphics2D#drawString. Если я конвертирую в обычный текст, используйтеg.setFont, OpenJDK 11 отображает точно так же, как JDK 8. Таким образом, это должно иметь отношение к конкретной реализации визуализации. AttributedCharacterIterator.

Очевидно, я не изменяю всю свою реализацию из-за этой ошибки, поэтому я ищу обходной путь (кроме, конечно, просьбы пользователя выбрать другой шрифт). Может, есть какие-то системные свойства...?


Изменить: после некоторого дальнейшего сеанса отладки я вижу, что разница возникает изExtendedTextSourceLabel#createGV и глубже SunLayoutEngine#layout который затем вызывает собственный код, где, несмотря на то же описание вычеркивания шрифта, в JDK 8 _positions в данных глифа заданы целые числа, тогда как в OpenJDK 11 они установлены в виде дробных чисел (а также фактически не умножаются на 0.5, поэтому похоже, что это не имеет ничего общего с тем фактом, что мы работаем на дисплее Retina; возможно, этот шрифт поддерживается собственным шрифтом macOS)

1 ответ

Это показывает, что это зависит от размера шрифта, а не от того, является ли шрифт "родным" или встроенным:

Это с Inconsolata.ttf на пути к классам, с размером шрифта 32. Для сравнения, размер шрифта 33:

Здесь сообщенное улучшение шрифта на основе FontRenderContext#getStringBounds, составляет 17,0 - визуализируется серыми прямоугольниками - но фактическая визуализация немного более узкая.

Другие вопросы по тегам