Отображать шрифт truetype для arduino
Прочитайте TrueType (.ttf) из FS (Ex. SD/Spiffs/Fatfs) и напишите кадр.
- Читать файлы truetype ('cmap' format4).
- Напишите любую строку в кадр -буфера пользователя.
- Поддерживает «простые глифы» и часть «составных глифов».
- Установите размер шрифта, положение, цвет, расстояние, вращение.
- Центрированные и правые выровненные струны. Получив длину струны.
- Прочитайте таблицу «Керн» (Format0) и кернинг.
- Красиво расположить персонажи на основе таблицы «HMTX».

Справочное руководство TrueType ™
https://developer.apple.com/fonts/truetype-reference-manual/
Нативная библиотека для STM32 здесь.
Стандартный код
//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 (файл _file, uint8_t _checkchecksum = 0);
- Установите чтение файла TTF из SD, Speffs, Fatfs и т. Д.
- Файл _file: TTF -файл.
- Возврат: 1 = Читать успешно, 0 = сбой прочтения.
void setFrameBuffer (uint16_t _framebufferwidth, uint16_t _framebufferheight, uint16_t _framebuffer_bit, uint8_t _framebufferdirection, uint8_t *_framebuffer);
- Настройки кадров.
- uint16_t _framebufferwidth: ширина кадров.
- uint16_t _framebufferheight: Framebuffer Eight.
- uint16_t _framebuffer_bit: количество бит на пиксель. (Реализовано 1,4,8bit)
- uint8_t _framebufferdirection: битовая ориентация.
- uint8_t *_framebuffer: Parmebuffer Pointer.
- Если вы хотите, чтобы это соответствовало вашему собственному кадру, отредактируйте функцию AddPixel. Если вы добавите код, пожалуйста, поделитесь им!
void setcharacterspacing (int16_t _characterspace, uint8_t _kerning = 1);
- Установка ширины между символами.
- int16_t _characterspace: значение ширины между символами.
- uint8_t _kerning: читать и использовать таблицу TTF 'kern'. 1: 'kern' + _haracterspace. 0: _haracterspace.
void setcharactersize (uint16_t _charactersize);
- Настройка размера шрифта.
- uint16_t _charactersize: высота символа.
void setTextBoundary (uint16_t _start_x, uint16_t _end_x, uint16_t _end_y);
- Установка диапазона строк.
- Координатные оси вращаются с «settextrotation»
- uint16_t _start_x: отправная точка x строки символа, когда происходит разрыв строки.
- uint16_t _end_x: конечная точка x при разрыве строки.
- uint16_t _end_y: последняя точка y при разрыве строки.
void setTextColor (uint8_t _online, uint8_t _inside);
- Настройка цвета текста.
- uint8_t _online: conline conline.
- uint8_t _inside: текстовый цвет.
void settextratation (uint8_t _rotation);
- Вращение текста
- Поверните вместе с координатными осями. Изображение является следующим изображением.

uint8_t _Rotation: угол вращения.
- (Rotate_0/rotate_90/rotate_180/rotate_270)
void textDraw (uint16_t _x, uint16_t _y, const wchar_t _character []);
- Напишите строку в рамный буфер.
- uint16_t _x: String Start Point x.
- uint16_t _y: String Start Point y.
- const wchar_t _character []: String pointer (двойной символ).
void textDraw (uint16_t _x, uint16_t _y, const char _character []);
- Напишите строку в рамный буфер.
- uint16_t _x: String Start Point x.
- uint16_t _y: String Start Point y.
- Const char _Character []: String Pointer (однобайтный символ).
void textDraw (uint16_t _x, uint16_t _y, const string _string);
- Напишите строку в рамный буфер.
- uint16_t _x: String Start Point x.
- uint16_t _y: String Start Point y.
- Const String _String: String Pointer (тип строки).
uint16_t getStringWidth (const wchar_t _character []);
- const wchar_t _character []: String pointer (двойной символ).
- Вернуть: длина строки. Автоматические разрывы линий не рассматриваются.
- Можно использовать для текстового выравнивания центра/справа.
uint16_t getStringWidth (const char _character []);
- Const char _Character []: String Pointer (однобайтный символ).
- Вернуть: длина строки. Автоматические разрывы линий не рассматриваются.
- Можно использовать для текстового выравнивания центра/справа.
uint16_t getStringWidth (const String _String);
- Const String _String: String Pointer (тип строки).
- Вернуть: длина строки. Автоматические разрывы линий не рассматриваются.
- Можно использовать для текстового выравнивания центра/справа.
void end ();
Формат кадров
Бит -ориентация при хранении информации для нескольких пикселей за байт кадриста.
Типы каркасных буферов широко разделены в соответствии с этим направлением.
В настоящее время поддерживается: горизонтальный - 1,4,8bit
Горизонтальный
Пример с 1 бит / 1Pixel

Вертикальный
Пример с 1 бит / 1Pixel

Оригинальность
- Исправлена проблема, которую нельзя прочитать некоторые файлы шрифтов.
- Обработка кривых петля.
- Он поддерживает до 3 -го порядка кривых Безера, но 4 -й заказ и выше проводятся как прямые линии.
- Схема цвета и цвет заполнения могут быть установлены индивидуально.
- Поддерживает написание в массивах. Шрифты нарисованы в какой -то форме кадриста (массив uint8_t).
- Кернинг, читая таблицу «Керн».
- Прочитайте таблицу «HMTX» и отрегулируйте макет.
- Эффективный процесс заполнения.
Будущая работа
TrueType
- Полная поддержка "составных глифов"
- Диверсификация поддерживаемых форматов кадров.
- Поддерживается только поддержка формата CMAP 'Format 4 и «Kern».
- Исправление, что некоторые файлы не могут быть прочитаны.
- Невозможно прочитать файл TTF, если имя файла длинное (STM32F103).
- Более быстрое чтение глифа.
- Уменьшить использование SRAM.
- Обработка кривой Безера (при превышении 3 измерений. В настоящее время предварительная обработка).
Нарисуйте кадр
Подтвержденный контроллер
- ESP32 (доска)
- STM32F103C8T6 (Правление)
Демо
- Полный цвет
- ILI9341 Демо
- SSD1331 Демо
- Мононуклеоз
- SSD1306 Демо
- Waveshare E-Paper 2,9-дюймовая демонстрация
- Waveshare E-Paper 7,5 дюйма (б) демонстрация
Примечание
Не стесняйтесь публиковать какие -либо ошибки или идеи для исправлений и улучшений!
Подтвердите авторское право файла шрифта. Я не распространял файлы шрифтов.
Он основан на коде Garretlab и изменен.
https://github.com/garretlab/truetype
https://garretlab.web.fc2.com/arduino/lab/truetype/