Formato de fuente LVGL V8

Hay principalmente dos tipos de información almacenada en el archivo de fuente, uno es la matriz de celosía de caracteres y el otro son los datos de la matriz de codificación Unicode correspondiente. Cuando la microcomputadora de un solo chip analiza la fuente, encuentra la matriz de celosía de caracteres correspondiente de acuerdo con la codificación Unicode.

Los datos de matriz de puntos en el archivo de fuente generado por el formato de fuente LVGL no son como las fuentes que usamos habitualmente en las microcomputadoras de un solo chip.
En primer lugar, el número de bytes ocupados por los datos de matriz de puntos de cada carácter no es igual, como las comillas simples "," y "@", el número de bytes que ocupan no es igual, esto es para ahorrar espacio y vacíe los caracteres. Las filas y columnas no se convirtieron en una celosía. En este caso, se requiere otra información para controlar la posición de visualización de los caracteres. Por lo tanto, además de la matriz de celosía de caracteres y la matriz Unicode, hay una matriz importante glifo_dsc[] en los datos de fuente.

Estructura de fuente LVGL

uint8_t   glyph_bitmap[]; 					//字形屏幕像素映射(字符点阵数组,将字符中空的行和列的地方不转化为点阵)
lv_font_fmt_txt_glyph_dsc_t   glyph_dsc; 	//描述unicode偏移、字形大小、位置偏移
uint16_t   unicode_list_0; 				    //unicode 列表(字符映射)
lv_font_fmt_txt_cmap_t   cmaps; 			//cmaps收集 unicode 列表和字符偏移
lv_font_fmt_txt_dsc_t   font_dsc; 		    //字体描述,用于将上面的信息收集打包
lv_font_t   ch_word; 						//程序中 label 等组件可以使用的字库。

analizar archivos de fuentes

El programa primero obtendrá la codificación UTF-8 del carácter que se va a mostrar, luego convertirá UTF-8 a codificación sin codificar, luego buscará el índice de la codificación Unicode correspondiente en la matriz Unicode del archivo de fuente y luego usará el índice para busque el carácter correspondiente en los datos de glyph_dsc. Dado que Unicode está organizado en orden ascendente, se puede utilizar el método de búsqueda mediana para mejorar la velocidad de búsqueda.

profundidad de píxel bpp

El color de un píxel se describe por la cantidad de bits de datos que hay en la computadora. Las computadoras utilizan bits binarios para representar los datos de un píxel. Cuantos más bits de datos se utilicen para representar un píxel, más rico y fino será el valor del color del píxel y más profunda será la profundidad del color.
Hay varias profundidades de píxeles: 1 bit, 2 bits, 4 bits, 8 bits, 16 bits, 24 bits, 32 bits.

El bpp de la fuente se puede establecer en 1, 2 o 4. Cuando se selecciona un valor de bpp mayor, los recursos de almacenamiento flash requeridos también aumentarán exponencialmente, pero cuanto mayor sea el valor de bpp, más suave será el borde de la fuente dibujada sin fallos Haga que la interfaz UI de nuestros productos se vea más magnífica.
inserte la descripción de la imagen aquí
Para fuentes de 1 bpp: use 1 bit para representar 1 punto de píxel, cada píxel tiene solo dos estados de encendido y apagado, y 1 carácter chino ocupa 256/8 = 32 bytes. Para fuentes de 2 bpp: use 2 bits para representar 1 punto de píxel, realice
sub -Representación de píxeles, 1 carácter chino ocupa 256 2/8 = 64 bytes de espacio
Para fuentes de 4 bpp: use 4 bits para representar 1 píxel, realice una representación de subpíxeles, 1 carácter chino ocupa 256 4
/8 = 128 bytes de espacio

Mapa de píxeles de pantalla de glifo

//存储符号的图像
static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
    
    
    /* U+56DE "回" */
    0x0, 0x11, 0xfb, 0xc1, 0x40, 0x29, 0xe5, 0x24,
    0xa4, 0x94, 0xb2, 0x98, 0x50, 0xa, 0x1, 0x7f,
    0xa8, 0xc, 0x0, 0x0,
    /* U+6D41 "流" */
    0x1, 0x0, 0x1, 0x0, 0xc0, 0x0, 0x3f, 0xc0,
    0x8, 0x0, 0x24, 0x13, 0xfc, 0x8, 0x0, 0x12,
    0xa0, 0x25, 0x40, 0x92, 0x81, 0x25, 0x26, 0x4a,
    0x45, 0x14, 0x84, 0xf, 0x80,
    /* U+96EA "雪" */
    0x0, 0x60, 0x7e, 0x4, 0x20, 0x9f, 0xfe, 0x82,
    0x20, 0xeb, 0x0, 0x2e, 0xe, 0x80, 0x1, 0xe0,
    0x78, 0x80, 0xa, 0x7, 0xd0, 0x0, 0x40, 0xff,
    0x0,
    /* U+98CE "风" */
    0x0, 0x0, 0x23, 0xc0, 0x78, 0x80, 0x85, 0x1,
    0xa, 0x2, 0xa4, 0x4, 0xc8, 0x8, 0x90, 0x13,
    0x20, 0x49, 0x20, 0xa2, 0x49, 0x80, 0xa4, 0x0,
    0xc0, 0x0, 0x80, 0x0, 0x0
};

