Émoji et autres caractères en couleur sous Linux

Ces derniers temps, les émoji se multiplient sur Internet. Depuis que la majorité des téléphones permettent de les saisir relativement facilement :

Passons sur le fait que Microsoft ait choisi de classer les singes, coccinelles et autres animaux dans la catégorie « nourriture » (ou en tout cas « pizza »). Les téléphones permettent tous aujourd'hui de parsemer n'importe quel texte d'émoji, et ça commence à se voir un peu partout sur Internet.

Même si je ne suis pas fan du pourrissage de l'enrichissement d'Unicode avec ces pelletées d'émoji, ils sont là, il faut le reconnaitre, et agir en conséquence. Je ne vais pas me contenter indéfiniment de zigouigouis en noir et blanc en signe de protestation, surtout que c'est pas ça qui fera changer le monde.

Comment faire

Donc voilà. Contrairement à ce que beaucoup pensent, il est assez simple de voir des émoji en couleur sous Linux. Simple à faire, mais pas évident à deviner, surtout si vous voulez que ça fonctionne non seulement dans Firefox, mais dans tout le système.

Firefox 50

Firefox 50 n'était pas sorti au moment où j'ai écrit ce billet, et comme j'attendais une correction de bug sur LinuxFR pour l'y poster, ça a rendu le billet un peu obsolète, mais pas complètement.

Si votre système ne dispose d'aucune fonte proposant des émoji en couleur, alors Firefox 50 utilisera automatiquement des émoji embarqués. Il n'y a donc rien à faire.

Chromium, et le reste du système

Cependant, si vous voulez aussi profiter des émoji dans Chromium, vos applications Qt5, et les applications Gtk, alors tout se complique.

En effet, il y a deux trois une tripotée de standards pour inclure des couleurs dans les polices de caractères, et bien sûr le standard le plus intelligent (SVGOpenType, où les émoji sont décrits en SVG) n'est supporté que par Firefox, mais pas par Chromium, Qt5 ou Gtk (enfin Cairo) qui eux ont choisi d'utiliser un standard à base de bitmaps embarqués dans la fonte. Ça me semble absurde, mais je ne suis pas un expert et j'imagine qu'ils avaient de bonnes raisons de faire ce choix.

Le problème, c'est que Firefox gère ces fontes, mais mal. C'est à dire qu'il affiche les émoji contenus, mais considère qu'ils ont une hauteur bien plus grande que les autres caractères, ce qui rend tout moche.

L'autre problème, c'est que si une de ces fontes est installée, Firefox n'estimera plus nécessaire d'utiliser sa propre police embarquée, et utilisera celle qu'il gère mal à la place.

FreeType

Il n'y a donc pas trente-six solutions, mais heureusement FreeType nous permet de gérer tous ces cas assez finement.

L'idée, c'est d'installer une fonte compatible avec Firefox (SVGinOT), une fonte compatible avec le reste (PNGinOT) et de dire à FreeType de 

  1. Inclure la fonte SVGinOT avant toute autre pour Firefox (et Thunderbird)
  2. Inclure la fonte PNGinOT avant toute autre pour toutes les autres applications

Malheureusement, l'étape 1 est nécessaire même avec Firefox 50 puisque comme je le disais plus haut, s'il détecte une fonte qui contient des émoji couleurs (ce que fera l'étape 2) alors Firefox n'utilisera pas ses émoji internes.

Les polices que je vous propose sont les suivantes 

  1. SVGinOT pour Firefox : EmojiOne Color (c'est d'ailleurs celle qui a été choisie pour Firefox 50).
  2. PNGinOT pour tout le reste : Noto Color Emoji (une police de Google)

Je vous laisse trouver comment les installer sur votre système, pour ma part sous Arch Linux la commande suivante a fait l'affaire :

yaourt -S emojione-color-font noto-fonts-emoji

Une fois ces polices installées, vous verrez qu'absolument rien n'a changé sur votre système, et que vous avez toujours droits aux petits trucs tout moches en noir et blanc. Eh oui, votre système contient déjà une police (DejaVu certainement) qui contient ces émoji tout pourris, c'est donc elle qui est utilisée.

Vous devez donc impérativement toucher à votre configuration FreeType. Le plus simple pour cela reste d'ajouter un fichier au dossier (à créer s'il n'existe pas encore) $HOME/.config/fontconfig/conf.d que vous pourriez nommer par exemple 42-color-emoji.conf

Sans plus attendre, voici le contenu de ce fichier :