Le rendu de texte vous déteste


Rendu de texte: comment cela peut-il être compliqué? Cela s'avère incroyablement difficile! Pour autant que je sache, aucun système n'affiche le texte «parfaitement». Quelque part mieux, quelque part pire.

Supposons que vous vouliez du texte arbitraire avec des polices, des couleurs et des styles arbitraires, avec un support de retour à la ligne et de mise en évidence du texte. En fait, ce sont les exigences minimales pour l'affichage correct d'un texte complexe, d'une fenêtre de terminal, d'une page Web, etc.

En général, disons tout de suite: il n'y a pas de bonnes réponses consécutives, tout est beaucoup plus important que vous ne le pensez, et tout affecte tout le reste.

Nous discuterons de sujets qui ne sont pas réunis au sein d'un même concept, ce ne sont que des problèmes auxquels j'ai dû faire face pendant plusieurs années de travail sur le rendu de texte dans Firefox. Par exemple, nous ne discuterons pas trop en détail des problèmes de segmentation de texte ou de gestion de diverses bibliothèques de texte pour une plate-forme particulière, car cela ne m'intéresse pas trop.

1. Terminologie


La nature du texte est complexe et l'anglais transmet mal toutes les nuances. Pour ce document, je vais essayer de respecter les termes suivants. Veuillez noter que ces mots ne sont pas «corrects», je les trouve simplement utiles pour transmettre des concepts clés à des anglophones natifs qui n'ont aucune expérience en linguistique.

Personnages:

  • Scalaire (scalaire): scalaire Unicode, la "plus petite unité" en Unicode (c'est aussi un point de code).
  • Caractère: une grappe de graphèmes Unicode étendue (EGC), la «plus grande unité» en Unicode (potentiellement composée de plusieurs scalaires).
  • Glyphe (glyphe): l'unité atomique de rendu donnée dans une police. Il a généralement un identifiant unique dans la police.
  • Ligature: glyphe composé de plusieurs scalaires et potentiellement même de plusieurs caractères (les locuteurs natifs peuvent représenter une ligature en plusieurs caractères, mais pour une police, il ne s'agit que d'un seul caractère).
  • Emoji: glyphe «pleine couleur».

Les polices

  • Police: document qui mappe les caractères aux glyphes.
  • Écriture / écriture (script): un ensemble de glyphes qui composent une certaine langue (les polices, en règle générale, implémentent certains scripts).
  • Police manuscrite (script cursif): toute police dans laquelle les glyphes se touchent et s'écoulent les uns dans les autres (par exemple, l'arabe).
  • Couleur: valeurs RVB et alpha pour les polices (non requises dans certains cas d'utilisation, mais c'est intéressant).
  • Style: modificateurs gras et italique pour les polices (dans les implémentations pratiques, les indications, les alias et autres paramètres sont généralement également fournis).

2. Le style, la disposition et la forme dépendent-ils les uns des autres?


