15 points par GN⁺ 2026-04-23 | 3 commentaires | Partager sur WhatsApp
  • Une police monospacée ultra-compacte conçue pour faire tenir tous les caractères dans un carré de 5 pixels et permettre un rendu sûr sur une grille 6x6, pensée pour les petits écrans et les environnements à mémoire limitée
  • La taille 5x5 résout les problèmes de représentation de E, M et W qui restaient en 4x4, et dessine la plupart des minuscules avec 1 pixel de moins que les majuscules afin d'assurer une distinction visuelle
  • La police entière ne pèse que 350 octets, ce qui la rend bien adaptée aux microcontrôleurs 8 bits comme l'AVR128DA28, tout en offrant une excellente efficacité par pixel sur de petits écrans comme les OLED 160x128 ou 128x64
  • Même comparée à une police vectorielle rendue à une taille similaire, le résultat reste meilleur avec cette police artisanale de 350 octets, malgré l'anticrénelage et un code bien plus volumineux ainsi que davantage de données de police
  • Des essais ont aussi été menés avec des tailles encore plus petites, 3x5, 3x4, 3x3, 2x3, 3x2 et 2x2 : le 3x5 reste assez lisible, le 3x2 s'en sort mieux que le 2x3, tandis que le 2x2 s'effondre jusqu'à ressembler presque à un code secret

Police pixel 5x5

  • Conçue pour que tous les caractères tiennent dans un carré de 5 pixels et puissent être rendus sans risque sur une grille 6x6
    • Elle s'appuie sur le fichier 5x6 font-inline.h de lcamtuf, lui-même influencé par la police 8x8 du ZX Spectrum
    • Le 5x5 a été retenu comme la plus petite taille ne dégradant pas la lisibilité
  • Le 2x2 est impossible, le 3x3 est techniquement faisable mais difficile à lire, et le 4x4 ne suffit pas pour dessiner correctement E, M et W
    • En 5x5, ce problème est résolu
  • Le 5x5 permet de dessiner la plupart des minuscules avec 1 pixel de moins que les majuscules, ce qui permet de les distinguer visuellement
  • Des formats plus étroits comme le 4x5 et le 3x5 sont possibles, mais au prix de M, du 0 pointé, ainsi que de la distinction entre U / V / Y
  • Uniformiser la largeur de tous les caractères simplifie la programmation
    • À l'écran, la longueur d'une chaîne se calcule toujours comme 6 fois le nombre de caractères
    • Pas besoin de craindre qu'un "8978" soit plus long qu'un "1111" et fasse déborder la mise en page
  • La taille totale de la police n'est que de 350 octets, ce qui convient bien aux microcontrôleurs 8 bits comme l'AVR128DA28
    • Le texte indique que l'AVR128DA28 dispose de 16 kB de RAM
    • Ces puces sont bon marché, sobres en énergie et robustes, mais disposent de peu de marge pour le traitement graphique
  • Même un écran 384x288 représente environ 110 000 pixels, trop pour tenir dans la mémoire d'un AVR
    • À la place, des écrans plus petits comme les OLED 160x128 ou 128x64 sont plus pratiques et moins coûteux
    • Sur ce type d'écran, une police pixel optimisée dessinée à la main est avantageuse
  • Une police vectorielle rendue à une taille comparable est aussi mise en comparaison
    • Cette police vectorielle fait en réalité 6 pixels de haut, mais ses lettres sont plus étroites
    • Malgré l'anticrénelage, plusieurs mégaoctets de code et 1 Mo de données de police, le résultat reste inférieur à celui de cette police artisanale de 350 octets

