¿Alguien conoce algún algoritmo que calcule automáticamente el interletraje de caracteres basado en formas de glifo cuando el usuario escribe texto?
No me refiero al cálculo trivial de los anchos de avance o similares, me refiero a analizar la forma de los glifos para estimar la distancia visual óptima entre los caracteres. Por ejemplo, si colocamos tres caracteres secuencialmente en una línea, el personaje del medio debería PARECER estar en el centro de la línea a pesar de las formas del personaje. Un ejemplo ilumina la funcionalidad kerning-on-the-fly:
Un ejemplo de kerning-on-the-fly:
En la imagen de arriba a
parece ser demasiado correcta. Debería desplazarse una cierta cantidad hacia T
para que parezca estar en el medio de T
y g
. El algoritmo debe examinar las formas de T
y a
(y posiblemente otras letras también) y decidir cuánto a
se debe desplazar hacia la izquierda. Esta cierta cantidad es lo que debe calcular el algoritmo, SIN EXAMINAR LOS POSIBLES PARES DE KERNING DE LA FUENTE.
Estoy pensando en codificar un programa javascript (+ svg + html) que use fuentes dibujadas a mano y muchas de ellas carecen de pares de interletraje. Los campos de texto serán editables y pueden incluir texto de múltiples fuentes. Creo que el interletraje sobre la marcha podría ser una forma de garantizar el flujo de texto medio en este caso.
EDITAR: Un punto de partida para esto podría ser usar la fuente svg, por lo que es fácil obtener valores de ruta. En la fuente svg, la ruta se define de esta manera:
<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"/>
El algoritmo (o código javascript) debe examinar esas rutas de alguna manera y determinar la distancia óptima entre ellas.