Afficher la police TrueType pour Arduino
Lisez TrueType (.TTF) à partir de FS (Ex. SD / SPIFFS / FATFS) et écriture FrameBuffer.
- Lisez les fichiers TrueType (format 'cmap').
- Écrivez n'importe quelle chaîne sur FrameBuffer de l'utilisateur.
- Prend en charge les "glyphes simples" et une partie des "glyphes composés".
- Réglez la taille de la police, la position, la couleur, l'espacement, la rotation.
- Centres centrés et droits. En obtenant la longueur de la chaîne.
- Lisez la table «Kern» (Format0) et Kerning.
- Arrangez-vous magnifiquement les personnages basés sur la table «HMTX».

Manuel de référence TrueType ™
https://developer.apple.com/fonts/truetype-reference-manual/
La bibliothèque native pour STM32 est ici.
Code standard
//TrueType class declaration
truetypeClass truetype = truetypeClass();
uint8_t *framebuffer;
void setup() {
//Prepare a frame buffer
framebuffer = (uint8_t *)calloc(sizeof(uint8_t), FRAMEBUFFER_SIZE);
//Read TrueType file
//Example in SPIFFS
//I think that SD, FATFS and other codes will be almost the same
SPIFFS.begin(true);
File fontFile = SPIFFS.open("/FONTFILE.ttf", "r");
//Set framebuffer array in TrueType class
//Pay attention to the format of the framebuffer
truetype.setFramebuffer(DISPLAY_WIDTH, DISPLAY_HEIGHT, 4, 0, framebuffer);
//Initial reading of ttf files
if (!truetype.setTtfFile(fontFile)) {
Serial.println("read ttf failed");
return;
}
//TrueType class string parameter settings
truetype.setCharacterSize(100);
truetype.setCharacterSpacing(0);
truetype.setTextBoundary(10, DISPLAY_WIDTH, DISPLAY_HEIGHT);
truetype.setTextColor(0x00, 0x00);
//Write a string to the framebuffer
truetype.textDraw(10, 10, "The quick brown fox jumps over the lazy dog");
//Export framebuffer to screen
FLASH_TO_SCREEN();
//end
truetype.end();
}
API
uint8_t Setttffile (fichier _file, uint8_t _checkchecksum = 0);
- Définissez le fichier TTF Lire à partir de SD, SPIFFS, FATFS, etc.
- Fichier _file: fichier ttf.
- Retour: 1 = Lire réussi, 0 = Lire l'échec.
void setFrameBuffer (uint16_t _frameBufferwidth, uint16_t _framebufferheight, uint16_t _framebuffer_bit, uint8_t _frameBufferDirection, uint8_t * _frameBuffer);
- Paramètres FrameBuffer.
- uint16_t _FrameBufferwidth: framebuffer largeur.
- uint16_t _frameBufferheight: framebuffer huit.
- uint16_t _framebuffer_bit: le nombre de bits par pixel. (1,4,8bit implémenté)
- uint8_t _frameBufferDirection: orientation bit.
- uint8_t * _frameBuffer: pointeur framebuffer.
- Si vous voulez qu'il corresponde à votre propre FrameBuffer, modifiez la fonction AddPixel. Si vous ajoutez du code, partagez-le!
void setCharAtterspacing (int16_t _CharAtterspace, uint8_t _kerning = 1);
- Définir la largeur entre les caractères.
- INT16_T _CHARACTERSPACE: Valeur de largeur entre les caractères.
- uint8_t _kerning: lire et utiliser la table ttf 'kern'. 1: 'Kern' + _Characterspace. 0: _Characterspace.
void setCharAtteTize (uint16_t _CharAtteTize);
- Réglage de la taille des polices.
- uint16_t _Charactesize: hauteur du caractère.
void setTextBoundary (uint16_t _start_x, uint16_t _end_x, uint16_t _end_y);
- Définition de la plage de chaîne.
- Les axes de coordonnées tournent avec "Settextrotation"
- uint16_t _start_x: le point de départ x de la chaîne de caractères lorsqu'une rupture de ligne se produit.
- uint16_t _end_x: le point final x lors de la rupture d'une ligne.
- uint16_t _end_y: le point final y lors de la rupture d'une ligne.
void setTextColor (uint8_t _online, uint8_t _inside);
- Paramètre de couleur du texte.
- uint8_t _online: couleur de contour du caractère.
- uint8_t _inside: couleur de remplissage de texte.
void settextrotation (uint8_t _rotation);
- Rotation du texte
- Faites tourner avec les axes de coordonnées. L'image est l'image suivante.