Al observar la matriz de mapeo de píxeles de la pantalla de glifos, se puede obtener
que "atrás" ocupa 20 bytes
"corriente" ocupa 29 bytes
"nieve" ocupa 25 bytes
"viento" ocupa 29 bytes

descripción de fuente

//这描述了一个字形
typedef struct {
    
    
#if LV_FONT_FMT_TXT_LARGE == 0
    uint32_t bitmap_index : 20;     /**< 字符对应的字模数据索引   Start index of the bitmap. A font can be max 1 MB.*/
    uint32_t adv_w : 12;            /**< 字符宽度,在此宽度之后绘制下一个字形。8.4 format(存储real_value * 16)。                Draw the next glyph after this width. 8.4 format (real_value * 16 is stored).*/
    uint8_t box_w;                  /**< 字模宽度                Width of the glyph's bounding box*/
    uint8_t box_h;                  /**< 字模高度                Height of the glyph's bounding box*/
    int8_t ofs_x;                   /**< 字模水平方向偏移(右边为正向)      x offset of the bounding box*/
    int8_t ofs_y;                   /**< 字模竖直方向偏移(上边为正向)(当字符需要在基线以下显示时使用这个参数让字模下沉)y offset of the bounding box. Measured from the top of the line*/
#else
    uint32_t bitmap_index;          /**< Start index of the bitmap. A font can be max 4 GB.*/
    uint32_t adv_w;                 /**< Draw the next glyph after this width. 28.4 format (real_value * 16 is stored).*/
    uint16_t box_w;                 /**< Width of the glyph's bounding box*/
    uint16_t box_h;                 /**< Height of the glyph's bounding box*/
    int16_t ofs_x;                  /**< x offset of the bounding box*/
    int16_t ofs_y;                  /**< y offset of the bounding box. Measured from the top of the line*/
#endif
} lv_font_fmt_txt_glyph_dsc_t;
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
    
    
    {
    
    .bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
    {
    
    .bitmap_index = 0, .adv_w = 256, .box_w = 11, .box_h = 14, .ofs_x = 3, .ofs_y = -1},       //回
    {
    
    .bitmap_index = 20, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = -1},		//流
    {
    
    .bitmap_index = 49, .adv_w = 256, .box_w = 14, .box_h = 14, .ofs_x = 1, .ofs_y = -1},		//雪
    {
    
    .bitmap_index = 74, .adv_w = 256, .box_w = 15, .box_h = 15, .ofs_x = 1, .ofs_y = -2}		//风
};
  1. Miembro bitmap_index:
    de la matriz glifo_dsc, también se puede obtener de la matriz glifo_dsc que el mapeo de píxeles de la pantalla de los glifos de caracteres chinos ocupa bytes:
    el índice de los datos de glifo correspondientes al carácter "hui"índice_mapa de bits=0
    El índice de datos de fuente correspondiente al carácter de "secuencia"índice_mapa de bits= 20, por lo que "Hui" ocupa 20 bytes
    Función: De acuerdo con estos datos, se puede ubicar el desplazamiento de cada carácter chino en la matriz de descripción de glifos.
  2. Miembro adv_w:
    indica el ancho del carácter, después del cual se dibuja el siguiente glifo.
    Debido a que se selecciona la fuente 16*16 (256 píxeles), después de dibujar 256 píxeles, es el píxel inicial del siguiente glifo.
  3. Miembros box_w y box_h
    ancho y alto de fuente
    inserte la descripción de la imagen aquí

estructura de cmaps

cmaps recopila listas Unicode y compensaciones de caracteres

lista unicode

static const uint16_t unicode_list_0[] = {
    
    
    0x0, 0x1663, 0x400c, 0x41f0
};

/* U+56DE "atrás" /, / U+6D41 "flujo" /, / U+96EA "nieve" /, / U+98CE "viento" */
La codificación Unicode mínima de "atrás" es 0x56DE =22238
" flow" Codificación Unicode mínima 0x6D41 = 27969
"Nieve" Codificación Unicode mínima 0x96EA = 38634
"Viento" Codificación Unicode máxima 0x98CE = 39118

