Exibir fonte TrueType para Arduino
Leia o TrueType (.ttf) de FS (Ex. SD/SPIFFs/GAFS) e escreva o FrameBuffer.
- Leia os arquivos TrueType ('cmap' format4).
- Escreva qualquer string no Framebuffer do usuário.
- Suporta "glifos simples" e parte de "glifos compostos".
- Defina o tamanho da fonte, a posição, a cor, o espaçamento, gire.
- Cordas centralizadas e alinhadas direito. Obtendo o comprimento da corda.
- Leia a tabela 'Kern' (Format0) e Kerning.
- Organize os caracteres lindamente com base na tabela 'HMTX'.

Manual de referência TrueType ™
https://developer.apple.com/fonts/truetype-reference-manual/
A biblioteca nativa do STM32 está aqui.
Código padrão
//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 (arquivo _file, uint8_t _checkCheckSum = 0);
- Defina o arquivo TTF lido de SD, SPIFFs, GAFS, etc.
- Arquivo _File: arquivo TTF.
- Retorno: 1 = Leia bem -sucedido, 0 = Leia a falha.
void setFrameBuffer (uint16_t _frameBufferWidth, uint16_t _frameBufferHeight, uint16_t _framebuffer_bit, uint8_t _frameBufferDirection, uint8_t *_framebuffer);
- Configurações de estrutura.
- uint16_t _frameBufferWidth: Largura do quadro.
- uint16_t _frameBufferHeight: Framebuffer oito.
- uint16_t _frameBuffer_bit: o número de bits por pixel. (1,4,8bit implementado)
- uint8_t _frameBufferDirection: Orientação de bits.
- Consulte o formato FrameBuffer
- uint8_t *_frameBuffer: ponteiro de estrutura.
- Se você deseja que ele corresponda ao seu próprio FrameBuffer, edite a função AddPixel. Se você adicionar código, compartilhe -o!
Void setCharactersPacing (int16_t _Characterspace, uint8_t _kerning = 1);
- Definindo a largura entre os caracteres.
- INT16_T _Characterspace: Valor da largura entre caracteres.
- uint8_t _kerning: Leia e use a tabela TTF 'Kern'. 1: 'kern' + _Characterspace. 0: _Characterspace.
void setCharactersize (uint16_t _Charactersize);
- Configuração do tamanho da fonte.
- uint16_t _Charactersize: altura do personagem.
void setTextBoundery (uint16_t _start_x, uint16_t _end_x, uint16_t _end_y);
- Configurando o intervalo de string.
- Os eixos de coordenadas giram com "setTextrotation"
- uint16_t _start_x: o ponto de partida X da sequência do caractere quando ocorre uma quebra de linha.
- uint16_t _end_x: o ponto final x ao quebrar uma linha.
- uint16_t _end_y: o ponto final y ao quebrar uma linha.
void setTextColor (uint8_t _online, uint8_t _inside);
- Configuração de cores de texto.
- UINT8_T _ONLINE: Cor de contorno do caractere.
- UINT8_T _inside: Text Preefl Color.
void setTexTrotation (uint8_t _rotation);
- Rotação de texto
- Gire junto com os eixos de coordenadas. A imagem é a seguinte imagem.

uint8_t _rotation: ângulo de rotação.
- (Girate_0/girate_90/girate_180/girate_270)
void textDraw (uint16_t _x, uint16_t _y, const wchar_t _character []);
- Escreva uma string no Framebuffer.
- UINT16_T _X: String Ponto de início x.
- UINT16_T _Y: String de ponto de partida y.
- const wchar_t _character []: ponteiro de string (caractere de duplo byte).
void textDraw (uint16_t _x, uint16_t _y, const char _character []);
- Escreva uma string no Framebuffer.
- UINT16_T _X: String Ponto de início x.
- UINT16_T _Y: String de ponto de partida y.
- const char _character []: ponteiro de sequência (caractere de bytes único).
void textDraw (uint16_t _x, uint16_t _y, const string _string);
- Escreva uma string no Framebuffer.
- UINT16_T _X: String Ponto de início x.
- UINT16_T _Y: String de ponto de partida y.
- Const String _String: String Pointer (tipo de string).
uint16_t getStringWidth (const wchar_t _character []);
- const wchar_t _character []: ponteiro de string (caractere de duplo byte).
- Retorno: o comprimento da string. Quebras automáticas de linha não são consideradas.
- Pode ser usado para o centro de alinhamento de texto/direita.
uint16_t getStringWidth (const char _character []);
- const char _character []: ponteiro de sequência (caractere de bytes único).
- Retorno: o comprimento da string. Quebras automáticas de linha não são consideradas.
- Pode ser usado para o centro de alinhamento de texto/direita.
uint16_t getStringWidth (const String _String);
- Const String _String: String Pointer (tipo de string).
- Retorno: o comprimento da string. Quebras automáticas de linha não são consideradas.
- Pode ser usado para o centro de alinhamento de texto/direita.
vazio final ();
- Feche o arquivo de fonte.
Formato Framebuffer
Orientação de bits ao armazenar informações para vários pixels por byte do Framebuffer.
Os tipos de combustíveis de estrutura são amplamente divididos de acordo com essa direção.
Atualmente suportado: Horizontal - 1,4,8bit
Horizontal
Exemplo com 1 bit / 1pixel

Vertical
Exemplo com 1 bit / 1pixel

Originalidade
- Corrigido o problema que alguns arquivos de fonte não puderam ser lidos.
- Lidar com curvas bezier.
- Ele suporta até as curvas Bezier de 3ª ordem, mas a 4ª ordem e acima são desenhadas como linhas retas.
- Cor de contorno e a cor de preenchimento pode ser definida individualmente.
- Suporta escrever para matrizes. As fontes são desenhadas em algum tipo de estrutura (matriz uint8_t).
- Kerning lendo a mesa 'Kern'.
- Leia a tabela 'hmtx' e ajuste o layout.
- Processo de enchimento eficiente.
Trabalho futuro
TrueType
- Suporte total para "glifos compostos"
- Diversificação dos formatos de Buffer de estrutura suportados.
- Somente o suporte ao formato 'CMAP' 4 e 'Kern' é suportado.
- Correção que alguns arquivos não podem ser lidos.
- Não é possível ler o arquivo TTF se o nome do arquivo for longo (STM32F103).
- LEITURA DE GLYPH mais rápida.
- Diminuir o uso de SRAM.
- Manuseio da curva bezier (ao exceder 3 dimensões. Atualmente, processamento provisório).
Desenhe FrameBuffer
- Texto da direita
- Sublinhado
Controlador confirmado
- ESP32 (placa)
- STM32F103C8T6 (placa)
Demonstração
- Colorido
- ILI9341 Demo
- SSD1331 Demo
- Mono
- SSD1306 Demo
- Demo de 2,9 polegadas de 2,9 polegadas
- Demo de 7 polegadas de 7,5 polegadas (b) de WaveShare
Observação
Sinta -se à vontade para postar bugs ou idéias para correções e melhorias!
Confirme os direitos autorais do arquivo de fonte. Eu não distribuí arquivos de fonte.
É baseado no código do GarretLab e alterado.
https://github.com/garretlab/truetype
https://garretlab.web.fc2.com/arduino/lab/truetype/