lvgl 绘制原理

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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值