Écran réel et essais à des tailles encore plus petites

  • Les pixels réels ne sont pas parfaitement carrés, donc l'affichage à l'écran ne correspond pas exactement au rendu montré en haut
    • L'effet pseudo-ombre portée créé par les sous-pixels est jugé positif
    • Cet effet disparaît sur les écrans noir et blanc, mais le rendu semble tout de même plus doux qu'attendu
  • L'espace entre les pixels rend e et g plus convaincants visuellement
    • À partir de cet effet, l'exploration de polices encore plus petites se poursuit
  • Le 3x5 n'est pas la résolution minimale absolue sans compromis, mais reste franchement lisible
    • À cette taille, il existe 32 768 glyphes, dont 27 904 sont distincts
    • M, W et Q en pâtissent, mais O et 0 restent différenciables
    • Cela peut devenir une option lorsqu'il faut afficher 50 % de colonnes en plus
  • En 3x4, cela reste lisible, mais avec des contraintes plus fortes
    • Il y a 4 096 glyphes, dont 3 392 distincts
    • À cette taille, on ne peut plus distinguer majuscules et minuscules, donc un seul style est choisi selon ce qui convient le mieux à l'espace disponible
    • Le rendu des chiffres se dégrade aussi, mais cela reste exploitable
  • En 3x3, la perte est la plus forte sur les chiffres
    • Il y a 512 glyphes, dont 400 distincts
    • Les lettres restent identifiables dans une certaine mesure sans doublons
    • Une fois affichée sur le matériel réel, cette police s'améliore nettement
  • Le 2x3 devient presque excessif
    • Il y a 64 glyphes, dont 44 distincts
    • La plupart des lettres sont difficiles à reconnaître et les doublons sont nombreux
    • La dernière ligne est "Hello World"
  • Le 3x2, avec son ratio inversé, s'en sort bien mieux que le 2x3
    • À cette taille aussi, il y a 64 glyphes, dont 44 distincts
    • Les lettres qui demandent du détail horizontal, comme M, W, N, Q, G et P, sont plus nombreuses que celles qui demandent surtout du détail vertical comme E et F, ce qui joue en sa faveur
    • La dernière ligne est "you can probably read this" ; en plissant les yeux ou en réduisant l'image, on peut la lire
  • Le 2x2 n'est conservé que comme comparaison de complétude
    • En théorie, il existe 16 images possibles en 2x2, mais l'une est vide et cinq autres ne sont que des copies obtenues en décalant d'autres glyphes, si bien qu'il n'en reste réellement que 10
    • C'est suffisant pour représenter tous les chiffres, mais comme cela ne ressemble plus à leur forme d'origine, on est plus proche d'un code secret que d'une police

3 commentaires

 
tangokorea 2026-04-23

Merci pour cette bonne information. Ça me donne très envie.

 
tangokorea 2026-04-23

