Alguém conhece algum algoritmo que calcule o kerning automático de caracteres com base em formas de glifo quando o usuário digita texto?
Não me refiro a cálculos triviais de larguras avançadas ou similares, mas a analisar a forma dos glifos para estimar a distância visualmente ideal entre os caracteres. Por exemplo, se colocarmos três caracteres seqüencialmente em uma linha, o caractere do meio deverá parecer estar no centro da linha, apesar das formas do personagem. Um exemplo ilustra a funcionalidade do kerning-on-the-fly:
Um exemplo de kerning-on-the-fly:
Na imagem acima a
parece estar muito certo. Ele deve ser deslocado uma certa quantidade para T
que pareça estar no meio de T
e g
. O algoritmo deve examinar as formas T
e a
(e possivelmente outras letras também) e decidir quanto a
deve ser deslocado para a esquerda. Essa quantia é o que o algoritmo deve calcular - SEM EXAMINAR OS PARES KERNING POSSÍVEIS DA PIA BATISMAL.
Estou pensando em codificar um programa javascript (+ svg + html) que usa fontes desenhadas à mão e muitas delas não possuem pares de kerning. Os campos de texto serão editáveis e podem incluir texto de várias fontes. Eu acho que o kerning-on-the-fly pode ser uma maneira de garantir um fluxo médio de texto nesse caso.
EDIT: Um ponto de partida para isso pode ser o uso da fonte svg, por isso é fácil obter valores de caminho. Na fonte svg, o caminho é definido desta maneira:
<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"/>
O algoritmo (ou código javascript) deve examinar esses caminhos de alguma maneira e determinar a distância ideal entre eles.