Voici un bref aperçu pour vous donner une idée du fonctionnement d'un pipeline de rendu de texte typique:

  1. Stylisation (analyse syntaxique du balisage, système de requête pour les polices).
  2. Mise en page (rupture du texte en lignes).
  3. Mise en forme, mise en forme (calcul des glyphes et de leurs positions).
  4. Rastérisation des glyphes requis dans l'atlas de texture / cache).
  5. Composition (copie des glyphes de l'atlas à la position souhaitée).

Malheureusement, ces étapes ne sont pas aussi simples qu'elles le paraissent.

La plupart des polices ne produisent pas réellement tous les glyphes possibles à la demande. Il y a trop de glyphes, donc les polices n'implémentent généralement qu'une lettre spécifique. Les utilisateurs finaux ne le savent généralement pas ou ne s'en soucient pas, donc un système fiable devrait se répercuter sur d'autres polices si les caractères ne sont pas disponibles.

Par exemple, bien que le balisage du texte suivant n'implique pas plusieurs polices, il est nécessaire pour un rendu correct sur n'importe quel système: bonjour मनी ب بسم 好. Nous approchons donc dangereusement du fait que l'étape 1 (stylisation) commence à dépendre de l'étape 3 (mise en forme)!

(Alternativement, vous pouvez adopter l' approche Noto et utiliser une police Uber qui contient tous les caractères. Bien que les utilisateurs ne puissent pas personnaliser la police et vous ne pouvez pas fournir une interface de texte «native» aux utilisateurs sur toutes les plates-formes. Mais supposons que vous ayez besoin d'une police plus fiable décision).

De même, pour la mise en page, vous devez savoir combien d'espace chaque morceau de texte prend, mais cela ne devient connu qu'après la mise en forme! L'étape 2 dépend-elle des résultats de l'étape 3?

Mais pour façonner, vous devez connaître la disposition et le style, donc nous semblons être coincés. Que faire?

Tout d'abord, la stylisation applique des astuces. Bien que nous voulions vraiment obtenir des glyphes complets, les scalaires sont suffisants pour le style. Si la police ne prend pas correctement en charge l'écriture, elle ne prétendra rien savoir des scalaires de cette écriture. Ainsi, vous pouvez facilement trouver la "meilleure" police comme suit:

Pour chaque symbole (EGC) de notre texte, nous interrogeons chaque police de la liste (cascade) si tous les scalaires qui composent ce symbole lui sont connus. Si oui, utilisez-les. Si nous arrivons à la fin de la liste sans résultat, nous obtenons du tofu ( , indicateur de glyphe manquant).

Vous avez probablement déjà vu un tel indicateur lors de votre rencontre avec des emoji! Étant donné que certains emojis sont en fait des ligatures de plusieurs emojis plus simples, une police peut indiquer la prise en charge d'un caractère en émettant uniquement des composants individuels. De cette façon peut littéralement ressembler si la police est "trop ​​ancienne" pour connaître la nouvelle ligature. Cela peut également se produire si vous avez une implémentation Unicode "trop ​​ancienne" qui ne connaît pas le nouveau caractère, forçant le système de style à accepter une telle correspondance partielle.

Donc, maintenant nous savons exactement quelles polices nous utiliserons, sans avoir à faire référence à la disposition ou à la forme (bien que la mise en forme puisse changer nos couleurs, plus à ce sujet dans les sections suivantes). Pouvons-nous traiter de la même manière l'interdépendance de la mise en page et de la forme? Non! Des choses comme les sauts de paragraphe vous donnent un saut de ligne difficile, mais la seule façon de façonner est à travers la mise en forme itérative!

Il est nécessaire de supposer que le texte est placé sur une seule ligne et de former cette ligne jusqu'à épuisement de l'espace. À ce stade, vous pouvez effectuer des opérations de composition et savoir où rompre le texte et commencer la ligne suivante. Répétez jusqu'à ce que tout soit fait.

3. Le texte n'est pas des caractères séparés


À en juger uniquement par l'anglais, vous pourriez penser que les ligatures sont une sorte de non-sens bizarre. Je veux dire, qui se soucie vraiment que «æ» s'écrit «ae»? Mais il s'avère que certaines langues sont essentiellement constituées entièrement de ligatures. Par exemple, ड् ب بسم se compose des caractères individuels «ب ب س م. Dans tout système de rendu de texte avancé (c'est-à-dire dans l'un des principaux navigateurs), ces deux lignes seront très différentes.

Et non: il ne s'agit pas de la différence entre les scalaires Unicode et les grappes de graphèmes étendues. Si vous demandez à un système Unicode fiable (par exemple, Swift) de donner des grappes de graphèmes étendus de cette ligne, il donnera ces cinq caractères!

La forme du caractère dépend de ses voisins: le texte ne peut pas afficher correctement caractère après caractère .

Autrement dit, vous devez utiliser une bibliothèque de mise en forme. La norme de l'industrie ici est HarfBuzz , et ces tâches sont extrêmement difficiles à résoudre par vous-même. Utilisez donc HarfBuzz.

3.1. Superposition de texte


Dans les polices manuscrites, les glyphes se chevauchent souvent pour éviter les coutures, ce qui peut provoquer des problèmes.

Jetons un autre regard sur मनी م منش. Ça a l'air normal? Maintenant augmentez:



Cela semble toujours beau, mais rendons le texte partiellement transparent. Si vous êtes sur Safari ou Edge, le texte peut sembler bien! Mais sur Firefox ou Chrome, la vue est terrible:



Le problème est que Chrome et Firefox tentent de tricher . Ils ont correctement formé le texte, mais dès qu'ils rencontrent de tels glyphes, ils essaient toujours de les dessiner séparément. Cela fonctionne généralement bien, sauf en cas de transparence et de chevauchement qui produit une telle gradation.

Une implémentation «correcte» amènera le texte sur une surface temporaire sans transparence, puis sur la scène avec transparence. Firefox et Chrome ne le font pas car cela coûte cher et n'est généralement pas nécessaire pour les principales langues occidentales. Fait intéressant, ils comprennent vraiment le problème, car ils traitent spécifiquement un tel script pour les emoji (mais nous y reviendrons plus tard).

3.2. Le style peut changer la ligature


D'accord, cet exemple que nous analysons principalement par curiosité sur la façon dont le balisage peut se briser, bien que je ne connaisse aucun scénario raisonnable où cela puisse vraiment faire mal. Voici deux morceaux de texte avec le même contenu mais des couleurs différentes:



Voici à quoi ils ressemblent dans Safari:



Voici à quoi ils ressemblent dans Chrome (lors de l'utilisation de sa nouvelle implémentation de maquette ):



Et les voici dans Firefox:



En résumé:

  • Safari est inadéquat
  • Chrome analyse les glyphes mais laisse tomber de nombreuses couleurs
  • Firefox analyse simultanément les glyphes et affiche les couleurs

Je pense que tout le monde devrait être sur Firefox, non? Mais si vous zoomez, nous verrons qu'il fait quelque chose de très étrange:



Il a simplement divisé cette ligature en quatre parties égales de couleurs différentes!

Le problème est qu'il n'y a vraiment pas de réponse raisonnable à ce qui devrait être fait ici. Nous avons divisé la ligature en différents styles, et comme la ligature est, en un sens, une «unité» de rendu, il est logique de simplement refuser de soutenir une telle séparation (comme la plupart le font).

Pour une raison quelconque, quelqu'un dans Firefox était vraiment enthousiaste à l'idée de faire une implémentation plus élégante . Son approche est de dessiner plusieurs fois une ligature avec des masques optimaux et des couleurs différentes, ce qui fonctionne étonnamment bien!

Il est logique d'essayer de prendre en charge ces «ligatures partielles»: seule la mise en forme peut savoir si une ligature particulière sera affichée, et cela dépend des polices système, de sorte que la ligature peut apparaître là où personne ne s'y attendait! Un exemple classique en anglais est une ligature æ provenant d'une police installée par l'utilisateur sur la bordure d'un lien hypertexte.

Il est également assez étrange que l'anglais puisse changer au milieu d'un mot, mais pas les polices manuscrites?

Ne vous interrogez même pas sur le code qui rompt les lignes avec des ligatures partielles.

4. Couleur et style de pause Emoji


Si vous affichez des emojis comme le fait le système natif, vous devez ignorer les paramètres de couleur du texte (à l'exception de la transparence):



Habituellement, les emojis ont leurs propres couleurs natives, et cette couleur peut même avoir une signification sémantique, comme c'est le cas avec les modificateurs de couleur de peau. De plus: ils peuvent avoir plusieurs couleurs!

Pour autant que je sache, il n'y avait pas un tel problème avant les emoji, donc différentes plates-formes ont différentes approches de résolution. Certains montrent les emojis comme une image solide (Apple), d'autres comme une série de couches monochromes (Microsoft).

Cette dernière approche n'est pas mauvaise, car elle s'intègre bien aux pipelines de rendu de texte existants, divisant «simplement» le glyphe en une série de glyphes monochromes avec lesquels tout le monde a l'habitude de travailler.

Cependant, cela signifie que lorsque vous dessinez un glyphe «unique», votre style peut changer à plusieurs reprises . Cela signifie également que le glyphe «un» peut se chevaucher, ce qui entraîne les problèmes de transparence mentionnés dans la section précédente. Pourtant, les navigateurs combinent vraiment correctement la transparence des calques dans les emojis!

Cet écart peut s'expliquer de trois manières:

  • Vous recherchez déjà des glyphes colorés pour les traiter de manière spéciale, il leur est donc facile de choisir un chemin de mise en page spécial.
  • Les polices manuscrites avec une faible transparence semblent un peu laides, mais les emojis se décomposent complètement et se transforment en un jeu de caractères illisible, donc le travail supplémentaire est justifié.
  • Les développeurs occidentaux se soucient plus des emojis que des langues comme l'arabe et le marathi.

Choisissez l'option à votre goût.

Et pourtant, comment mettre en valeur une émoticône en italique ou en gras? Ignorer ces styles? Doivent-ils être synthétisés? Qui sait ...

De plus, ces emojis ne semblent-ils pas étrangement petits?

Oui, pour une raison quelconque, un tas de systèmes augmentent secrètement la taille de la police des emojis pour les rendre plus beaux.

5. Le lissage est un enfer


Les caractères du texte sont très petits et détaillés. Il est très important que le texte soit facile à lire. Cela ressemble à une tâche de lissage! Enfer, 480p est une résolution vraiment basse. Plus de lissage !!!

Il existe donc deux types principaux:

  • Lissage en niveaux de gris
  • Lissage sous-pixel

Le lissage des niveaux de gris est une approche «naturelle». L'idée de base est que les pixels partiellement couchés obtiennent une transparence partielle. Pendant la composition, le pixel obtiendra la teinte appropriée, améliorant les détails globaux.

Le terme «nuances de gris» est utilisé pour la couleur unidimensionnelle, tout comme notre transparence unidimensionnelle (sinon les glyphes sont affichés dans une couleur unie). De plus, dans une situation typique de texte noir sur fond blanc, l'anticrénelage affiche littéralement des nuances de gris le long des bords.

L'anticrénelage de sous-pixels est une astuce qui abuse du placement normal des pixels sur les moniteurs. C'est beaucoup plus compliqué, donc si vous êtes vraiment intéressé, vous devrez lire une documentation plus détaillée, voici juste une brève description du concept de haut niveau.

Les pixels de votre moniteur sont en fait trois petites colonnes de rouge, vert et bleu. Si vous voulez devenir rouge, vous dites en quelque sorte «blanc noir noir». De la même manière, si vous souhaitez obtenir une couleur bleue, spécifiez "noir noir blanc". En d'autres termes, si vous bricolez avec des fleurs, vous pouvez tripler la résolution horizontale et obtenir beaucoup plus de détails!

Vous pourriez penser qu'un tel «arc-en-ciel» serait très moche, mais dans la pratique, le système fonctionne plutôt bien (bien que certains ne soient pas d'accord avec cela). Le cerveau humain aime reconnaître les motifs et les lisser. Néanmoins, si vous prenez une capture d'écran du texte avec un lissage de sous-pixels, vous verrez clairement toutes les couleurs supplémentaires si vous redimensionnez l'image ou si vous la regardez simplement sur le moniteur avec une disposition de sous-pixels différente. C'est pourquoi les captures d'écran avec du texte sont souvent très étranges et mauvaises.

(En général, ce système signifie également que la couleur de l'icône peut accidentellement changer sa taille et sa position perçues, ce qui est vraiment gênant).

L'anticrénelage sous-pixel est donc un hack vraiment propre qui peut améliorer considérablement l'intelligibilité du texte, tant mieux! Mais, malheureusement, c'est aussi un énorme éclat dans le cul!

Notez que des décalages de glyphe de sous - pixels se produisent dans tout système d'anticrénelage. Vous souhaitez toujours que vos glyphes pixellisés soient alignés sur des pixels entiers, mais la pixellisation elle-même est conçue pour un décalage de sous-pixel spécifique (une valeur comprise entre 0 et 1).

Pour comprendre cela, imaginez un carré noir 1x1 avec un lissage des niveaux de gris:

  • Si son décalage de sous-pixel est 0, alors juste un pixel noir sort pendant la pixellisation.
  • Si le décalage de sous-pixel est de 0,5, alors lors de la pixellisation, deux pixels ressortent à 50% de gris.

5.1. Les décalages de sous-pixels cassent le cache des glyphes


La pixellisation des glyphes nécessite une quantité de calcul incroyable, il est donc préférable de les mettre en cache dans un atlas de texture. Mais comment mettre en cache des textures avec des décalages de sous-pixels? Chaque décalage a sa propre pixellisation unique!

Ici, vous devez trouver un compromis entre la qualité et les performances, et cela peut être fait en optimisant les décalages de sous-pixels. Pour le texte anglais, un équilibre raisonnable serait le manque de précision du sous-pixel vertical avec le décalage horizontal lié au quart d'un entier. Cela ne laisse que quatre positions de sous-pixels, ce qui améliore encore considérablement la qualité tout en conservant une taille de cache raisonnable.

5.2. Les sous-pixels de lissage ne peuvent pas être composites


Une caractéristique intéressante de l'anti-aliasing dans les tons de gris est que vous pouvez jouer librement avec, et il se dégrade gracieusement. Par exemple, si vous convertissez une texture avec du texte (mise à l'échelle, rotation ou transformation), elle peut devenir un peu floue, mais elle aura l'air normale en général.

Si vous faites de même avec l'anti-aliasing sous-pixel, cela aura l'air horrible. Son idée est de manipuler les pixels de l'affichage. Si les pixels d'affichage ne correspondent pas aux pixels de votre texture, alors les bords rouge et bleu seront clairement visibles!

Vous pourriez penser que cela est «corrigé» simplement par une nouvelle pixellisation de glyphe dans un nouvel emplacement. Et en effet, si la conversion est statique, cela pourrait fonctionner. Mais si la transformation est une animation , elle s'aggravera encore.Il s'agit en fait d'une erreur de navigateur très courante: s'il ne trouve pas que l'animation se produit avec le texte, les caractères se contracteront , car chaque glyphe saute entre différentes liaisons de sous-pixels avec des indications sur chaque image.

En conséquence, les navigateurs contiennent plusieurs heuristiques pour détecter de telles animations afin de désactiver l'anti-aliasing sous-pixel pour cette partie de la page (et idéalement même le positionnement sous-pixel). Il est assez difficile de l'implémenter de manière fiable, car une animation peut être déclenchée par un JS arbitrairement complexe sans donner au navigateur de «conseils» clairs.

De plus, le lissage sous-pixel est difficile à utiliser en présence d'une transparence partielle. En fait, ici, nous configurons nos canaux R, G et B pour coder trois valeurs de transparence (une pour chaque sous-pixel), mais le texte lui-même a également une couleur et un arrière-plan, de sorte que les informations sont facilement perdues.

Lorsque vous utilisez l'anticrénelage en niveaux de gris, nous avons un canal alpha dédié, donc rien n'est perdu. Ainsi, les navigateurs utilisent généralement des nuances de gris pour travailler avec des objets translucides.

... sauf Firefox. Encore une fois, dans cette étrange organisation, quelqu'un s'est vraiment emporté et a fait quelque chose de compliqué: un composant alpha. Il s'avère que vous pouvez réellement composer correctement du texte avec un anticrénelage sous-pixel, mais cela nécessite trois canaux de transparence supplémentaires pour R, G et B.Il n'est pas surprenant qu'un tel anticrénelage double la consommation de mémoire.

Heureusement, au fil des ans, le lissage sous-pixel est devenu moins pertinent:

  • Les écrans Retina n'en ont pas du tout besoin.
  • La disposition en sous-pixels sur les téléphones bloque cette astuce (sans travail sérieux).
  • Dans les versions plus récentes de MacOS, le texte sous-pixel est désactivé par défaut au niveau du système d'exploitation.
  • Chrome semble être plus agressif pour désactiver l'anti-aliasing sous-pixel (je ne sais pas si c'est la politique exacte).
  • Le nouveau backend graphique Firefox (webrender) a abandonné le composant Alpha pour plus de simplicité.

6. Ésotérique


Cette partie n'est qu'une collection de petites choses qui ne méritent pas beaucoup de discussion.

6.1. Les polices peuvent contenir du SVG


Ça craint. Ces polices sont principalement fournies par Adobe, car il y a quelque temps, elles se sont assez bien intégrées au SVG. Parfois, vous pouvez simplement ignorer des parties de SVG (je pense que la police Source Code Pro contient techniquement certains glyphes SVG, mais en pratique, ils ne sont pas réellement utilisés par les sites Web), mais en général, vous devrez implémenter la prise en charge SVG pour prendre en charge formellement toutes les polices.

Et avez-vous entendu parler des polices animées SVG ? Non? Bon. Je pense qu'ils sont cassés ou non implémentés partout (Firefox les a accidentellement supportés pendant un certain temps en raison d'une sorte de développeur enthousiaste).

