воскресенье, 18 ноября 2012 г.

1920x1080 #3

Итак, Java/Swing приложения настроены на использование GTK+ L&F темы, а опции антиалиасинга включены - все равно остаются две проблемы.

Проблема #1: меню и контролы рисуются правильным шрифтом, но с full-хинтингом. В то, что Java под Linux использует неотключаемый full-хинтинг можно удостовериться включив временно такой же хинтинг во всей системе (я все таки предпочитаю slight) - приложения на Java/Swing и родные приложения станут похожи. Как чинить это не совсем понятно. Некоторые предлагают патчить OpenJDK

Проблема #2: В элементах, которые отрисовывает само Java/Swing приложение (например все текстовые редакторы) шрифты отрисовываются в неправильных размерах. Например, мне приходится выставлять в IDEA в качестве моноширийного шрифта шрифт размером 16pt, тогда как в нативных приложениях с этой ролью справляется шрифт размером 10pt. Суть проблемы в том, что под Linux рендерингом занимается сама Java, вычисляя размер в пикселах относительно фиксированного разрешения в 72 DPI. Остается завидовать владельцам маков, где такая проблема решена. Само несоответствие размеров - полбеды, беда в том, что при этом хинтинг работает неправильно и рисунок шрифта кардинально отличается от того, что должно быть. При этом full-хинтинг делает буквы тонкими и ажурными, что терпимо в случае меню и контролов, но вызывает раздражение в моноширийном шрифте текстового редактора.

Некоторые предлагают вырезать из шрифта весь хинтинг. Шрифт действительно становится более мясистым, но при этом возникает куча артефактов, что, конечно, никуда не годится

Я уже приготовился смириться с этим и выставил Lucida Typewriter 16 pt, как наиболее удобоваримый шрифт в моей ситуации, но мне на глаза попалась утилита ttfautohint, которая удаляет встроенный в шрифт хинтинг, заменяя его своим. Попробовал обработать пару шрифтов и вот оно! - желаемая мясистость моноширийного достигнута, причем без каких-либо заметных артефактов.

вторник, 13 ноября 2012 г.

1920x1080 #2

Вдогонку к посту про высокое разрешение

Следующие волшебные опции полностью убирают мусор из хинтинга в Java/Swing приложениях в случаях когда они либо не используют GTK+ тему; либо используют, но у них еще есть текстовый редактор, который отрисовывается не через GTK-библиотеки.

-Dswing.aatext=true
-Dawt.useSystemAAFontSettings=lcd

Приложения, конечно, все равно не выглядят такими же как родные, но при этом выглядят идеально

воскресенье, 11 ноября 2012 г.

1920x1080

Не было печали - на работе подогнали новый ноут. Sony Vaio SVS1511, зверь-машина: 4 ядра, i7-3612QM, RAM 8GB (up to 12GB), SSD 220GB, USB 3.0, матовый 15'' 1920x1080. До этого почти три года сидел на Asus 15'' 1366x768 и десктопах. Соответственно после перехода на новый ноут экранный DPI увеличился почти в полтора раза - спасибо хоть не ретина с ее двухкратным удвоением. Но все равно на экране всё стало очень мелким и работать в таком режиме стало тяжело.

В Unity/Gnome3, как известно, значение DPI больше нельзя выставить вручную так, как это можно было сделать в старом добром Gnome 2. В данный момент там можно выставить только "коэффициент увеличения шрифта" и то, только после дополнительно установки gnome-tweak-tools. Это стало последней каплей, которая окончательно переполнила мое терпение - Unity, давай, досвидания! Поставил XFCE - тот же Gnome 2, только лучше. Установил в настройках разрешающую способность в 120 DPI, в качестве основного выбрал шрифт Ubuntu 10 - все стало отлично. Почти.

Оболочка и родные GTK-, QT-приложения работают замечательно. В редких случаях (Sublime 2) приходится просить увеличить шрифт в редакторе, но практически всё прекрасно отображается и так. Приложения Java/SWT (Eclipse, Xmind) работают также отлично.

