Ça fait pas mal de temps que je me dis qu'il faut que je rédige ça, pour
répondre à des questions répétées sur la gestion des polices X11. C'est
enfin chose faite. Tous les commentaires sont les bienvenus.
Les polices sous Unix et X11
============================
Nicolas George, le 2005-01-25
(Toutes copies ou citations autorisés à condition d'indiquer la source.)
1. Concepts de base
-------------------
1.1 Qu'est-ce qu'une police ?
Au sens strict, une police de caractères est une collection d'images
représentant des caractère. Originellement, ces images se présentent gravées
sur des morceaux de plomb, donc à une taille bien précise. Il existe des
collections représentant fondamentalement les mêmes caractères à différentes
tailles, de sorte qu'on parle de la « même police ».
Attention cependant, en typographie soignée, les différentes tailles d'une
même police ne s'obtiennent pas par une simple homothétie[1] : les petites
tailles sont dessinées avec des caractères proportionnellement plus larges
et espacés, pour améliorer la lisibilité. De toutes façons, quand il faut
graver les caractères dans le plomb, il est nécessaire de recommencer le
dessin à toutes les tailles. En typographie informatique, il est possible de
laisser l'ordinateur faire seul une homothétie.
Dans le domaine informatique, une police représente le moyen (souvent
matérialisé par un fichier) de dessiner les caractères sur un périphérique
(principalement un écran ou une imprimante). Les images informatiques sont
constitués de petits carrés (ou rectangles) de couleur uniforme ; une police
informatique est alors la donnée du dessin des caractères en pixels, ou du
moyen de le calculer.
Deux grandes méthodes sont employées pour coder une police de caractère :
- Les polices bitmap stockent la valeur de chaque pixel du dessin des
caractères. Ces polices ont un rendu parfait à la taille où elles ont été
conçues, mais se prêtent mal à un agrandissement ou une réduction.
- Les polices vectorielles stockent pour chaque caractère contour, composées
de segments de droite ou d'arcs de courbes[2] ; le moteur de rendu calcule
alors la trace du caractère sur la grille des pixels. Ces polices se
prêtent bien à un usage à n'importe quelle taille : il suffit d'appliquer
l'homothétie au contour avant d'en prendre la trace sur la grille des
pixels. En revanche, pour les toutes petites tailles, la lisibilité peut
être médiocre si le contour ne tombe pas bien sur les limites des pixels.
1.2 De la taille des polices
Il est possible de chiffrer la taille d'une police. En général, on utilise
pour ça la taille de corps, qui correspond à l'espace vertical entre le haut
des lettres montantes et le bas des lettres descendantes. Il n'est pas
nécessaire que cette mesure soit exacte : ce qui est important, c'est que
si deux polices différentes sont utilisées ensemble à la même taille, aucune
n'apparaisse, à l'oeil, significativement plus grande que l'autre.
La taille de la police est une longueur, et comme telle, se mesure avec des
unités de longueurs ; en unités SI, ce devrait être le mètre et ses
sous-multiples, mais ce n'est pas très adapté. Traditionnellement, on
utilise le point, qui vaut environ 1/72 de pouce[3], soit 0,353 mm. Dans
cette unité, les polices ont souvent une taille qui est un petit entier
sympathique : 9 à 12 pour un roman ou un journal, par exemple.
Quand on travaille avec des polices sur une grille de pixels (écran ou
imprimante), il peut être pratique de mesurer la taille de la police en
pixels. La conversion est tout à fait directe : la taille en pixels est la
taille de la police divisée par la taille d'un pixels[4].
La manière la plus courante d'exprimer la taille des pixels est de compter
combien il en tient dans un pouce. La valeur ainsi obtenue mesure la finesse
du tracé, et s'exprime en pixels par pouce. Hélas, la traduction anglaise
provoque la confusion : dot per inch (DPI), point par pouce. Il ne faut pas
se laisser tromper : dot/point ici veut dire pixel, et ne doit pas être
confondu avec le point typographique, qui vaut toujours 1/72 de pouce.
Les valeurs typiques pour la finesse sont d'environ 100 DPI pour un écran,
et 600, 1200 ou plus pour une imprimante. À noter que rien n'impose que les
pixels soient carrés, de sorte qu'un périphérique peut avoir des finesses
différentes horizontalement et verticalement. On trouve d'ailleurs assez
facilement des imprimantes qui dont du 1200 DPI horizontalement et
600 verticalement.
2. L'ancien système de polices X11
----------------------------------
2.1. Le nommage des polices
La méthode historique pour dessiner du texte à l'écran quand on utilise X11
fait faire le travail de rendu au serveur X11, éventuellement aidé par un
serveur auxiliaire (xfs). Dans ce contexte, une police est identifié par son
nom XLFD (X Logical Font Description), qui se présente ainsi :
-adobe-helvetica-medium-r-normal--25-180-100-100-p-130-iso10646-1
Voici une brève description des champs (avec des termes parfois impropres
pour un typographe) :
adobe la marque de la police (la fonderie)
helvetica le nom de la police (la famille)
medium la graisse de la police (gras ou pas)
r l'inclinaison de la police (italique, penché ou pas)
normal un paramètre d'espacement
(nil) un paramètre additionnel de style (serif/sans serif, ou bien
sur la présence de caractères de telle ou telle langue)
25 la taille de la police en pixels
180 la taille de la police en dixième de points
100 la finesse horizontale de la police en DPI
100 la finesse verticale de la police en DPI
p le type d'espacement de la police (proportionnel ou fixe)
130 la largeur moyenne des caractères, en dixième de pixels
iso10646-1 (ces deux-là vont ensemble) l'encodage de la police, c'est à
dire la correspondance entre numéro et caractère
On voit ici qu'une police X11 a dans ses paramètres tout le nécessaire pour
en calculer la taille. On peut également constater que ces paramètres sont
cohérents : 25 (pixels) / 100 (pixels par pouce) et 180 (décipoints) / 720
(décipoints par pouce) donnent dans les deux cas une taille de 0,25 pouces.
Ce que j'ai écrit ici est le nom complet d'une police bitmap qui existe sur
mon système (dans le fichier helvR18.pcf.gz). Cette police a été conçue
comme une police de 18 points (car Adobe fait de la typographie soignée, et
pas de bêtes homothéties), et dessinée sur une grille fine de 100 DPI. Il est
bien entendu possible de dessiner les mêmes caractères sur un périphérique
avec une autre finesse, et le dessin sera le même, mais ça peut ne pas être
optimalement lisible. On peut par exemple remarquer qu'il existe
-adobe-helvetica-medium-r-normal--14-100-100-100-p-76-iso10646-1 et
-adobe-helvetica-medium-r-normal--14-140-75-75-p-77-iso10646-1, qui ont la
même taille en pixels, mais ne sont pas destinées à être affichées à la même
taille réelle.
2.2. Les polices disponibles
L'utilisateur d'une station X11 peut consulter la liste des polices
disponibles avec la commande xlsfonts. Dans la liste, il y aura certainement
des polices dont la taille est 0. Ce sont des polices vectorielles, que le
serveur X11 peut afficher à la demande à n'importe quelle taille. Les
autres, celles qui ont une taille bien définie, sont des polices bitmap. Le
serveur X11 peut néanmoins être capable de les afficher à d'autres tailles
que leur taille standard, mais le résultat risque d'être moche.
Il est également possible d'explorer interactivement les polices disponibles
avec le programme xfontsel.
2.3. Comment une application réclame une police au serveur
Une application (ou un utilisateur) va rarement préciser tous les paramètres
XLFD, mais uniquement ceux qui l'intéressent. Les autres seront indiqués
avec une étoile, qui signifie que le serveur X11 doit faire au mieux avec ce
qui est disponible. C'est bien entendu au niveau des tailles que cet aspect
est le plus important : une application pour laquelle c'est la taille en
pixels qui importe précisera la taille en pixels, tandis qu'une application
pour laquelle c'est la taille réelle, physique d'affichage qui importe
précisera la taille en dixième de points.
Hélas, le serveur ne fait pas du tout au mieux : il utilise la première
police trouvée qui correspond aux critères. Il est donc important de bien
configurer l'ordre des répertoires où sont cherchées les polices.
2.4. La configuration des répertoires
Une installation normale d'X11 vient habituellement avec quatre répertoires
de polices : misc, 100dpi, 75dpi et Type1. Les trois derniers ont tendance à
contenir les mêmes polices, mais sous des formes différentes : 100dpi et
75dpi contiennent des polices bitmap dessinées respectivement pour 100 et
75 DPI, Type1 contient des polices vectorielles Type1.
Entre 100dpi et 75dpi, il faut normalement mettre en premier celui qui est
le plus proche de la finesse réelle du moniteur, qui se calcule en faisant
le quotient de sa largeur en pixels et de sa largeur mesurée avec une règle.
Entre les bitmap et les vectorielles, il n'y a pas de bon choix : si les
vectorielles viennent en premier, elles seront utilisées même aux tailles où
les bitmap existent, alors que les bitmap auraient donné un meilleur
résultat ; si les bitmap viennent en premier, elles seront utilisées avec
mise à l'échelle aux tailles où elles ne sont pas dessinées, ce qui donne de
gros pixels moches, alors que les vectorielles auraient donné un meilleur
résultat. Heureusement, les serveurs X11 modernes ont une solution pour ce
problème : ajouter « :unscaled » à la fin d'un répertoire interdit
d'utiliser les polices bitmap qu'il contient à une autre taille que leur
taille normale.
Voici donc quels ordres indiquer :
100dpi/:unscaled 75dpi/:unscaled
75dpi/:unscaled 100dpi/:unscaled
Type1/ Type1/
100dpi/ 75dpi/
75dpi/ 100dpi/
(moniteur fin) (moniteur grossier)
Ces répertoires se règlent dans la configuration du serveur X11,
/etc/X11/XFree86(-4) pour XFree86, /etc/X11/xorg.conf pour X.org, etc. Si
xfs est utilisé (ce qui se reconnaît à une entrée du style « unix/:7100 »
comme chemin de police pour le serveur X11), la configuration se trouvera
probablement quelque part dans /etc/X11/xfs/ ou /etc/X11/fs/. Bien sûr, tous
ces chemins sont susceptibles de varier selon les spécificités de
l'installation.
3. Le nouveau système de polices
--------------------------------
Depuis quelques années, un nouveau système de gestion des polices a été mis
au point, qui pallie certaines impossibilités et certains défauts de
l'ancien (et apporte ses propres défauts). La grosse différence avec
l'ancien système est que le rendu des polices est fait par le client et non
plus par le serveur.
3.1. Qui fait quoi
Le nouveau système de polices est constitué de plusieurs bibliothèques, et
il est facile de s'y perdre. Voici une liste des acteurs du système.
- RENDER est une extension au protocole X11 qui permet à un client de
manipuler des images plus subtiles que les formats traditionnels d'X11, en
particulier dotées d'un canal alpha[5], et de les afficher dans des
fenêtres. Le même effet sans RENDER aurait nécessité le transfert vers le
client de l'ancien contenu de la fenêtre, ce qui n'est pas praticable.
RENDER comporte également des fonctions pour stocker sur le serveur des
collections d'images composées uniquement d'un canal alpha (pas de
couleur), dont on devine qu'elles serviront à stocker des collections de
caractères.
- Xrender est une bibliothèque servant à écrire des clients X11 qui
utilisent l'extension RENDER.
- Freetype est une bibliothèque capable de lire les fichiers de polices de
caractères, d'en extraire les informations, et de tracer le résultat dans
une zone de la mémoire de l'ordinateur. Freetype n'a rien de spécifique à
X11.
- Fontconfig est une bibliothèque et un ensemble d'outils qui tiennent à
jour la liste des polices installées sur le système (les fichiers
fonts.cache-1), ainsi que la configuration et les préférences de
l'utilisateur (/etc/fonts/fonts.conf et ~/.fonts.conf). Du point de vue
des applications, Fontconfig permet de trouver un fichier de police
correspondant à certains critères (famille, taille, etc.). Fontconfig
utilise Freetype pour connaître les caractéristiques des polices qu'elle
rencontre. Fontconfig n'a rien de spécifique à X11.
- Xft est une bibliothèque qui fait le lien entre Xrender, Freetype et
Fontconfig : Xft utilise Fontconfig pour trouver ses polices, Freetype
pour produire le dessin des caractères, et Xrender pour les afficher à
l'écran.
3.2. Les tailles des polices avec Xft
Contrairement à l'ancien mécanisme, Xft est principalement conçu pour
travailler avec des polices vectorielles. Les subtilités de polices adaptées
aux petites tailles sont perdues. En revanche, la gestion des tailles des
polices est beaucoup plus fine.
Comme l'ancien système, Xft permet d'exprimer la taille des polices en
pixels ou en taille réelle, exprimée en points. Il est possible de s'en
rendre compte avec les deux commandes suivantes :
xfd -fa 'Helvetica:pixelsize=16' &
xfd -fa 'Helvetica:size=16' &
Comme au final, pour l'affichage à l'écran, il faut bien une taille en
pixels, Xft a besoin de connaître la finesse de l'écran. Cette information
est en fait depuis toujours disponible auprès du serveur X11, comme on peut
s'en rendre compte avec la commande xdpyinfo :
screen #0:
dimensions: 1600x1200 pixels (363x272 millimeters)
resolution: 112x112 dots per inch
Le serveur X11 lui-même a plusieurs moyens de connaître cette information.
Voici par exemple ce que fait XFree86 (et suivants), par ordre croissant de
priorité :
- Si le moniteur et la carte vidéo sont tous les deux assez récents, la
taille réelle du moniteur peut être transmise automatiquement par le
moniteur.
- Le fichier de configuration du serveur X11 peut contenir, dans la section
décrivant le moniteur, une directive DisplaySize indiquant la taille
physique réelle du moniteur.
- La finesse peut être indiquée en ligne de commande avec l'option -dpi, la
taille du moniteur en est alors déduite.
Pour le bon fonctionnement d'Xft, il est indispensable que la taille
physique du moniteur soit correctement connue du serveur X11, et donc que la
taille en millimètres indiquée par xdpyinfo soit bien la taille réelle de
l'affichage.
Certaines installations viennent avec des scripts de lancement du serveur
X11 qui ajoutent systématiquement l'option « -dpi 100 », car une obscure et
antédiluvienne bibliothèque fonctionnait mal si le serveur X11 indiquait une
autre résolution. Si c'est le cas, c'est souvent du côté de
/etc/X11/xinit/xserverrc qu'il faut chercher, ou bien de la configuration du
display manager (/etc/X11/xdm/, ./etc/gdm/, /etc/kde*/kdm/, ou que sais-je).
3.3. La configuration
Xft, par l'intermédiaire de Fontconfig, utilise les fichiers de
configuration /etc/fonts/fonts.conf (parfois ailleurs), et ~/.fonts.conf.
Ces fichiers sont en XML, le format est décrit dans la focumentation de
Fontconfig.
La principale fonction de ces fichiers est de définir des répertoires où les
polices sont cherchées. Contrairement à ce qui se passe avec l'ancien
système de polices, cette recherche descend également dans les
sous-répertoires. Quand des polices sont ajoutées à ces répertoires, ou que
de nouveaux répertoires sont ajoutés, il est nécessaire de reconstruire les
fichiers de cache (fonts.cache-1), avec la commande fc-cache. Si ce n'est
pas fait, Fontconfig le refera au moment où c'est nécessaire, mais elle
risque de ne pas avoir les droits pour écrire dans le répertoire, et
stockera le résultat dans le répertoire personnel de chaque utilisateur, ce
qui est inefficace.
Il est possible de connaître la liste des polices disponibles par fontconfig
avec la commande fc-list.
Le fichier de configuration permet également de fixer quelques préférences
sur les polices, ainsi que de définir des alias et des substitutions. Pour
tous les détails sur les possibilités, la documentation de Fontconfig est le
meilleur endroit.
3.4. Les nouvelles fonctionnalités
3.4.1. L'anti-aliasing
La principale fonctionnalité apportée par Xft par rapport à l'ancien système
de police, et à vrai dire celle qui a réellement décidé la refonte du
système de polices, c'est anti-aliasing.
L'anti-aliasing consiste simplement à mettre des pixels gris entre les
pixels blancs et les pixels noirs pour rendre moins nette la limite, et donc
adoucir l'effet d'escaliers.
3.4.2. Le sub-pixel rendering
Sur un écran à tube cathodique, les pixels sont des tâches un peu floues,
avec un peu de rouge, un peu de vert et un peu de bleu. Sur un écran à
cristaux liquides, en revanche, chaque pixel est la juxtaposition
parfaitement nette de trois sous-pixels rouge, vert et bleu. Le groupage de
ces sous-pixels par trois est assez arbitraire. Ainsi, si sur un fond noir
on trace une ligne verticale magenta (bleu+vert) et juste à côté une ligne
rouge, le résultat apparaîtra comme une ligne blanche décalée d'un tiers de
pixel.
Le sub-pixel rendering utilise cet état de fait pour affiner le rendu des
caractères sur les écrans LCD. C'est un raffinement de l'anti-aliasing.
3.4.3. Le hinting
L'utilisation de polices vectorielles a des défauts. Le principal est que le
tracé peut ne pas tomber juste. C'est particulièrement visible à petite
taille. Considérons un H qui se retrouve rendu à une taille telle que ses
deux jambes font 1,2 pixels de large. Mais le découpage par la grille des
pixels tombe ainsi : 0,1 + 1 + 0,1 pour l'une, et 0,6 + 0,6 pour l'autre.
L'affichage donnera : une tige noire d'un pixel flanquée de deux bandes gris
très clair pour l'une, et une tige gris foncé de deux pixels pour l'autre.
Ce n'est pas beau du tout.
Une police vectorielle peut embarquer, en plus des indications strictement
nécessaire pour dessiner le caractère, des indications (hints) pour guider
les arrondis à basse résolution. Ainsi, les deux jambes du H seront
arrondies de la même manière, et le résultat sera plus joli et plus lisible.
Certaines polices ne contiennent pas de hints, mais Freetype comporte des
algorithmes capables de trouver automatiquement des hints convenables. Le
résultat est bien sûr moins bon que si ça avait été fait par un humain, mais
la qualité d'affichage est nettement meilleure que sans hints du tout.
3.4.4. Unicode
L'ancien système de polices était limité à des caractères de 16 bits, ce qui
interdisait l'utilisation des plans étendus d'Unicode. Xft n'a pas ces
limitations. En revanche, Xft n'implémente pas du tout les algorithmes
subtiles pour les langues bizarres (droite à gauche, ligatures complexes) ;
d'autres bibliothèques bâties par dessus le font, à commencer par Pango.
4. Diagnostiquer un problème
----------------------------
(1) Trouver quel système de polices est utilisé. S'il y a de
l'anti-aliasing, c'est forcément Xft. Une solution souvent efficace est
d'utiliser ldd sur le programme incriminé : si libXft, libfreetype et
compagnie y apparaissent, c'est Xft. Ça permet également de voir si le
programme utilise Gtk+ (1.2 ou 2), Gnome, KDE, etc.
(2a) Si c'est l'ancien système de police, vérifier l'ordre des répertoires
dans le fontpath (xset q ; cf. 2.4).
(2b) Si c'est Xft, vérifier que la taille physique de l'écran est
correctement connue du serveur (xdpyinfo ; cf. 3.2).
(3a) Vérifier avec xfd quelle police est effectivement utilisée, regarder
avec xfontsel (ancien système uniquement) quelles variantes sont
disponibles.
(4) Si l'application dépend de Gnome ou KDE, aller fouiller dans les outils
de configuration de ces monstres. Pour Gtk+, consulter ~/.gtkrc(-2.0).
--------------------
1 : Terme mathématique désignant l'opération de mise à l'échelle fidèle
d'une figure.
2 : En général, décrites par des polynômes de degré 2 ou 3.
3 : Il existe en fait plusieurs unités appelées point. Chacune a une valeur
tout à fait précise, et toutes sont proches de 1/72 de pouce.
4 : Peu importe dans quelle unité, pourvu que ce soit la même pour mesurer
les deux.
5 : Ce qui veut dire qu'en plus de ses valeurs de rouge, vert et bleu,
chaque pixel a en plus un paramètre de transparence.
> [Article crossposté dans fcax11, fcold et fcou, suivi vers xcax11.]
>
> Ça fait pas mal de temps que je me dis qu'il faut que je rédige ça,
> pour répondre à des questions répétées sur la gestion des polices
> X11. C'est enfin chose faite. Tous les commentaires sont les bienvenus.
>
>
Salut
Génial ce post. Mais tu devrais le mettre sur un site pour qu'il soit
toujours consultable (Lea par exemple).
Bye
> Ça fait pas mal de temps que je me dis qu'il faut que je rédige ça, pour
> répondre à des questions répétées sur la gestion des polices X11. C'est
> enfin chose faite. Tous les commentaires sont les bienvenus.
Ben chapeau ! Je connaissais bonne partie de tout ça, mais ton article a le
mérite de bien tout mettre à plat. En plus c'est clair et détaillé.
Je me suis arrêté de lire avant la fin : je vais sortir ça sur l'imprimante
pour finir tranquillement dans mon fauteuil et avoir une référence sous le
coude.
Si je vois un commentaire / une correction je t'en ferai part.
En tout cas bravo, et merci.
--
Sébastien Kirche
> [Article crossposté dans fcax11, fcold et fcou, suivi vers xcax11.]
super
> Génial ce post. Mais tu devrais le mettre sur un site pour qu'il soit
> toujours consultable (Lea par exemple).
Et Google Groups ? Il sera toujours consultable.
--
Sébastien Kirche
> Nicolas George, le 2005-01-25
>
> (Toutes copies ou citations autorisés à condition d'indiquer la source.)
Ok. Quelle source on indique s'il te plait?
juste "Nicolas Georges" ?
--
L'ASPO a pour but de démocratiser l'acces a l'informatique. Une de ses
activité est l'infogerance (http://aspo.rktmb.org/activites/infogerance)
Tél: + 33 2 38 04 26 04 ou + 33 6 33 26 13 14 (France)
« Nicolas George », s'il te plaît :-) Oui, ça suffit tout à fait.
Pour répondre à d'autres messages : je compte bien mettre ça en ligne sur le
web, mais la reconstruction de ma page web est bloquée en attente de la mise
en place d'un nouveau serveur.
> [Article crossposté dans fcax11, fcold et fcou, suivi vers xcax11.]
>
> Ça fait pas mal de temps que je me dis qu'il faut que je rédige ça, pour
> répondre à des questions répétées sur la gestion des polices X11. C'est
> enfin chose faite. Tous les commentaires sont les bienvenus.
Superbe!
Je n'ai maintenant plus aucune excuse pour ne pas mettre le nez dans mes
polices..
Lionel
> [Article crossposté dans fcax11, fcold et fcou, suivi vers xcax11.]
>
> Ça fait pas mal de temps que je me dis qu'il faut que je rédige ça, pour
> répondre à des questions répétées sur la gestion des polices X11. C'est
> enfin chose faite. Tous les commentaires sont les bienvenus.
>
>
> Les polices sous Unix et X11
> ============================
>
> Nicolas George, le 2005-01-25
>
> (Toutes copies ou cita...
Merci.
Tout ceci dit précisément ce que je sentais confusément et (pour l'ordre
dans XF86Config) ce que j'ai fini par trouver par tâtonnements mais avoir
un tel document sous la main est plutôt agréable.
Pour les remarques, je verrai tout çà précisément mais ça a l'air déjà pas
mal chiadé. Vraiment pas mal.
A plus.
Je suis justement à la recherche de polices X11 pour Unicode et
particulièrement pour l'arabe !
Je suis donc preneur d'URLS à ce sujet !
DC
Nicolas George a écrit :
+1
> Je suis justement à la recherche de polices X11 pour Unicode et
> particulièrement pour l'arabe !
> Je suis donc preneur d'URLS à ce sujet !
<http://www.alanwood.net/unicode/fonts_unix.html>
--
Th. Thomas.