Tutoriel de mise en oeuvre des substitutions contextuelles

Le texte qui suit est incompréhensible s’il est n’est pas lu avec un navigateur qui apporte un support correct de l'Opentype.

calt

Nous sommes nombreux à avoir découvert avec émerveillement FontForge mais nous sommes sûrement bien moins à avoir, comme je l’ai fait, œuvré pendant des années à utiliser maladroitement le mécanisme des substitutions contextuelles. J’ai surtout appris par des essais faute de trouver ou de comprendre la documentation sur Internet. Les liens que je vous donne en fin de page sont précieux mais difficiles. Pourtant ce dispositif apporte tant qu’une police d’écriture qui ne l’utilise pas est dépassée.

La fonte de caractères « otfpoc » qui est celle de ce texte sert à la fois de démonstration et de modèle.

Les substitutions contextuelles y sont mises en œuvre pour connecter comme il se doit les lettres minuscules de l’alphabet latin. Par exemple si un c est suivi d’autres c alors ils sont transformés pour se connecter comme ceci : cccc.

Si vous voulez, je peux vous guider pour faire de même avec votre propre police d’écriture.

Ce qu’il y a à prendre dans la fonte otfpoc c’est la structure de sa table de substitution de glyphes (la « GSUB Opentype Layout table »). Je pars du principe que vous êtes arrivé ici avec vos glyphes que vous pouvez substituer aux miens dans le source FontForge de la fonte otfpoc pour en tester les connexions.

1ère étape : le modèle de connexion

La connexion est l’ajout aux glyphes de pattes qui se recouvrent pour former un trait continu. Il faut que cela se fasse d’une manière constante, selon un modèle. En fait, il faut au moins deux modèles, celui des connexions par le bas et celui des connexions par le haut. On pourrait compliquer encore plus mais vous allez voir, c’est déjà bien assez prise de tête comme cela !

J’ai choisi de faire l’attachement avant la chasse du premier glyphe. C’est une astuce pour faire en sorte que certaines lettres contiennent dans leur variante de base le modèle de connexion droit. Ainsi seul le second glyphe doit être modifié et le nombre des variantes s’en trouve diminué. Vous pouvez préférer connecter les glyphes après la chasse mais dans tous les cas, il est essentiel que le recouvrement soit au moins de 40 points et se fasse d’un coté ou de l’autre pour éviter que les mécanismes de hinting ne provoquent des décalages intempestifs à l’affichage. Dit autrement, le recouvrement ne doit jamais être à cheval sur la ligne de chasse.

Connexion par le bas
Voici donc une connexion dans la fonte otfpoc. La variante de la lettre « c » s'attache au glyphe uniE028.

Dans la fonte de caractères otfpoc le recouvrement bas se fait dans un cercle toujours positionné au même endroit. Remarquez que le dessin du deuxième glyphe déborde sur sa gauche par des points d'abcisse négative mais que celui du premier reste en deça de sa chasse.

Les lettres o, v et w s’attachent par le haut ce qui demande un deuxième modèle de recouvrement.

Connexion par le haut
Une connexion par le haut.

Concevez ce recouvrement dans un dessin adapté aux glyphes de votre police d’écriture. Placez-le en sorte qu'il vous laisse un maximum de latitudes quitte à devoir décaler peu naturellement la chasse.

2ème étape : le dessin des variantes

A ce stade, je vous propose de faire un essai concret : ouvrez le source otfpoc.sfd avec FontForge et placez y vos propres glyphes.

1) Importez avec une hauteur de glyphe de 1000 :

2) Redessinez vos lettres « a d f h k l m n r t u » pour y incorporer la partie droite de votre modèle de connexion basse.

3) Passez en zone private pour y remplacer les variantes par vos glyphes redessinés avec la ou les connexions qui vont bien. Leur nom est constitué du nom du glyphe de base concaténé à un suffixe comme suit :

Variantes
Variantes en zone private.

4) Générez la fonte au format Opentype (CFF) et utilisez la fonction « imprimer » de FontForge ou Iceweasel pour apprécier le résultat. Je vous laisse continuer. Vous devrez adapter à vos besoins la table « de layout » (d'ajustements) GSUB et pour cela une explication s'impose.

La « Opentype Layout table » GSUB

Allez dans le menu « Elément » puis « Infos fonte... » puis « Lookups ». Il y a deux onglets, un pour la table GSUB et l'autre pour la table GPOS. Dans la table GSUB vous trouverez des « recherches », en anglais des « lookups ». Je reste sur le mot anglais. Les lookups qui sont définies dans fonte otfpoc sont :

Recherches
Recherches (« lookups »)

Ouvrez la sous-table du premier lookup, « calt 1st pass-1 » : vous retrouvez, par exemple, la lettre c dans la classe 1. La première règle est « 1 @<Substitutions 0x1> 1 @<Substitutions 1x0> » Le lookup Substitutions 0x1 transforme le c en sa variante c.0x1 et le lookup Substitutions 1x0 transforme le c en c.1x0.

Au bout du compte ce lookup transforme la suite de glyphes « c c c c » en « c.0x1 c.1x0 c.0x1 c.1x0 ».

Lookup indice 0
La sous-table du premier lookup

Les lookups s'appliquent sur les résultats des précédents lookups. Je ne vous parle pas du temps que j’ai mis pour comprendre cette quasi évidence ! Oublions, c’est du passé...

Regardez maintenant le deuxième lookup « calt 2nd pass ». En prenant cette fois les raccourcis, il a pour règle qu’un « c.1x0 » (en classe 6) suivi d’un « c.0x1 » (en classe 5) sont tous deux transformés en « c.1x1 ». Après l’exécution des deux lookups notre suite de glyphes devient « c.0x1 c.1x1 c.1x1 c.1x0 » c’est à dire le résultat attendu, cccc .

Lookup indice 1
La sous-table du deuxième lookup

C.Q.F.D.

Références en anglais

Création en septembre 2012. Reproduction interdite.