6.2. Les personnages peuvent être sacrément gros


Si vous voulez satisfaire naïvement la demande d'un utilisateur pour une très grande police (ou un très grand niveau de zoom), vous rencontrerez des problèmes extrêmes de gestion de la mémoire pour un atlas de glyphes de cette taille, car chaque caractère peut être plus grand que tout l'écran. Il existe plusieurs façons de gérer cela:

  • Refusez de dessiner un glyphe (utilisateur triste).
  • Pixelisez le glyphe dans une taille plus petite et augmentez l'échelle pendant la composition (c'est facile, mais les formes sont floues le long des bords).
  • Pixellisez le glyphe directement sur la surface après la composition (difficile, potentiellement coûteux).

6.3. La sélection n'est pas un cadre, mais le texte va dans toutes les directions


Les gens savent généralement que la direction principale du texte peut être de gauche à droite (anglais), de droite à gauche (arabe) ou de haut en bas (japonais).

Alors, voici un texte amusant pour vous:

Bonjour à tous بسم الله لا bip bip bip !!


Si vous sélectionnez du texte sur le bureau avec la souris de gauche à droite, la sélection devient intermittente et se contracte étrangement au milieu. En effet, nous mélangeons le texte sur une seule ligne de gauche à droite et de droite à gauche, ce qui se produit tout le temps.

