Police pixel 5x5 pour petits écrans
(maurycyz.com)- 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,MetWqui 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.hde 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é
- Elle s'appuie sur le fichier 5x6
- Le 2x2 est impossible, le 3x3 est techniquement faisable mais difficile à lire, et le 4x4 ne suffit pas pour dessiner correctement
E,MetW- 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, du0pointé, ainsi que de la distinction entreU/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
eetgplus 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,WetQen pâtissent, maisOet0restent 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,GetP, sont plus nombreuses que celles qui demandent surtout du détail vertical commeEetF, 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
Merci pour cette bonne information. Ça me donne très envie.
Comment diable voulez-vous que j’y mette du coréen ouin ouin beurk
Commentaires sur Hacker News
En utilisant le rendu sous-pixel, même du 1x5 devient tout à fait possible https://www.msarnoff.org/millitext/
[2x5-HP-Z24n-G2] https://i.imgur.com/yLyrpfg.jpeg
[1x5-HP-Z24n-G2] https://i.imgur.com/Z7kH005.jpeg
[2x5-Innolux-N156HCA-GA3] https://i.imgur.com/F4Ypxwj.jpeg
[1x5-Innolux-N156HCA-GA3] https://i.imgur.com/etkot5o.jpeg
[1] https://jp.ext.hp.com/monitors/business/z_z24n_g2/
[2] https://www.panelook.com/N156HCA-GA3__15.6__overview_33518.html
Et ça m’a aussi permis de découvrir à quel point mon écran est sale
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
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
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é
x
xxx
x
xx
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
À 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