lv_obj_invalidate()
`lv_obj_invalidate()` 函数是 LVGL图形库中的一个函数,用于标记一个对象(object)需要重新绘制。当一个对象的外观或状态发生变化时,需要重新绘制该对象以反映这些变化。lv_obj_invalidate()函数可以将该对象标记为需要重新绘制,从而触发重新绘制操作。
具体来说,`lv_obj_invalidate()` 函数会将对象的 `invalidate` 标志位置为 `true`,表示该对象需要重新绘制。在 LittlevGL 的绘图循环中,会检查所有对象的 `invalidate` 标志位,如果为 `true`,则会调用对象的绘制函数进行重新绘制。这样就可以实现对象的动态更新。需要注意的是,`lv_obj_invalidate()` 函数只是标记对象需要重新绘制,实际的重新绘制操作是在 LittlevGL 的绘图循环中进行的。
因此,如果需要立即重新绘制对象,可以在调用 `lv_obj_invalidate()` 函数后手动调用 `lv_task_handler()` 函数来触发绘图循环。刷新整个屏幕对象:lv_obj_invalidate(lv_scr_act())
lv_obj_update_layout
lv_obj_update_layout是一个LVGL函数,用于更新对象的布局。当对象的位置、大小或对齐方式发生变化时,需要调用此函数来更新对象的布局。
具体来说,lv_obj_update_layout函数会重新计算对象的位置和大小,并根据对象的对齐方式将其放置在正确的位置。如果对象的位置或大小发生了变化,它还会更新对象的子对象的布局。
需要注意的是,lv_obj_update_layout函数只会更新对象的布局,不会重新绘制对象。这意味着如果需要重新绘制对象,请调用lv_obj_invalidate函数。
lv_obj_update_layout函数的函数原型:
void lv_obj_update_layout(lv_obj_t * obj);
其中,obj是要更新布局的对象的指针。
lv_refr_join_area
lv_refr_join_area:对所有的脏域进行合并:
1.先对某一脏域的合并标志进行判断,如果不等于0,说明该脏域已经被合并过了,处理下一个脏域。
if(disp_refr->inv_area_joined[join_in] != 0) continue;
2.只处理未连接或者未处理的区域并忽略其本身
if(disp_refr->inv_area_joined[join_from] != 0 || join_in == join_from) {continue;}
3.检查这些未处理的区域是否有接触
if(_lv_area_is_on(&disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]) == false) {continue;}
4.计算合并区域
_lv_area_join(&joined_area, &disp_refr->inv_areas[join_in], &disp_refr->inv_areas[join_from]);
5.判断,仅仅当合并后的区域小于合并之前的面积,才会合并,并将合并后的区域加入inv_areas
lv_area_copy(&disp_refr->inv_areas[join_in], &joined_area);
6.对处理过的脏域,进行标记
disp_refr->inv_area_joined[join_from] = 1;struct _lv_draw_unit_t
在LVGL中,struct _lv_draw_unit_t是一个结构体,用于描述绘图任务的单元。它包含了一些绘图任务的相关信息,例如绘图任务的类型、绘图任务的坐标、绘图任务的颜色等。
struct _lv_draw_unit_t的主要作用是将绘图任务分解成小的单元,以便于在绘图过程中进行优化和调度。通过将绘图任务分解成小的单元,可以更好地控制绘图任务的执行顺序和优先级,从而提高绘图的效率和性能。
此外,struct _lv_draw_unit_t还可以用于实现一些高级的绘图效果,例如渐变、阴影、透明度等。通过在struct _lv_draw_unit_t中添加一些额外的属性和参数,可以实现更加复杂和高级的绘图效果。
涉及到的相关函数和处理过程
相关函数
lv_draw_dispatch_wait_for_request
等待新的调度请求。
lv_draw_dispatch_request
当绘制单元完成绘制任务时,它需要请求调度,让 LVGL 为其分配新的绘制任务
lv_draw_get_next_available_task
获取一个可用的绘制任务(source),屏幕上每个层面(layer)存在很多不挨着的脏域(join之后),每个这样的脏域,都是一个绘制任务。
is_independent
检查是否跟旧的绘制任务有重叠的区域
_lv_area_intersect
检查两个区域是否有重叠
处理过程
LV_EVENT_PREPROCESS这个宏表示的是在class 类型的event cb处理之前,event 已经处理过了,当event code == LV_EVENT_DRAW_MAIN || code == LV_EVENT_DRAW_POST || code == LV_EVENT_COVER_CHECK) 时,调用绘制函数进行绘制,lv_obj_draw(e);
杂项
调色板
data += LV_COLOR_INDEXED_PALETTE_SIZE(buf->header.cf) * sizeof(lv_color32_t);
#define LV_COLOR_INDEXED_PALETTE_SIZE(cf) ((cf) == LV_COLOR_FORMAT_I1 ? 2 :\
(cf) == LV_COLOR_FORMAT_I2 ? 4 :\
(cf) == LV_COLOR_FORMAT_I4 ? 16 :\
(cf) == LV_COLOR_FORMAT_I8 ? 256 : 0)
从这可以看出不同格式下palette的大小。