字符映射表(cmap)使用的是 LV_FONT_FMT_TXT_CMAP_SPARSE_TINY 类型,其核心原理是:
- 通过
range_start(uint32_t)定位起始码点。 - 通过
unicode_list(uint16_t数组)存储相对于range_start的偏移量。 - 因为偏移量是 16 位无符号整数,最大只能表示
65535。
如果字符码点为 0x1F600(😀),而 range_start 设为 0x0,则偏移量为 0x1F600 - 0x0 = 128512,远超 65535,无法存入 uint16_t,导致索引溢出或查找失败。
LVGL 字体格式中定义了另一种映射类型 LV_FONT_FMT_TXT_CMAP_SPARSE_FULL(相对于LV_FONT_FMT_TXT_CMAP_SPARSE_TINY),它与 TINY 的区别在于:
unicode_list存储的是 完整的 32 位 Unicode 码点(绝对地址),而非 16 位偏移量。- 因此可以覆盖整个 Unicode 空间(
0x0000~0x10FFFF)。