Консольный шрифт, там где он нужен (xfce4-terminal, gnome-terminal, guake) приходится доустанавливать вручную (DejaVu Sans Mono 10), иначе он какой-то не такой.

Приложения Java Swing похоже жестко завязаны на фиксированный DPI и игнорируют значение DPI установленное в системе. Установка L&F стиля в значение "GTK+" помогает привести текст в меню, окнах и сообщениях в надлежащий вид. Но даже при установке этого стиля приходится вручную увеличивать размер моноширийного шрифта до 16-18 пунктов для всяких редакторов и отображений результатов. Установить тему GTK+ можно либо покопавшись в настройках приложения (далеко не все это позволяют), либо с помощью опции "-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel" или "-Dswing.systemlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel" в строке запуска. Некоторые приложение не дают настроить L&F в настройках, но при этом еще и игнорируют опцию в командной строке - устанавливая L&F жестко в коде. В таком случае последней надеждой является возможность настройки шрифтов индивидуально (на практике это позволяют многие приложения).

Для Swing-темы JGoodies (Aquafold Datastudion, Soap UI) есть специальные переключатели позволяющие устанавливать необходимый шрифт через системные опции.

JAVA_OPTS="${JAVA_OPTS} -DPlastic.controlFont=\"Ubuntu-plain-18\""
JAVA_OPTS="${JAVA_OPTS} -DPlastic.menuFont=\"Ubuntu-plain-18\""

Firefox и Thunderbird. Меню, окна, сообщения - все хорошо. Контент - плохо, очень мелко. Во многих местах размер шрифтов задается в px - и потом так же честно в мелких пикселах и отображается. Одним из решений является увеличение значения настроек font.minimum-size.* до значения 15 и выше. Это ограничивает размер шрифтов снизу, однако, к сожалению, зачастую приводит к расползанию верстки на сайтах, поскольку шрифты увеличиваются, а вот контейнеры в которых содержится текст - нет. Другим вариантом, который и оказался самым выигрышным, является увеличение значения настройки "layout.css.devPixelsPerPx" до 1.3, что приводит к плавному увеличению всего контента. При этом некоторая пиксел-оптимизированная графика выглядит размыто, но она, к счастью, уже является редкостью и анахронизмом.

Единственным неприятным моментом является то, что затейливые изогнутые табы в Thunderbird при этом визуально расползаются. Я уже оформил баг, а временным решением является корректировка XUL-верстки файлом ${THUNDERBIRD_PROFILE}/chrome/userChrome.css

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");

.tab-background {
  background: transparent!important;
  margin: 0px !important;
}

.tab-background[selected=true] {
  background: -moz-Dialog!important;
} 

.tabmail-tab:not([selected]):not(:hover) +
.tabmail-tab:not([selected]):not(:hover)::before {
  background: transparent!important;
}

В браузере Chromium все еще хуже - там даже интерфейс рендерится без учета системного DPI. Я особо Chromium не пользуюсь, поэтому пока ничего особого не делал - только установил увеличение по-умолчанию в 125% в настройках.

Еще один найденный источник проблем - приложения Wine. Я пользуюсь парочкой виндовых утилит, поэтому пришлось разобраться. Микроскопичность устраняется с помощью настроек в winecfg. Во-первых, на вкладке "Graphic" есть ползунок устанавливающий DPI. Во-вторых, на вкладке "Desktop Integration" можно вручную выставить все шрифты (я поставил везде Ubuntu 10). После этих двух мероприятий приложения Wine выглядят почти также, как и родные.

И последнее - подключение к виртуальной Windows-машине через rdesktop. В Windows уже давно можно изменять общее увеличение/уменьшение размера шрифтов, но оказалось, что в RDP-сеансе изменение этого масштаба игнорируется - он остается таким же мелким. Проблема уже решена оперативным патчем от Микрософт.