Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Как за “кулисами” происходит преобразование текста в картинку?

#c_sharp #net #шрифты #графика


В общем, хотел посмотреть принцип работы метода DrawString, но к моему сожалению
все уперлось в вызов нативного метода:

[DllImport(ExternDll.Gdiplus, SetLastError=true, ExactSpelling=true, CharSet=System.Runtime.InteropServices.CharSet.Unicode)]
// 3 = Unicode
[ResourceExposure(ResourceScope.None)]
internal static extern int GdipDrawString(HandleRef graphics, string textString,
int length, HandleRef font, ref GPRECTF layoutRect, HandleRef stringFormat, HandleRef
brush);


Собственно вопрос в том, как за кулисами это делается?
    


Ответы

Ответ 1



Все упирается в шрифт. На всех платформах процесс рисования текста ничем особо не отличается. Каждый формат шрифтов содержит определенные данные внутри, и текст выводится посимвольно. Если кратко рассмотреть самый популярный формат шрифтов TrueType, то внутри он содержит несколько таблиц с данными. Глифы (glyphs). Здесь просто прописаны графические пути, по которым рисуется символ. Пути строятся из прямых линий и квадратичных кривых Безье (квадратичные быстрее кубических). Для экономии места один глиф может ссылаться на несколько других. Соответствие между символами и глифами. Таблица с метриками глифов, насколько сдвигаться относительно предыдущего символа, сдвиг по вертикали, какая длина символа и высота. Кернинг (kerning). Необязательна таблица. Содержит информацию о том, насколько менять расстояние между специфическими парами символов. Например, если посмотреть на комбинацию следующих 2 латинских символов - AW - то видно, что W "наезжает" на A. Если шрифт моноширинный, то эта таблица отсутствует, так как символы всегда имеют одинаковую ширину, и не сдвигаются никогда. Лигатуры (ligatures). Необязательная таблица. Содержит соответствия между комбинациями символов в исходной строке и специальными глифами. На примере ниже показано, как выглядят лигатуры в шрифте Calibri, и как символы выглядят по отдельности (что бы "сломать" лигатуру использовался символ U+FEFF посредине): Таблица с глифами может дополнительно содержать инструкции (hints) для виртуальной машины TrueType. Эти инструкции могут сдвигать некоторые точки символа, что бы он лучше выглядел на пиксельной сетке. На примере ниже символ m. Слева - точки просчитаны простой аппроксимацией, справа - после применения хинтов. На платформах Microsoft применяется технология ClearType для сглаживания. На свое усмотрение эта технология может игнорировать некоторые хинты, и рисовать символы по-своему. Источник: https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=iws-chapter08

Комментариев нет:

Отправить комментарий