Niveau bas C – Texte affiché pixel par pixel

Je travaille sur un petit projet où je dois écrire une application de bas niveau. J’aimerais afficher du texte dans cette application et j’aimerais même qu’il soit anti-aliasé (à la manière de ClearType). Aucune bibliothèque autorisée, je dois dessiner chaque caractère pixel par pixel.

Quelle est la meilleure façon de procéder? Pouvez-vous recommander des algorithmes connus? Comment dois-je stocker / lire les fonts?

Merci!

Vous voulez simplement lisser les bords d’une police bitmap existante? C’est facile si votre police d’origine est 16×32 et que vous souhaitez la rendre au format 8×16 ou quelque chose du genre, mais si vous n’avez pas de bitmap à haute résolution pour commencer, le lissage est une opération hautement non sortingviale qui nécessite beaucoup de conjectures. Dans ce cas, je chercherais l’algorithme 2xsai (qui donne des résultats visuellement satisfaisants pour ce genre de chose) et l’effectuerais tout d’abord pour 2xsai la 2xsai la police afin d’obtenir une résolution double, puis la redimensionner avec un algorithme de moyenne pixel de destination de la moyenne d’un carré de 4 pixels).

Je vous recommanderais également de sauvegarder votre police bitmap finale “anti-aliasée” et de l’utiliser simplement dans votre programme, plutôt que d’effectuer tout ce travail à l’exécution.

Mettre tous ensemble

Il existe deux types principaux de fonts:

1) Monospace: tous les caractères ont une taille fixe et vous définissez un bitmap pour chacun. Pas besoin d’anti-aliasing (vous pouvez coder en dur les niveaux de gris dans le bitmap). Regardez horrible quand redimensionné.

2) Type vrai: chaque lettre est définie par un ensemble de parameters pour les courbes de Bézier. Peut être facilement ajusté à n’importe quelle taille, mais nécessite beaucoup de logique de programme (et de puissance de traitement!). L’anti-aliasing est utile ici (et en particulier les techniques de rendu sous-pixel).

Comme je vois que vous voulez utiliser la police bitmap et le redimensionnement? Vous pouvez simplement en pré-calculer plusieurs, évitant ainsi une logique d’exécution complexe.

Comme R. l’a suggéré, conserver les bitmaps à une résolution plus élevée en niveaux de gris au lieu de BW aidera. Je suggérerais d’utiliser une taille divisible par la plupart des petits nombres, afin que l’image bitmap puisse être facilement réduite. De plus, si cette résolution est suffisamment élevée, vous pouvez la conserver en BW et la réduire au niveau de gris (en utilisant l’intégrale de surface).

EDIT: n’hésitez pas à le modifier et ne votez pas s’il vous plaît. Il suffit de mettre tous ces commentaires ensemble.

Il est difficile de créer un bon moteur de fonts, en particulier si vous avez besoin de mettre à l’échelle et d’anti-aliasing. Donc, je vous suggère de prendre le chemin facile:

  1. Choisissez les fonts et les tailles que vous souhaitez utiliser.
  2. Générez une police bitmap pour chaque combinaison police / taille à utiliser. Cela peut être fait avec un outil tel que Bitmap Font Generator .
  3. Utilisez les fonts bitmap dans votre programme. Le blitting de bitmaps devrait être relativement facile.

Si vous souhaitez davantage de fonctionnalités, je vous suggère d’utiliser un moteur tel que FreeType avant de créer votre propre solution.

Bien, lire une police TTF (ou toute autre police) et restituer un glyphe dans le bitmap n’est pas si difficile, étant donné que vous connaissez des informations sur le rasterization et les courbes de Bézier. L’inconvénient est que si vous voulez que le texte soit beau, il va falloir une énorme quantité de code. La police aliasée est assez difficile à rendre, je ne parle pas de laisser entendre. Il doit y avoir une routine pour le crénage, des séquences multi-caractères, quelque chose qui décide quels glyphes sont mappés à vos personnages, ainsi que l’encodage de choses, …

Vous voudrez peut-être utiliser une police bitmap, qui est pré-rendue – l’opération de rendu complète est alors une simple copie d’image, éventuellement assortie d’un nouvel échantillonnage ou d’une rotation; mais bon, vous perdez les caractéristiques de la police vectorielle.

Mon conseil est de prendre FreeType et de vivre avec, c’est une belle bibliothèque juste pour cela, et peut être lié statiquement et débarrassé de toute obstruction inutile très facilement.