Comment diable voulez-vous que j’y mette du coréen ouin ouin beurk

 
GN⁺ 2026-04-23
Commentaires sur Hacker News
  • En utilisant le rendu sous-pixel, même du 1x5 devient tout à fait possible https://www.msarnoff.org/millitext/

  • Le 5x5 est plutôt bon, et le 3x5 n’est pas mauvais non plus, mais aucun des deux ne couvre tout l’ASCII
    Il y a aussi une légère illusion sur la taille réelle : dès qu’on ajoute l’espacement entre les caractères, il faut en pratique une grille de 6x6 ou de 4x6
    C’est pour ça que j’aime beaucoup Spleen de https://github.com/fcambus/spleen
    On y trouve une police 5x8 avec prise en charge de tout l’ASCII, et la plupart des glyphes sont en réalité du 4x8 avec espacement horizontal inclus
    Dans mon projet, je l’ai modifiée pour que tous les glyphes soient en 4x8, ce qui m’a permis d’obtenir un rendu agréable sur une grille 5x9 tout en garantissant systématiquement un espacement horizontal et vertical d’un pixel entre chaque caractère

    • Parmi les traitements de texte pour Apple II du début des années 1980, il y en avait réellement qui utilisaient en mode graphique une police 5x5 afin d’afficher 60 colonnes sur l’écran standard de 40 colonnes, et c’était même un argument de vente
      Pour résoudre ça matériellement, il suffisait d’acheter une 80 column card afin d’avoir un vrai mode texte 80 colonnes, à condition que le moniteur l’accepte
  • La plupart des polices ultra-petites sont franchement atroces à lire en rendu 1:1
    Quand je faisais autrefois un mod de jeu, j’avais besoin d’une police minuscule et très compacte, donc j’ai beaucoup testé du 3x3, du 3x5 et même du 2x5, mais tout était vraiment trop difficile à lire
    J’ai fini par trouver Gremlin-3x6 de zephram, qui avait un pixel de hauteur en plus mais restait très compact horizontalement
    Surtout, les lettres latines standard restaient bien distinctes et c’était lisible sans devoir agrandir fortement
    Malheureusement, zephram a supprimé son compte FontStruct et toutes ses polices ont disparu, mais j’ai laissé une copie avec la licence CC0 dans le dépôt de mon mod, et on peut voir le rendu réel dans les captures d’écran
    [0] - https://fontstruct.com/fontstructions/show/1488093
    [1] - https://codeberg.org/janAkali/isaac-extended-icons-mod/src/branch/master/assets/fonts
    [2] - https://codeberg.org/janAkali/isaac-extended-icons-mod/media/branch/master/assets/screenshots/screenshot.png

    • Le lien [0] renvoie maintenant une 404
  • Il y a aussi eu des discussions similaires du côté des caractères CJK
    https://chinese.stackexchange.com/questions/16669/lowest-pixel-resolution-needed-to-support-chinese

  • Si l’auteur voit ceci, il vaudrait mieux ajouter un pixel au-dessus de la barre horizontale du t minuscule
    Dans sa forme actuelle, il ressemble beaucoup trop à un T majuscule
    Cela dit, l’ensemble est vraiment très réussi, merci de l’avoir partagé

    • Moi, je ferais le t minuscule comme ceci
      x
      xxx
      x
      xx
    • Et je pense que le l minuscule ressemblerait plutôt à ceci
      xx
      x
      x
      x
      xx
  • Il a été dit qu’en 4x4 on n’avait pas assez de place pour dessiner correctement E, M, W, mais en réalité même le 5x5 ne suffit pas pour dessiner correctement le e
    Si on veut que les minuscules soient plus basses que les majuscules, il faut au minimum 6 pixels en hauteur, et pour intégrer correctement les descendantes il en faut au moins 7
    Techniquement, 8 serait encore mieux pour distinguer des lettres comme g et y qui franchissent la ligne de base tout en gardant des descendantes horizontales distinctes, mais ici un compromis semble acceptable
    Et en pratique, si on veut aussi un espacement visible sous et à côté des lettres, il faut au final au moins 8x6 pixels par caractère

    • Si l’on peut vraiment réduire une police à ce point, la première propriété à laquelle je renoncerais serait sans doute la règle selon laquelle les minuscules doivent être plus basses que les majuscules
    • Le e dans la partie real pixels de l’exemple me paraît même meilleur
      À mes yeux, l’espace vide du haut est suffisamment comblé pour que la lettre se lise, et dans une phrase longue le contexte devrait largement suffire
      Bien sûr, ce n’est pas parfait, et dans l’exemple agrandi aux pixels bien nets en haut l’étrangeté se remarque davantage
  • Si au lieu de n’utiliser que deux états on/off pour les pixels on utilise un niveau de gris à plusieurs niveaux, on peut produire du texte lisible à des tailles encore plus petites
    Mais ici, le point important est qu’on parle de text et non de letters
    Même si chaque lettre prise isolément est trop floue, l’humain finit par lire en déduisant grâce au contexte
    Cette méthode n’exige même pas forcément une police spécialement conçue pour cela
    Exemple : https://imgur.com/a/text-80-characters-per-line-240-pixels-wide-AlYrnSS
    Ici, même en comptant l’espacement entre les lettres, on n’est qu’à une moyenne d’environ 3 pixels de large par caractère

  • Le système d’exploitation LAP6 du mini-ordinateur LINC incluait une police 4x5, mais sans minuscules

  • Ça me rappelle les tentatives d’implémenter 80 colonnes en logiciel sur C64
    Le principe utilisait une grille de 3x7 pixels en réservant une ligne et une colonne pour l’espacement, et certaines implémentations commerciales ont réellement existé
    https://www.pagetable.com/?p=901
    Il n’est pas simple de concevoir un jeu de caractères 4×8 qui soit à la fois lisible et agréable à regarder, et comme il faut un espacement d’un pixel entre les lettres, la largeur utile tombe en pratique à seulement 3 pixels
    C’est pour ça que des caractères comme M ou N sont particulièrement délicats

  • Il a été dit qu’on pouvait faire du 4x5 ou du 3x5 à condition d’abandonner le M, le zéro pointé et de moins bien distinguer U/V/Y, mais pour ma part je trouve que le 3x5 est déjà tout à fait pratique
    https://robey.lag.net/2010/01/23/tiny-monospace-font.html