Tout d'abord, la sélection vers la droite augmente la sélection, puis la diminue jusqu'à ce qu'elle recommence soudainement à augmenter. C'est en fait tout à fait correct: la sélection reste simplement continue sur la ligne réelle . Ainsi, vous pouvez copier correctement un morceau de texte.

Vous devez en tenir compte dans votre code pour mettre en surbrillance le texte, ainsi que dans l'algorithme de saut de ligne pour la mise en page.

Mais ce n'est pas tout.


J'espère que vous n'aurez pas à faire face à de telles choses.

6.4. Comment écrire ce qui est impossible à écrire?


Lorsqu'il n'y a pas de caractères dans la police, il serait bon d'en informer l'utilisateur. Le glyphe «tofu» est destiné à cela. Vous pouvez simplement dessiner un tofu vide (rectangle) et vous limiter à cela. Mais si vous souhaitez fournir des informations vraiment utiles, vous pouvez écrire la valeur du caractère manquant pour simplifier le débogage.

Mais attendez, nous utilisons du texte pour expliquer que nous ne pouvons pas sortir le texte? Hm.

Vous pouvez dire qu'il devrait y avoir une police de base dans le système qui affichera toujours les caractères 0-9 et AF, mais c'est une hypothèse pour les mauviettes. Si l'utilisateur a vraiment détruit ses outils avec ses outils, Firefox propose alors une issue: une micro police!

