แสดงแบบอักษร Truetype สำหรับ Arduino
อ่าน Truetype (.ttf) จาก FS (เช่น SD/Spiffs/FATFS) และเขียน Framebuffer
- อ่านไฟล์ Truetype ('cmap' format4)
- เขียนสตริงใด ๆ ไปยัง Framebuffer ของผู้ใช้
- รองรับ "สัญลักษณ์ง่ายๆ" และเป็นส่วนหนึ่งของ "สารประกอบร่ายมนตร์"
- ตั้งค่าขนาดตัวอักษรตำแหน่งสีระยะห่างหมุน
- สตริงที่อยู่ตรงกลางและอยู่ตรงกลาง โดยรับความยาวของสตริง
- อ่านตาราง 'kern' (Format0) และ kerning
- จัดเรียงตัวละครอย่างสวยงามตามตาราง '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, Spiffs, FATFS ฯลฯ
- ไฟล์ _file: ไฟล์ TTF
- return: 1 = อ่านสำเร็จ 0 = อ่านความล้มเหลว
โมฆะ setFrameBuffer (uint16_t _frameBufferWidth, uint16_t _framebufferheight, uint16_t _frameBuffer_bit, uint8_t _frameBufferDirection, uint8_t *_frameBuffer);
- การตั้งค่า FrameBuffer
- UINT16_T _FrameBufferWidth: ความกว้างของเฟรมบัฟเฟอร์
- UINT16_T _FrameBufferHeight: FrameBuffer Eight
- uint16_t _framebuffer_bit: จำนวนบิตต่อพิกเซล (ใช้ 1,4,8 บิต)
- UINT8_T _FrameBufferDirection: การวางแนวบิต
- UINT8_T *_FrameBuffer: ตัวชี้เฟรมบัฟเฟอร์
- หากคุณต้องการให้สอดคล้องกับ framebuffer ของคุณเองให้แก้ไขฟังก์ชั่น addpixel หากคุณเพิ่มรหัสโปรดแบ่งปัน!
โมฆะ setCharacterspacing (int16_t _Characterspace, uint8_t _kerning = 1);
- การตั้งค่าความกว้างระหว่างอักขระ
- int16_t _Characterspace: ค่าความกว้างระหว่างอักขระ
- uint8_t _kerning: อ่านและใช้ตาราง ttf 'kern' 1: 'Kern' + _Characterspace 0: _Characterspace
โมฆะ setCharactersize (UINT16_T _Charactersize);
- การตั้งค่าขนาดตัวอักษร
- UINT16_T _Charactersize: ความสูงของอักขระ
เป็นโมฆะ 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 เมื่อทำลายบรรทัด
เป็นโมฆะ setTextColor (uint8_t _online, uint8_t _inside);
- การตั้งค่าสีข้อความ
- uint8_t _online: สีโครงร่างของตัวละคร
- uint8_t _inside: ข้อความเติมสี
โมฆะ settextrotation (uint8_t _rotation);
- การหมุนข้อความ
- หมุนไปพร้อมกับแกนพิกัด ภาพเป็นภาพต่อไปนี้

