- PVSM.RU - https://www.pvsm.ru -
Субпиксельный рендеринг (вики [1])— способ увеличить видимое разрешение LCD или OLED дисплея путем рендеринга пикселей с учетом свойств экрана. Используется тот факт, что каждый пиксель экрана фактически состоит из отдельных красных, зеленых и синих субпикселей.
В посте я хочу рассказать о методе Haarmony LCD, который применяется в последних версиях freetype, и как его адаптировать для произвольных векторных изображений и конфигураций субпикселей.


Фотографией, сложно передать преимущества. Для сравнения можете посмотреть на следующую картинку. Если одна из конфигураций пикселей такая же, как у вашего монитора, разница должна быть существенной.

Ко мне обратились создатели U•HODL с предложением адаптировать субпиксельный рендеринг для их устройства. Устройство — миниатюрный криптокошелек с 0.96" OLED экраном (120×180). У них в блоге [2] (англ.) описано, как они внимательно относится к удобству, и как выжимают максимум из небольшого экрана. Поэтому им был необходим SPR для иконок и текста.
В интернете можно встретить описание механизма ClearType, который используют в Windows. Лучшее описание, на мой взгляд, на сайте grc.com [3]. Дальше короткая выжимка для тех, кому неинтересно вдаваться в подробности. ClearType состоит из двух этапов:
Каждый пиксель рендера отвечает за один цветной субпиксель:

Если просто вывести такой текст на экран, будет видна цветовая аберрация на краях букв:

И восстанавливает локальный цветовой баланс:

У этого метода несколько недостатков:
И тут на помощь приходит алгоритм Haarmony LCD. Кроме письма его автора [4], в интернете практически нет информации про алгоритм. Но, сам алгоритм прост и интуитивен. Надо 3 раза отрендерить текст со смещением равному смещению субпикселя, и сложить цветовые каналы.
Допустим, если у вас есть матрица такой конфигурации:

Вам надо отрендерить и сложить:
Схема рендера будет приблизительно такой.

Легче всего оказалось рендерить SVG изображения. Просто смещая viewBox (3 раза), заменив :
viewBox="0 0 120 180"
на
viewBox="0.25 0 120.25 180"
Пример рендера иконок:

Изображения:

Внимательный читатель мог заменить на изображениях цветную шахматку. Это связано с тем, что дисплей для которого разрабатывался алгоритм имеет приблизительно такую матрицу:

То есть, субпиксели на четных и нечетных строках размещены зеркально. В таком случае, достаточно отрендерить с двумя разными конфигурациями, и взять четные строки из одного изображения, а нечетные с другой.
Если вам необходимо использовать субпиксельный рендеринг в mcufont (библиотека для рендеринга шрифтов на микроконтроллерах), надо пропатчить encoder/freetype_import.cc и установить там Haarmony LCD режим FT_Render_Glyph(face->glyph, FT_RENDER_MODE_LCD). А на выводе текста не забывать, что ширина букв будет в 3 раза больше необходимой.
Автор: PatapSmile
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/algoritmy/335839
Ссылки в тексте:
[1] вики: https://en.wikipedia.org/wiki/Subpixel_rendering
[2] в блоге: https://medium.com/@tbrizitsky/designing-u-hodl-a-user-friendly-hardware-wallet-9877042ffdbf
[3] сайте grc.com: https://www.grc.com/cttech.htm
[4] письма его автора: https://lists.nongnu.org/archive/html/freetype-devel/2017-08/msg00055.html
[5] Источник: https://habr.com/ru/post/474876/?utm_campaign=474876&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.