Кто-нибудь знает какой-либо алгоритм, который будет автоматически рассчитывать кернинг символов на основе глифов, когда пользователь вводит текст?
Я не имею в виду тривиальное вычисление ширины и т. Д., Я имею в виду анализ формы глифов для оценки визуально оптимального расстояния между символами. Например, если мы последовательно выкладываем три символа в строке, средний символ должен выглядеть так, как если бы он находился в центре строки, несмотря на формы символов. Пример раскрывает функциональность кернинга на лету:
Пример кернинга на лету:
На изображении выше, a
кажется, слишком правильно. Он должен быть смещен на определенную величину в сторону, T
чтобы он находился посередине T
и g
. Алгоритм должен изучить формы T
и a
(и, возможно, других букв) и решить, сколько a
должно быть смещено влево. Это определенное количество - это то, что алгоритм должен вычислять - БЕЗ ИЗУЧЕНИЯ ВОЗМОЖНЫХ ПАР КЕРНИНГА Шрифта.
Я думаю о кодировании javascript (+ svg + html) программы, которая использует шрифты, нарисованные от руки, и во многих из них отсутствуют пары кернинга. Текстовые поля будут редактируемыми и могут содержать текст нескольких шрифтов. Я думаю, что кернинг на лету может быть одним из способов обеспечения среднего потока текста в этом случае.
РЕДАКТИРОВАТЬ: Одна из отправных точек для этого может быть использование шрифта svg, поэтому легко получить значения пути. В шрифте svg путь определяется следующим образом:
<glyph glyph-name="T" unicode="T" horiz-adv-x="1251" d="M531 0v1293h
-483v173h1162v-173h-485v-1293h-194z"/>
<glyph glyph-name="a" unicode="a" horiz-adv-x="1139" d="M828 131q-100 -85
-192.5 -120t-198.5 -35q-175 0 -269 85.5t-94 218.5q0 78 35.5 142.5t93
103.5t129.5 59q53 14 160 27q218 26 321 62q1 37 1 47q0 110 -51 155q-69 61
-205 61q-127 0 -187.5 -44.5t-89.5 -157.5l-176 24q24 113 79 182.5t159
107t241 37.5 q136 0 221 -32t125 -80.5t56 -122.5q9 -46 9 -166v-240q0
-251 11.5 -317.5t45.5 -127.5h-188q-28 56 -36 131zM813 533q-98 -40 -294
-68q-111 -16 -157 -36t-71 -58.5t-25 -85.5q0 -72 54.5 -120t159.5 -48q104
0 185 45.5t119 124.5q29 61 29 180v66z"/>
Алгоритм (или код JavaScript) должен каким-то образом исследовать эти пути и определять оптимальное расстояние между ними.