uint8_t _rotation: มุมการหมุน
- (ROTATE_0/ROTATE_90/ROTATE_180/ROTATE_270)
โมฆะ TextDraw (uint16_t _x, uint16_t _y, const wchar_t _character []);
- เขียนสตริงไปยัง FrameBuffer
- uint16_t _x: สตริงจุดเริ่มต้น x
- uint16_t _y: สตริงจุดเริ่มต้น y
- const wchar_t _character []: สตริงตัวชี้ (อักขระสองไบต์)
โมฆะ TextDraw (uint16_t _x, uint16_t _y, const char _character []);
- เขียนสตริงไปยัง FrameBuffer
- uint16_t _x: สตริงจุดเริ่มต้น x
- uint16_t _y: สตริงจุดเริ่มต้น y
- const char _character []: ตัวชี้สตริง (อักขระไบต์เดี่ยว)
เป็นโมฆะ TextDraw (uint16_t _x, uint16_t _y, สตริง const _string);
- เขียนสตริงไปยัง FrameBuffer
- uint16_t _x: สตริงจุดเริ่มต้น x
- uint16_t _y: สตริงจุดเริ่มต้น y
- สตริง const _string: สตริงตัวชี้ (ประเภทสตริง)
uint16_t getstringwidth (const wchar_t _character []);
- const wchar_t _character []: สตริงตัวชี้ (อักขระสองไบต์)
- return: ความยาวของสตริง การแบ่งสายอัตโนมัติไม่ได้รับการพิจารณา
- สามารถใช้สำหรับการจัดเรียงข้อความกลาง/ขวา
uint16_t getStringWidth (const charater _character []);
- const char _character []: ตัวชี้สตริง (อักขระไบต์เดี่ยว)
- return: ความยาวของสตริง การแบ่งสายอัตโนมัติไม่ได้รับการพิจารณา
- สามารถใช้สำหรับการจัดเรียงข้อความกลาง/ขวา
uint16_t getStringWidth (สตริง const _string);
- สตริง const _string: สตริงตัวชี้ (ประเภทสตริง)
- return: ความยาวของสตริง การแบ่งสายอัตโนมัติไม่ได้รับการพิจารณา
- สามารถใช้สำหรับการจัดเรียงข้อความกลาง/ขวา
Void End ();
รูปแบบ FrameBuffer
การวางแนวบิตเมื่อเก็บข้อมูลสำหรับหลายพิกเซลต่อไบต์ของ framebuffer
ประเภทของ framebuffers แบ่งออกเป็นวงกว้างตามทิศทางนี้
รองรับปัจจุบัน: แนวนอน - 1,4,8 บิต
ตามแนวนอน
ตัวอย่างด้วย 1 บิต / 1pixel

แนวตั้ง
ตัวอย่างด้วย 1 บิต / 1pixel

ความคิดริเริ่ม
- แก้ไขปัญหาที่ไม่สามารถอ่านไฟล์ฟอนต์บางไฟล์ได้
- การจัดการเส้นโค้ง Bezier
- รองรับการสั่งซื้อ bezier ได้สูงสุดลำดับที่ 3 แต่ลำดับที่ 4 ขึ้นไปจะถูกวาดเป็นเส้นตรง
- สีโครงร่างและสีเติมสามารถตั้งค่าเป็นรายบุคคล
- รองรับการเขียนถึงอาร์เรย์ ฟอนต์ถูกวาดในบางรูปแบบของ framebuffer (อาร์เรย์ UINT8_T)
- kerning โดยการอ่านตาราง 'kern'
- อ่านตาราง 'HMTX' และปรับเลย์เอาต์
- กระบวนการเติมที่มีประสิทธิภาพ
งานในอนาคต
Truetype
- การสนับสนุนเต็มรูปแบบสำหรับ "สารประกอบร่ายมนตร์"
- การกระจายความเสี่ยงของรูปแบบ framebuffer ที่รองรับ
- รองรับเฉพาะรูปแบบ 'CMAP' รูปแบบ 4 และ 'Kern' Format0 เท่านั้น
- การแก้ไขว่าบางไฟล์ไม่สามารถอ่านได้
- ไม่สามารถอ่านไฟล์ TTF ได้หากชื่อไฟล์ยาว (STM32F103)
- การอ่านร่ายมนตร์เร็วขึ้น
- ลดการใช้ SRAM
- การจัดการเส้นโค้ง Bezier (เมื่อเกิน 3 มิติปัจจุบันการประมวลผลชั่วคราว)
วาด framebuffer
- ข้อความจากด้านขวา
- ขีดเส้นใต้
คอนโทรลเลอร์ที่ได้รับการยืนยัน
- esp32 (บอร์ด)
- STM32F103C8T6 (บอร์ด)
การสาธิต
- สีเต็มรูปแบบ
- ILI9341 DEMO
- การสาธิต SSD1331
- โมโน
- การสาธิต SSD1306
- waveshare e-paper 2.9 นิ้วสาธิต
- Waveshare e-paper 7.5 นิ้ว (b) สาธิต
บันทึก
อย่าลังเลที่จะโพสต์ข้อบกพร่องหรือแนวคิดใด ๆ สำหรับการแก้ไขและการปรับปรุง!
ยืนยันลิขสิทธิ์ของไฟล์ FONT ฉันไม่ได้แจกจ่ายไฟล์แบบอักษร
มันขึ้นอยู่กับรหัสโดย GarretLab และเปลี่ยนแปลง
https://github.com/garretlab/truetype
https://garretlab.web.fc2.com/arduino/lab/truetype/