В первой декаде сентября без фанфар и шумихи вышел FreeType версии 2.7, и это событие, без сомнения, можно назвать праздником на улице пользователей Linux, FreeBSD, NetBSD, ReactOS и других товарищей. Попробуем разобраться, от чего у нас такое безудержное веселье.
FreeType — библиотека с открытым кодом на Си, которую используют для растеризации шрифтов и операций над ними. В новой версии по-умолчанию используется алгоритм обработки инструкций TrueType
v40.
Это позволило добиться качественного субпиксельного сглаживания шрифтов, как в майкрософтовском DirectWrite/ClearType
, но на самом деле никакого субпиксельного сглаживания не используется. Кроме того, алгоритм v40 рендерит быстрее Infinality
, который использовался в предыдущем алгоритме v38, при этом конечный результат не хуже.
Infinality, патенты и ШГ
Исторически, было две проблемы со шрифтами в Linux. Во-первых, это минное поле патентов Microsoft и Apple, из-за чего разработчики мучительно шли обходными путями. Частично, эту проблему решал набор патчей Infinality
, но ценой была низкая скорость и чересчур усложненный код. К тому же, по словам мейнтейнера, FreeType
разработчик Infinality
потерял интерес к своему проекту.
Давайте приглядимся к этим патентам чуть подробнее. С 10-го мая 2010-года истекли три патента Apple на байткодное сглаживание TrueType
шрифтов. Теперь нет необходимости отключать его использование по-умолчанию.
Patent US5155805:
Method and apparatus for moving control points in displaying digital typeface on raster output devices
Patent US5159668:
Method and apparatus for manipulating outlines in improving digital typeface on raster output devices
Patent US5325479:
Method and apparatus for moving control points in displaying digital typeface on raster output devices
Но еще 9 патентов на ClearType
Майкрософт остаются в силе.
Patent US6239783:
Weighted mapping of image data samples to pixel sub-components on a display device
Patent US6243070:
Method and apparatus for detecting and reducing color artifacts in images
Patent US6282327:
Maintaining advance widths of existing characters that have been resolution enhanced
Patent US6307566:
Methods and apparatus for performing image rendering and rasterization operations
Patent US6393145:
Methods apparatus and data structures for enhancing the resolution of images to be rendered on patterned display devices
Patent US6421054:
Methods and apparatus for performing grid fitting and hinting operations
Patent US6624828:
Method and apparatus for improving the quality of displayed images through the use of user reference information
Эти патенты можно разделить на три условные категории:
- показ рисунков, когда информация отображается на уровне отдельных LCD субпикселей, вместо цельных пикселей
- показ тех же рисунков после применения разнообразных фильтров, например для подавления артефактов цветного окаймления
- обработка размеров и расстояний в красочном мире субпикселей
И это еще не все, есть и другие патенты. Прелесть ситуации еще в том, что Microsoft и Apple подписали соглашение о кросс-лицензировании в то время, как разработчики FreeType
и их коллеги по цеху открытого ПО должны героически преодолевать ШГ препятствия.
Ценность этих патентов весьма сомнительна. Сразу же после того, как Майкрософт запатентовала ClearType, появились сомнения относительно их правомочности и новизны, причем писали об этом в газете Нью-Йорк Таймс, не на безызвестном случайном форуме. Один из активных разоблачителей Стив Гибсон на свой интернет страничке пишет, что ClearType — хорошо забытые технологии, которые Стив Возняк запатентовал 20 лет назад для Apple II. Никакого существенного прорыва технической мысли нет и в помине, а значит и интеллектуальной собственности нет.
Thus, Microsoft's ‘ClearType’ application of sub-pixel text rendering does not represent the dramatic breakthrough that they claim and it can not be the valid subject for intellectual property acquisition.
К сожалению, американское патентное право устроено таким образом, что все это остается разговором в пользу бедных. Хорош он или плох, но патент есть, и значит, остальным надо платить денежки за его использование.
Позволю себе немного пафоса. Пока что Майкрософт не спешит дарить патенты на ClearType сообществу открытого ПО, как это сделала компания Adobe с OpenType/CFF
движком. Об этом неплохо помнить, когда мы очередной раз видим слоган Microsoft сердечко Linux. По примеру американского президента Рейгана хочется воскликнуть: «Господин Наделла, если Майкрософт любит Linux, разрушьте эти патентные стены!».
Новый рендеринг для TrueType
Наследие программных алгоритмов рендеринга шрифтов для ЭЛТ мониторов 90-х гг. прошлого столетия — это вторая проблема Linux со шрифтами. Семейство TrueType
шрифтов появилось на свет в эпоху зернистых мониторов с электронно-лучевыми трубками. В снимках экрана Windows 95 из текста так и лезут пиксели. Каждый отдельный глиф намертво вколачивался в сетку из пикселей. Майкрософт вложила в это дело уйму человеко-часов, обсчитывая и оптимизируя глифы для всевозможных размеров, чтобы т. н. основные вэб шрифты (Arial, Times New Roman, Courier New
и т. д.) на экране выглядели достойно.
Сизифов труд однако возымел последствия. Настала новая эпоха ЖК-мониторов и тут оказалась, что старые TrueType
инструкции надо перепрограммировать для того, чтобы использовать эти новые возможности или хотя бы для того, чтобы шрифты отображались корректно. Нет необходимости пристегивать каждый глиф к сетке полных пикселей, вместо этого их можно пристегнуть к одному из трех субпикселей, даже к части их и добиться гораздо более качественного изображения, благодаря такому субпиксельному сглаживанию. Здраво рассудив, что переписать весь старый багаж TrueType
инструкций нереально, в MS придумали асимметрическую сверх-дискретизацию и режим совместимости, в котором использовали много лихих приемчиков и костылей из инструкций старых шрифтов. Таким образом, и старые шрифты могли в некоторой степени воспользоваться увеличенным кратно горизонтальным разрешением.
Разработчики FreeType
решили не городить этот огород и проигнорировали режим совместимости. Это конечно же имело последствия. Новые шрифты, натасканные на костыльный режим совместимости и асинхронную сверх-дискретизацию, смотрелись кривовато.
Впрочем, нашелся герой, который пошел трудным путем и реализовал в Infinality
все вышеназванное спагетти старых и новых инструкций. Какое-то время FreeType
включал в себя интерпретатор v38 — набор патчей Infinality
, но затем код был удален в пользу интерпретатора v35. Разработчик Infinality
поистине взялся за невыполнимую миссию — сделать так, чтобы шрифты выглядели лучше чем в Windows, и чтобы их можно было тонко настроить.
Here is the core secret to making fonts render like through DirectWrite/ClearType on Windows: There actually is no subpixel hinting going on here. Shock. The code simply ignores all horizontal hinting instructions.
В итоге, удалив Infinality
, мейнтейнер FreeType
сделал выбор в пользу простоты и чистоты кода. Так появился алгоритм обработки инструкций TrueType
v40. Его принцип прост как копейка — полное игнорирование всех инструкций горизонтального сглаживания. Никакого субпиксельного сглаживания. Гораздо меньше труда, а результат практический одинаковый. Заодно решается проблема с шагом глифа и меж-символьными расстояниями в старых не обученных шрифтах.
Как достичь гармонии шрифтов с FreeType 2.7
Хорошая новость в том, что для этого ничего делать не нужно, обновления сами появятся в репозитарии вашего Linux или BSD дистрибутива. Просто обновитесь до новой версии и перезагрузите X.Org Server. Настройте FontConfig
по вкусу. А плохая новость в том, что хочется прям сейчас, а ждать несколько дней или недель иногда тяжко. Ну а особо нетерпеливые пользователи могут сами собрать новую версию из исходников или установить с помощью штатного установщика пакетов. В моем Gentoo FreeType 2.7
пока не стабилизировался.
$ eix freetype
$ [I] media-libs/freetype
Доступные версии: (2) 2.5.5^d 2.6.3-r1^d ~2.6.5^d ~2.7-r1^d
{X +adobe-cff auto-hinter bindist bzip2 (+)cleartype_hinting debug doc fontforge harfbuzz infinality png static-libs utils ABI_MIPS="n32 n64 o32" ABI_PPC="32 64" ABI_S390="32 64" ABI_X86="32 64 x32"}
Для консервативного Debian, наверное придется ждать следующего релиза, а у пользователей Ubuntu и так все хорошо со шрифтами, им торопиться некуда.