La matriz unicode_list_0 almacena el desplazamiento de Unicode en relación con el primer carácter Unicode.

  • unicode_list_0[0] =0x0, lo que indica que el desplazamiento Unicode de "Hui" es 0 en relación con "Hui"
  • unicode_list_0[1] =0x1663, lo que indica que el desplazamiento Unicode de "secuencia" en relación con "atrás" es 0x1663
  • unicode_list_0[2] =0x400c, lo que indica que el desplazamiento Unicode de "nieve" en relación con "atrás" es 0x400c
  • unicode_list_0[3] =0x41f0, lo que indica que el desplazamiento Unicode de "viento" en relación con "atrás" es 0x41f0

Estructura lv_font_fmt_txt_cmap_t análisis de miembros de cmaps

static const lv_font_fmt_txt_cmap_t cmaps[] =
{
    
    
    {
    
    
		.range_start = 22238, 
		.range_length = 16881, 
		.glyph_id_start = 1,
		.unicode_list = unicode_list_0, 
		.glyph_id_ofs_list = NULL, 
		.list_length = 4, 
		.type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY
    }
};
  1. Miembro uint32_t range_start
    el primer carácter Unicode en este rango, porque "atrás" es el primer carácter, entonces .range_start = 22238,

  2. Miembro uint16_t range_length
    El número de caracteres Unicode asociados con este rango.
    "Atrás" es el primer carácter 22238, "viento" es el último carácter 39118, el último carácter Unicode = range_start + range_length - 1
    entonces .range_length = 39118 - 22238 + 1 = 16881;

  3. Miembro uint16_t glyph_id_start
    El primer ID de glifo de este rango (el índice de matriz de ' glyph_dsc '), debido a que el índice de matriz glyph_dsc está reservado (id = 0 reservado), por lo que glyph_id_start comienza desde 1.

  4. El puntero del miembro uint16_t *unicode_list
    apunta a unicode_list_0.

  5. miembro vacío *glyph_id_ofs_list

  6. miembro uint16_t list_length
    longitud de 'unicode_list' y/o 'glyph_id_ofs_list'

  7. Miembro lv_font_fmt_txt_cmap_type_t tipo
    El tipo de asignación de caracteres

estructura font_dsc

lv_font_fmt_txt_dsc_t font_dsc; // Descripción de la fuente, utilizada para recopilar y empaquetar la información anterior

//描述存储字体的附加数据
#if LV_VERSION_CHECK(8, 0, 0)
/*存储所有自定义的字体数据*/
static  lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
    
    
#else
static lv_font_fmt_txt_dsc_t font_dsc = {
    
    
#endif
    .glyph_bitmap = glyph_bitmap, 	//所有字形的位图
    .glyph_dsc = glyph_dsc,       	//描述符号
    .cmaps = cmaps,					//将字形映射到Unicode字符。' lv_font_cmap_fmt_txt_t '变量的数组
	//存储字距调整值
	.kern_dsc = NULL,	//可以是' lv_font_fmt_txt_kern_pair_t *或' lv_font_kern_classes_fmt_txt_t * '根据“kern_classes”
    .kern_scale = 0,     			//按12.4格式缩放kern值
    .cmap_num = 1,					//cmap表的个数
    .bpp = 1,						//像素深度bpp: 1, 2, 4
    .kern_classes = 0,     			//“kern dsc”类型
    .bitmap_format = 0,             //位图的存储格式为' lv_font_fmt_txt_bitmap_format_t '
#if LV_VERSION_CHECK(8, 0, 0)
    .cache = &cache					//缓存最后一个字母和字形id
#endif
};

Estructura de fuente ch_word

/*初始化公共通用字体描述符*/
#if LV_VERSION_CHECK(8, 0, 0)
const lv_font_t ch_word = {
    
    
#else
lv_font_t ch_word = {
    
    
#endif
    .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt,    	/*从自定义字体数据中获取字形数据的函数指针*/
    .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt,    	/*从自定义字体数据中获取字形位图的函数指针*/
    .line_height = 17,          						/*字体所需的最大行高*/
    .base_line = 3,             						/*从底线开始测量基线*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
    .subpx = LV_FONT_SUBPX_NONE,                        /*位图可以放大3倍以实现亚像素渲染*/
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
    .underline_position = -4,                           /*下划线顶部与基线之间的距离(< 0表示基线以下)*/
    .underline_thickness = 1,							/*下划线的厚度*/
#endif
    .dsc = &font_dsc           /*自定义字体数据。将通过' get_glyph_bitmap/dsc '访问*/
};

Uso de fuente

La biblioteca de fuentes debe declararse antes de usarse.

LV_FONT_DECLARE(ch_word); //Declarar fuente ch_word

static lv_style_t style;
lv_style_set_text_font(&style,&ch_word);       //设置样式字体

Supongo que te gusta

Origin blog.csdn.net/m0_37187962/article/details/125577898
Recomendado
Clasificación