lvgl 绘制,其实就是给一个buffer 里写上各个像素点的rgba 值,那么这个buffer 就是 disp->driver->draw_buf->buf_act,给这个变量写rgba 值就能显示出来了。
给这个buffer 写rgba , 那这个 rgba 数值是怎么得到的,估计就是类似算法问题了。
首先简单的就是
1. LVGL 检查无效区域并连接相邻或相交的区域;
2. 把这些对象都纪录下来,然后调用对象的 lv_xx_draw_xx 函数, 给 buffer 的固定位置写值
3..当区域被渲染时,从显示驱动程序调用 flush_cb 来刷新显示;
uint32_t test_mysqrt(uint32_t num)
{
uint32_t res = 0;
uint32_t xx = num / 2;
for (uint32_t i = 0; i < xx; i++) {
if (i * i >= num) {
return i;
}
}
return res;
}
void set_pure_color(void)
{
lv_disp_t* disp = lv_disp_get_default();
if (disp) {
uint32_t* buf = disp->driver->draw_buf->buf_act;
for (uint32_t i = 0; i < disp->driver->hor_res; i++) {
for (uint32_t j = 0; j < disp->driver->ver_res; j++) {
buf[i * disp->driver->ver_res + j] = 0x00Fa5701;
}
}
}
}
void write_one(void)
{
lv_disp_t* disp = lv_disp_get_default();
if (disp) {
uint32_t* buf = disp->driver->draw_buf->buf_act;
for (uint32_t i = 0; i < disp->driver->ver_res; i++) {
for (uint32_t j = 0; j < disp->driver->hor_res; j++) {
buf[i * disp->driver->hor_res + j] = 0x00FF0000;
}
}
for (uint32_t i = 10; i < 55; i++) {
for (uint32_t j = 10; j < 25; j++) {
buf[i * disp->driver->hor_res + j] = 0xFa570100;
}
}
}
}
void write_circle(void)
{
// (x - 100)^2 + (y - 100)^2 = 100 ^2
lv_disp_t* disp = lv_disp_get_default();
uint32_t* buf = disp->driver->draw_buf->buf_act;
for (uint32_t i = 0; i < 200; i++) {
uint32_t num1 = 100 * 100 - (i - 100) * (i - 100);
uint32_t y_b = test_mysqrt(num1);
uint32_t y = y_b + 100;
buf[i * disp->driver->hor_res + y] = 0xFa570100;
y = 100 - y_b;
buf[i * disp->driver->hor_res + y] = 0xFa570100;
}
return;
}