À l'intérieur de Firefox, il y a un petit tableau codé en dur de pixel art bit avec un minuscule atlas exactement de ces 16 caractères. Ainsi, lors du dessin du tofu, il peut transférer ces caractères sans se soucier des polices.



6.5. Le style fait partie de la police (sauf s'il ne l'est pas)


Les polices de haute qualité sont initialement fournies avec des styles tels que l' italique et le gras , car il n'y a pas de moyen algorithmique simple d'afficher magnifiquement ces effets.

Cependant, certaines polices sont livrées sans ces styles, vous avez donc toujours besoin d'un moyen algorithmique simple pour créer ces effets.

La détection et le traitement exacts des styles dépendent fortement du système et de mon domaine d'expertise, je ne peux donc pas l'expliquer correctement. Je voudrais simplement me plonger dans le code de gestion des polices dans Webrender .

Dans tous les cas, vous avez besoin d'un repli synthétique . Heureusement, l'implémentation est en fait assez simple:

italique synthétique: inclinez chaque glyphe.

Gras synthétique: dessinez chaque glyphe plusieurs fois avec un léger décalage dans le sens du texte.

Honnêtement, ces approches fonctionnent plutôt bien! Mais les utilisateurs peuvent remarquer que tout semble "mal". Par conséquent, vous pouvez faire mieux si vous faites un effort.

