问题背景
经常有小伙伴发现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存储格式不一样:
- 字节内像素的顺序跟LVGL是反的
- 每一行的所有的像素如果不够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格式的数据。 !!! 这是造成硬件加速后字体显示异常的主要根源!!!![]()
LVGL V9版本在显示A2/A4/A8格式时,会将其统一转成A8格式的(这一步是软件处理的),然后再送到底下的渲染单元,所以EPIC不会直接拿到LVGL格式的A2/A4/A8数据
矢量字体
矢量字体在LVGL 7/8/9上面一般都是统一转成8bit格式的,然后再送到底下的渲染单元,所以EPIC拿到的一般是A8格式的
解决办法
目前一般都是对需要硬件加速显示字体的,改成矢量字体,这样没有格式兼容问题。
还有一种办法是修改LVGL生成的点阵字的数据格式,将其改成和EPIC的兼容,不过目前没有实验过,不知道有没有小伙伴可以分享一下