MAX_CARLINK_A270S/MXC_A27-PCB4.5-270T/app/myFont26.c

108 lines
3.0 KiB
C
Raw Permalink Normal View History

2025-01-21 16:49:37 +08:00
/*
*---------------------------------------------------------------
* Lvgl Font Tool
*
* :使unicode编码
* :Lvgl Font Tool V0.4
* :(qq:617622104)
*---------------------------------------------------------------
*/
#if !defined(VG_ONLY) && !defined(AWTK)
#include "lvgl/lvgl.h"
#include "romfile.h"
typedef struct{
uint16_t min;
uint16_t max;
uint8_t bpp;
uint8_t reserved[3];
}x_header_t;
typedef struct{
uint32_t pos;
}x_table_t;
typedef struct{
uint8_t adv_w;
uint8_t box_w;
uint8_t box_h;
int8_t ofs_x;
int8_t ofs_y;
uint8_t r;
}glyph_dsc_t;
static x_header_t __g_xbf_hd = {
.min = 0x0020,
.max = 0x9fa0,
.bpp = 4,
};
static uint8_t *__g_font_buf = NULL;
static uint8_t *__user_font_getdata(int offset, int size){
if (!__g_font_buf) {
RomFile *fontfile = RomFileOpen("myFont26.bin");
if (!fontfile) {
printf("open romfile myFont26.bin fail.\n");
return NULL;
}
RomFileRead(fontfile, NULL, fontfile->size);
__g_font_buf = fontfile->buf;
#ifndef ROMFILE_USE_SMALL_MEM
RomFileClose(fontfile);
#endif
}
return __g_font_buf + offset;
}
static const uint8_t * __user_font_get_bitmap(const lv_font_t * font, uint32_t unicode_letter) {
if( unicode_letter>__g_xbf_hd.max || unicode_letter<__g_xbf_hd.min ) {
return NULL;
}
uint32_t unicode_offset = sizeof(x_header_t)+(unicode_letter-__g_xbf_hd.min)*4;
uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
if( p_pos[0] != 0 ) {
uint32_t pos = p_pos[0];
glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(pos, sizeof(glyph_dsc_t));
return __user_font_getdata(pos+sizeof(glyph_dsc_t), gdsc->box_w*gdsc->box_h*__g_xbf_hd.bpp/8);
}
return NULL;
}
static bool __user_font_get_glyph_dsc(const lv_font_t * font, lv_font_glyph_dsc_t * dsc_out, uint32_t unicode_letter, uint32_t unicode_letter_next) {
if( unicode_letter>__g_xbf_hd.max || unicode_letter<__g_xbf_hd.min ) {
return NULL;
}
uint32_t unicode_offset = sizeof(x_header_t)+(unicode_letter-__g_xbf_hd.min)*4;
uint32_t *p_pos = (uint32_t *)__user_font_getdata(unicode_offset, 4);
if( p_pos[0] != 0 ) {
glyph_dsc_t * gdsc = (glyph_dsc_t*)__user_font_getdata(p_pos[0], sizeof(glyph_dsc_t));
dsc_out->adv_w = gdsc->adv_w;
dsc_out->box_h = gdsc->box_h;
dsc_out->box_w = gdsc->box_w;
dsc_out->ofs_x = gdsc->ofs_x;
dsc_out->ofs_y = gdsc->ofs_y;
dsc_out->bpp = __g_xbf_hd.bpp;
return true;
}
return false;
}
//SimSun,,-1
//字模高度30
//XBF字体,外部bin文件
lv_font_t myFont26 = {
.get_glyph_bitmap = __user_font_get_bitmap,
.get_glyph_dsc = __user_font_get_glyph_dsc,
.line_height = 30,
.base_line = 0,
};
#endif