Доброго времени суток, Хабр. Увидел я недавно новую Ubuntu и стало мне завидно, что у нее шрифты красивее, чем в моей Mandriva (GNOME). И стал я копать. Копал и экспериментировал я долго, но в итоге я добился нужного результата. Хочу теперь вам рассказать как это у меня получилось. Сделал я это путем пересборки библиотек, которые отвечают за рендеринг шрифтов, с поддержкой ClearType-сглаживания. Не знаю, красивее чем в Ubuntu или нет, но мне нравятся. Итак, приступим.
Для отрисовки шрифтов используются такие библиотеки:
Cairo — библиотека, предназначенная для рендеринга векторной графики.
Xft — свободная библиотека, предназначена чтобы использовать Freetype растеризер с X-расширением X Rendering Extension; обычно это нужно для для использования шрифтов FreeType с X Window System.
FreeType — библиотека, которая используется для растеризации шрифтов и операций над ними.
Дело было с последними стабильными версиями, на сегодня это:
Cairo 1.8.8
Xft 2.1.14
FreeType 2.3.11
За патчи огромное спасибо сообществу пользователей Arch Linux, у которых я их всех и нашел.
Каждый патч ничего сложного не делает, просто вносит некоторые изменения в исходники библиотек. Для их применения нужен пакет «patch» который найдете в репозиториях. Об его использовании и о его параметрах и ключах можно почитать здесь. Коды патчей обновлены для работы с новыми версиями библиотек. Если посмотреть код любого из них, то можно делать все это вручную путем добавления и замены кода в исходниках.
Cairo:
cairo-1.2.4-lcd-cleartype-like.diff — ClearType рендеринг шрифтов. Подобное сглаживание и применяется в убунту (исходя с сравнения). Напомню что данный метод зарегистрирован компанией Microsoft.
Xft:
libXft-2.1.14-lcd-cleartype.patch — то же самое что и для cairo. Это повлияло у меня на шрифты в Opera, Lotus Symphony.
FreeType:
bytecode.patch -включает рендеринг шрифтов, запатентованный компанией Apple, поэтому он выключен изначально. Это опционально, можно и не включать.
freetype-2.2.1-subpixel-disable-quantization.diff — название говорит само за себя, выключает квантование.
freetype-2.3.0-enable-spr.patch — включение субпиксельного рендеринга
freetype-2.2.1-enable-valid.patch
freetype-2.2.1-memcpy-fix.patch
У них еще есть патчи для сглаживания от Canonical — freetype2-ubuntu, libxft-ubuntu, cairo-ubuntu, но они мне особо не помогли, даже хуже сделали. Тем более что они не для новых версий библиотек.
Все зависимости для компиляции установите в процессе, ибо я уже не помню их всех.
Для начала собeрем Cairo. Переходим в папку с исходниками cairo-1.8.8/. Бросаем туда патч (мне было так удобнее), и в консоли выполняем:
Естественно для команды make install будут нужны права root'а, поэтому либо выполняйте все в консоли от рута либо к make install прменяйте sudo.
Если перезагрузить иксы, мы увидим значительную разницу в отрисовке шрифтов.
Дальше собираем Xft. Стаем в libXft-2.1.14/:
Теперь FreeType. Если вы хотите использовать рендеринг Apple, тогда накладываем bytecode.patch. freetype-2.3.11/:
И еще дополнительные изменения которые можно применять и без bytecode. Это уже надо смотреть самим, лучше ли с ними или нет:
После этого можно перезапускать иксы.
Приведу вам свои скрины чтобы вы видели разницу:
Все шрифты приложений, документов, заголовков и робочего стола у меня в настройках по умолчанию — Sans.
Вот так у выглядел Firefox у меня с «нетронутыми» библиотеками:
1.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/126/edf/bf7/126edfbf7f48e92a9b105a267f993c9d.jpg)
Firefox, пропатчен Cairo:
Теперь стало похоже на Убунту.
Полное (Full) уточнение (Hinting) шрифтов (в настройках шрифтов в GNOME):
2.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/9fd/70b/989/9fd70b98951c684b375539ef6884d987.jpg)
Слабое (Slight) уточнение (Hinting) шрифтов, которое в Убунту стоит всегда по умолчанию:
3.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/908/5f6/1dc/9085f61dc1a5a696b19b1f56390c7cae.jpg)
Opera, пропатчен Xft:
Слабое (Slight) уточнение (Hinting) шрифтов:
4.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/3ab/442/872/3ab4428723d6ae9f20717b05db68946f.jpg)
Firefox, пропатчен FreeType с bytecode.patch:
Полное (Full) уточнение (Hinting) шрифтов:
5.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/ebf/c89/b04/ebfc89b04c659ad894c3ba6db930693d.jpg)
Слабое (Slight) уточнение (Hinting) шрифтов:
Кстати это тоже выглядит как в Убунту.
6.![](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg511.imageshack.us%2Fimg511%2F6009%2Ffirefoxbytecodeslight.th.png%22)
На последок рекомендую поигратся в настройках шрифтов в GNOME (или KDE), особенно с dpi. Можно еще поэксперементировать с ихними патчами, и добится лучшего результата.
На этом у меня все. Спасибо всем, надеюсь кому-то это пригодилось.
UPDATE:
По просьбам выкладываю сводную картину со всех 6-ти выше показаных сриншотов:
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/4ab/fb0/8bf/4abfb08bf0cb6edbf3fb5987258d4fba.png)
Отмечу, что в настройках шрифтов GNOME у меня все время было включено сглаживание «Субпиксельное (ЖК-мониторы)».
Также отмечу, что по скринам видно, что в Опере шрифты чуть темнее. Но это потому что Опера использует Xft, в то время как Фаерфокс (да и весь гном) — cairo. Отсюда вывод — разница в рендеринге libxft-cleartype и cairo-cleartype есть.
еще UPDATE:
Покопал я глубже, в исходниках патчей. Сравнил патч для Cairo и патч Xft. В них нашел весьма интересные и похожые строчки:
В патче Xft:
В патче Cairo:
С комментария для этой строчки в Xft (/* note: keep the filter symetric, or bad things will happen */) я понял что это, какбы, массив размеров каких-то, частот или что-то в этом роде. Ну откуда мне знать-то?)) Но по названию массива можна подумать что там применялся алгоритм вот этой штуковины. )) Но все-же, откуда мне знать? Долго я не думал, и установил в патче для Cairo такие же шестнадцатиричные числа (размера, частоты?) в этом массиве как и в патче для Xft, пересобрал. И, о чудо, у меня везде теперь такие же темненькие и четкие шрифты как в Опере (Qt).
Firefox, пропатчены все библиотеки, полное (Full) уточнение (Hinting) шрифтов:
7.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/532/564/a02/532564a02477808961e8464b597f5d54.jpg)
![image](https://habrastorage.org/r/w1560/getpro/habr/post_images/8d4/a3d/f46/8d4a3df46915e7deb99e10f69aee91fd.png)
Сравните с 5-м скрином.
Firefox, пропатчен только Cairo, слабое (Slight) уточнение (Hinting) шрифтов:
8.![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/ead/9d8/214/ead9d821487dc931a8e65ea636895b81.jpg)
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg197.imageshack.us%2Fimg197%2F5601%2Fresult8.png%22)
Сравните с 3-м скрином и с 4-м скрином, где Опера.
Все, теперь я доволен. =) Вот вам измененный патч для Cairo
Библиотеки
Для отрисовки шрифтов используются такие библиотеки:
Cairo — библиотека, предназначенная для рендеринга векторной графики.
Xft — свободная библиотека, предназначена чтобы использовать Freetype растеризер с X-расширением X Rendering Extension; обычно это нужно для для использования шрифтов FreeType с X Window System.
FreeType — библиотека, которая используется для растеризации шрифтов и операций над ними.
Исходники библиотек
Дело было с последними стабильными версиями, на сегодня это:
Cairo 1.8.8
Xft 2.1.14
FreeType 2.3.11
Основные патчи
За патчи огромное спасибо сообществу пользователей Arch Linux, у которых я их всех и нашел.
Каждый патч ничего сложного не делает, просто вносит некоторые изменения в исходники библиотек. Для их применения нужен пакет «patch» который найдете в репозиториях. Об его использовании и о его параметрах и ключах можно почитать здесь. Коды патчей обновлены для работы с новыми версиями библиотек. Если посмотреть код любого из них, то можно делать все это вручную путем добавления и замены кода в исходниках.
Cairo:
cairo-1.2.4-lcd-cleartype-like.diff — ClearType рендеринг шрифтов. Подобное сглаживание и применяется в убунту (исходя с сравнения). Напомню что данный метод зарегистрирован компанией Microsoft.
Xft:
libXft-2.1.14-lcd-cleartype.patch — то же самое что и для cairo. Это повлияло у меня на шрифты в Opera, Lotus Symphony.
FreeType:
bytecode.patch -включает рендеринг шрифтов, запатентованный компанией Apple, поэтому он выключен изначально. Это опционально, можно и не включать.
freetype-2.2.1-subpixel-disable-quantization.diff — название говорит само за себя, выключает квантование.
freetype-2.3.0-enable-spr.patch — включение субпиксельного рендеринга
freetype-2.2.1-enable-valid.patch
freetype-2.2.1-memcpy-fix.patch
У них еще есть патчи для сглаживания от Canonical — freetype2-ubuntu, libxft-ubuntu, cairo-ubuntu, но они мне особо не помогли, даже хуже сделали. Тем более что они не для новых версий библиотек.
Сборка библиотек
Все зависимости для компиляции установите в процессе, ибо я уже не помню их всех.
Для начала собeрем Cairo. Переходим в папку с исходниками cairo-1.8.8/. Бросаем туда патч (мне было так удобнее), и в консоли выполняем:
$ patch -Np1 -i cairo-1.2.4-lcd-cleartype-like.diff
$ ./configure --prefix=/usr
$ make && make install
Естественно для команды make install будут нужны права root'а, поэтому либо выполняйте все в консоли от рута либо к make install прменяйте sudo.
Если перезагрузить иксы, мы увидим значительную разницу в отрисовке шрифтов.
Дальше собираем Xft. Стаем в libXft-2.1.14/:
$ patch -Np1 -i libXft-2.1.14-lcd-cleartype.patch
$ ./configure --prefix=/usr
$ make && make install
Теперь FreeType. Если вы хотите использовать рендеринг Apple, тогда накладываем bytecode.patch. freetype-2.3.11/:
$ patch -Np0 -i bytecode.patch
И еще дополнительные изменения которые можно применять и без bytecode. Это уже надо смотреть самим, лучше ли с ними или нет:
$ patch -Np1 -i freetype-2.2.1-subpixel-disable-quantization.diff
$ patch -Np1 -i freetype-2.3.0-enable-spr.patch
$ patch -Np1 -i freetype-2.2.1-enable-valid.patch
$ patch -Np1 -i freetype-2.2.1-memcpy-fix.patch
$ ./configure --prefix=/usr
$ make && make install
После этого можно перезапускать иксы.
Конец
Приведу вам свои скрины чтобы вы видели разницу:
Все шрифты приложений, документов, заголовков и робочего стола у меня в настройках по умолчанию — Sans.
Вот так у выглядел Firefox у меня с «нетронутыми» библиотеками:
1.
![](https://habrastorage.org/getpro/habr/post_images/126/edf/bf7/126edfbf7f48e92a9b105a267f993c9d.jpg)
Firefox, пропатчен Cairo:
Теперь стало похоже на Убунту.
Полное (Full) уточнение (Hinting) шрифтов (в настройках шрифтов в GNOME):
2.
![](https://habrastorage.org/getpro/habr/post_images/9fd/70b/989/9fd70b98951c684b375539ef6884d987.jpg)
Слабое (Slight) уточнение (Hinting) шрифтов, которое в Убунту стоит всегда по умолчанию:
3.
![](https://habrastorage.org/getpro/habr/post_images/908/5f6/1dc/9085f61dc1a5a696b19b1f56390c7cae.jpg)
Opera, пропатчен Xft:
Слабое (Slight) уточнение (Hinting) шрифтов:
4.
![](https://habrastorage.org/getpro/habr/post_images/3ab/442/872/3ab4428723d6ae9f20717b05db68946f.jpg)
Firefox, пропатчен FreeType с bytecode.patch:
Полное (Full) уточнение (Hinting) шрифтов:
5.
![](https://habrastorage.org/getpro/habr/post_images/ebf/c89/b04/ebfc89b04c659ad894c3ba6db930693d.jpg)
Слабое (Slight) уточнение (Hinting) шрифтов:
Кстати это тоже выглядит как в Убунту.
6.
![](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg511.imageshack.us%2Fimg511%2F6009%2Ffirefoxbytecodeslight.th.png%22)
На последок рекомендую поигратся в настройках шрифтов в GNOME (или KDE), особенно с dpi. Можно еще поэксперементировать с ихними патчами, и добится лучшего результата.
На этом у меня все. Спасибо всем, надеюсь кому-то это пригодилось.
UPDATE:
По просьбам выкладываю сводную картину со всех 6-ти выше показаных сриншотов:
![image](https://habrastorage.org/getpro/habr/post_images/4ab/fb0/8bf/4abfb08bf0cb6edbf3fb5987258d4fba.png)
Отмечу, что в настройках шрифтов GNOME у меня все время было включено сглаживание «Субпиксельное (ЖК-мониторы)».
Также отмечу, что по скринам видно, что в Опере шрифты чуть темнее. Но это потому что Опера использует Xft, в то время как Фаерфокс (да и весь гном) — cairo. Отсюда вывод — разница в рендеринге libxft-cleartype и cairo-cleartype есть.
еще UPDATE:
Покопал я глубже, в исходниках патчей. Сравнил патч для Cairo и патч Xft. В них нашел весьма интересные и похожые строчки:
В патче Xft:
+static const int fir_filter[5] = { 0x10, 0x40, 0x70, 0x40, 0x10 };
В патче Cairo:
+static const int fir_filter[5] = { 0x1C, 0x38, 0x55, 0x38, 0x1C };
С комментария для этой строчки в Xft (/* note: keep the filter symetric, or bad things will happen */) я понял что это, какбы, массив размеров каких-то, частот или что-то в этом роде. Ну откуда мне знать-то?)) Но по названию массива можна подумать что там применялся алгоритм вот этой штуковины. )) Но все-же, откуда мне знать? Долго я не думал, и установил в патче для Cairo такие же шестнадцатиричные числа (размера, частоты?) в этом массиве как и в патче для Xft, пересобрал. И, о чудо, у меня везде теперь такие же темненькие и четкие шрифты как в Опере (Qt).
Firefox, пропатчены все библиотеки, полное (Full) уточнение (Hinting) шрифтов:
7.
![](https://habrastorage.org/getpro/habr/post_images/532/564/a02/532564a02477808961e8464b597f5d54.jpg)
![image](https://habrastorage.org/getpro/habr/post_images/8d4/a3d/f46/8d4a3df46915e7deb99e10f69aee91fd.png)
Сравните с 5-м скрином.
Firefox, пропатчен только Cairo, слабое (Slight) уточнение (Hinting) шрифтов:
8.
![](https://habrastorage.org/getpro/habr/post_images/ead/9d8/214/ead9d821487dc931a8e65ea636895b81.jpg)
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg197.imageshack.us%2Fimg197%2F5601%2Fresult8.png%22)
Сравните с 3-м скрином и с 4-м скрином, где Опера.
Все, теперь я доволен. =) Вот вам измененный патч для Cairo