uint8_t _rotation: angle de rotation.
- (Rotate_0 / rotate_90 / rotate_180 / rotate_270)
void textdraw (uint16_t _x, uint16_t _y, const wchar_t _character []);
- Écrivez une chaîne sur le framebuffer.
- uint16_t _x: point de démarrage de la chaîne x.
- uint16_t _y: point de démarrage de la chaîne y.
- const wchar_t _character []: pointeur de chaîne (caractère double-octet).
void textdraw (uint16_t _x, uint16_t _y, const char _character []);
- Écrivez une chaîne sur le framebuffer.
- uint16_t _x: point de démarrage de la chaîne x.
- uint16_t _y: point de démarrage de la chaîne y.
- const char _character []: pointeur de chaîne (caractère à un octet).
void textdraw (uint16_t _x, uint16_t _y, const string _string);
- Écrivez une chaîne sur le framebuffer.
- uint16_t _x: point de démarrage de la chaîne x.
- uint16_t _y: point de démarrage de la chaîne y.
- const string _string: string pointer (type de chaîne).
uint16_t getStringWidth (const wchar_t _character []);
- const wchar_t _character []: pointeur de chaîne (caractère double-octet).
- Retour: la longueur de la chaîne. Les ruptures de ligne automatique ne sont pas prises en compte.
- Peut être utilisé pour le centre d'alignement du texte / à droite.
uint16_t getStringWidth (const char _character []);
- const char _character []: pointeur de chaîne (caractère à un octet).
- Retour: la longueur de la chaîne. Les ruptures de ligne automatique ne sont pas prises en compte.
- Peut être utilisé pour le centre d'alignement du texte / à droite.
uint16_t getStringWidth (const string _string);
- const string _string: string pointer (type de chaîne).
- Retour: la longueur de la chaîne. Les ruptures de ligne automatique ne sont pas prises en compte.
- Peut être utilisé pour le centre d'alignement du texte / à droite.
vide end ();
- Fermer le fichier de police.
Format framebuffer
Orientation du bit lors du stockage d'informations pour plusieurs pixels par octet du FrameBuffer.
Les types de FrameBuffers sont largement divisés selon cette direction.
Actuellement pris en charge: horizontal - 1,4,8bit
Horizontal
Exemple avec 1 bits / 1pixel

Verticale
Exemple avec 1 bits / 1pixel

Originalité
- Correction du problème que certains fichiers de police ne peuvent pas être lus.
- Manipulation des courbes de Bezier.
- Il prend en charge les courbes de Bezier jusqu'à la 3e commande, mais la 4e commande et au-dessus est dessinée sous forme de lignes droites.
- Tirer la couleur et la couleur de remplissage peut être définie individuellement.
- Prend en charge l'écriture dans les tableaux. Les polices sont dessinées sous une forme de FrameBuffer (tableau Uint8_T).
- Kerning en lisant la table «Kern».
- Lisez la table «HMTX» et réglez la disposition.
- Processus de remplissage efficace.
Travail futur
Trueype
- Support complet pour les "glyphes composés"
- Diversification des formats Framebuffer pris en charge.
- Seule la prise en charge du format «CMAP» 4 et le format «Kern» est prise en charge.
- Correction que certains fichiers ne peuvent pas être lus.
- Impossible de lire le fichier TTF si le nom du fichier est long (STM32F103).
- Lecture plus rapide des glyphes.
- Diminuer l'utilisation de SRAM.
- Gestion de la courbe de Bezier (lorsqu'il est dépassé 3 dimensions. Actuellement, traitement provisoire).
Dessiner Framebuffer
- Texte de la droite
- Souligner
Contrôleur confirmé
- ESP32 (conseil)
- STM32F103C8T6 (BOARD)
Démo
- Couleur complète
- Démo ili9341
- Démo SSD1331
- Mono
- Démo SSD1306
- Waveshare E-Paper 2,9 pouces démo
- Waveshare E-Paper 7,5 pouces (b) Demo
Note
N'hésitez pas à publier des bogues ou des idées de correctifs et d'améliorations!
Confirmez le droit d'auteur du fichier de police. Je n'ai pas distribué de fichiers de police.
Il est basé sur le code de GarretLab et changé.
https://github.com/garretlab/truetype
https://garretlab.web.fc2.com/arduino/lab/truetype/