LVGL字体的显示和EPIC兼容的格式

问题背景

经常有小伙伴发现LVGL的点阵字在模拟器显示的好好的,硬件加速后怎么显示不正常了,花了或者糊成一片,今天就分享下具体原因

LVGL和EPIC存储格式的区别

在LVGL里面点阵字库有1bit, 2bit,4bit, 8bit 4种,假设我有一个点阵字的像素点是宽3高2,我将每个像素点用一个字母表示如下:

ABC
DEF

在8bit下比较简单,就是依次ABCDEF 共6个字节,每个字占1字节
4bit下是紧密排放,共占3字节
2bit下也是紧密排放,第2字节最后补0,占2字节

bit7~bit0 bit15~bit8 bit23~bit16 bit31~bit24 bit39~bit32 bit47~bit40
LVGL 8bit A7~A0 B7~B0 C7~C0 D7~D0 E7~E0 F7~F0
LVGL 4bit A3~A0B3~B0 C3~C0D3~D0 E3~E0F3~F0 / / /
LVGL 2bit A1A0B1B0C1C0D1D0 E1E0F1F0_0000 / / /
LVGL 1bit A0B0C0D0E0F0_00 / / / /

EPIC下如果要正常显示上面这个3x2的字,如果是8bit跟LVGL格式是一样的,但是对于4bit和2bit存储格式不一样:

  1. 字节内像素的顺序跟LVGL是反的
  2. 每一行的所有的像素如果不够1字节,需要补齐为0
bit7~bit0 bit15~bit8 bit23~bit16 bit31~bit24 bit39~bit32 bit47~bit40
EPIC 4bit B3~B0A3~A0 0000_C3~C0 E3~E0D3~D0 0000_F3~F0 / /
EPIC 2bit 00_C1C0B1B0A1A0 00_F1F0E1E0D1D0 / / / /

字体的2bit和4bit对应的就是A2,A4格式,附:EPIC支持的颜色格式存储方式

不同LVGL版本对字体的处理区别

点阵字体

LVGL V7/V8在显示A2/A4/A8格式时,是直接将原始数据送到底下的渲染单元去渲染,所以EPIC加速时会直接拿到A2/A4/A8格式的数据。 !!! 这是造成硬件加速后字体显示异常的主要根源!!!:face_with_monocle:

LVGL V9版本在显示A2/A4/A8格式时,会将其统一转成A8格式的(这一步是软件处理的),然后再送到底下的渲染单元,所以EPIC不会直接拿到LVGL格式的A2/A4/A8数据

矢量字体

矢量字体在LVGL 7/8/9上面一般都是统一转成8bit格式的,然后再送到底下的渲染单元,所以EPIC拿到的一般是A8格式的

解决办法

目前一般都是对需要硬件加速显示字体的,改成矢量字体,这样没有格式兼容问题。

还有一种办法是修改LVGL生成的点阵字的数据格式,将其改成和EPIC的兼容,不过目前没有实验过,不知道有没有小伙伴可以分享一下

4 个赞