6.6. Pas de rendu de texte parfait


Chaque plate-forme a eu ses erreurs, ses optimisations et ses bizarreries depuis si longtemps qu'elles sont devenues esthétiques. Par conséquent, même si vous croyez fermement que certaines choses sont idéales ou importantes, il y aura toujours un énorme groupe d'utilisateurs avec des préférences différentes. Un système de visualisation de texte robuste prend en charge ces diverses préférences (lors du choix de valeurs par défaut raisonnables).

Vos configurations doivent prendre en compte le système de l'utilisateur, des polices spécifiques, des applications spécifiques et des textes spécifiques. Vous devriez également essayer de faire correspondre le «look» natif de chaque plate-forme (ces bizarreries).

Cela comprend:

  • Possibilité de désactiver l'anti-aliasing sous-pixel (certains le détestent vraiment).
  • La possibilité de désactiver l' anti-aliasing (oui, les gens le font).
  • Une tonne de propriétés spécifiques à la plate-forme / au format, telles que les indices, le lissage, les variations, le gamma, etc.

Cela signifie également que les bibliothèques de texte natives doivent être utilisées pour correspondre à l'esthétique de chaque système (Core Text, DirectWrite et FreeType sur leurs plateformes respectives).

7. Liens supplémentaires


Voici quelques autres articles sur le cauchemar du rendu de texte:

Source: https://habr.com/ru/post/fr469529/


All Articles