update GPU inteface with 2D fill
This commit is contained in:
@@ -157,16 +157,16 @@ void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_
|
|||||||
/*Not opaque fill*/
|
/*Not opaque fill*/
|
||||||
else if(opa == LV_OPA_COVER) {
|
else if(opa == LV_OPA_COVER) {
|
||||||
/*Use hw fill if present*/
|
/*Use hw fill if present*/
|
||||||
if(disp->driver.mem_fill) {
|
if(disp->driver.mem_fill_cb) {
|
||||||
lv_coord_t row;
|
lv_coord_t row;
|
||||||
for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) {
|
for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) {
|
||||||
disp->driver.mem_fill(&vdb_buf_tmp[vdb_rel_a.x1], w, color);
|
disp->driver.mem_fill_cb(vdb->buf_act, &vdb->area, &vdb_rel_a, color);
|
||||||
vdb_buf_tmp += vdb_width;
|
vdb_buf_tmp += vdb_width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*Use hw blend if present and the area is not too small*/
|
/*Use hw blend if present and the area is not too small*/
|
||||||
else if(lv_area_get_height(&vdb_rel_a) > VFILL_HW_ACC_SIZE_LIMIT &&
|
else if(lv_area_get_height(&vdb_rel_a) > VFILL_HW_ACC_SIZE_LIMIT &&
|
||||||
disp->driver.mem_blend) {
|
disp->driver.mem_blend_cb) {
|
||||||
/*Fill a one line sized buffer with a color and blend this later*/
|
/*Fill a one line sized buffer with a color and blend this later*/
|
||||||
if(color_array_tmp[0].full != color.full || last_width != w) {
|
if(color_array_tmp[0].full != color.full || last_width != w) {
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
@@ -179,7 +179,7 @@ void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_
|
|||||||
/*Blend the filled line to every line VDB line-by-line*/
|
/*Blend the filled line to every line VDB line-by-line*/
|
||||||
lv_coord_t row;
|
lv_coord_t row;
|
||||||
for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) {
|
for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) {
|
||||||
disp->driver.mem_blend(&vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa);
|
disp->driver.mem_blend_cb(&vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa);
|
||||||
vdb_buf_tmp += vdb_width;
|
vdb_buf_tmp += vdb_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -193,7 +193,7 @@ void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_
|
|||||||
/*Fill with opacity*/
|
/*Fill with opacity*/
|
||||||
else {
|
else {
|
||||||
/*Use hw blend if present*/
|
/*Use hw blend if present*/
|
||||||
if(disp->driver.mem_blend) {
|
if(disp->driver.mem_blend_cb) {
|
||||||
if(color_array_tmp[0].full != color.full || last_width != w) {
|
if(color_array_tmp[0].full != color.full || last_width != w) {
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
for(i = 0; i < w; i++) {
|
for(i = 0; i < w; i++) {
|
||||||
@@ -204,7 +204,7 @@ void lv_draw_fill(const lv_area_t * cords_p, const lv_area_t * mask_p, lv_color_
|
|||||||
}
|
}
|
||||||
lv_coord_t row;
|
lv_coord_t row;
|
||||||
for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) {
|
for(row = vdb_rel_a.y1; row <= vdb_rel_a.y2; row++) {
|
||||||
disp->driver.mem_blend(&vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa);
|
disp->driver.mem_blend_cb(&vdb_buf_tmp[vdb_rel_a.x1], color_array_tmp, w, opa);
|
||||||
vdb_buf_tmp += vdb_width;
|
vdb_buf_tmp += vdb_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -442,10 +442,10 @@ void lv_draw_map(const lv_area_t * cords_p, const lv_area_t * mask_p, const uint
|
|||||||
else {
|
else {
|
||||||
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
for(row = masked_a.y1; row <= masked_a.y2; row++) {
|
||||||
#if LV_USE_GPU
|
#if LV_USE_GPU
|
||||||
if(disp->driver.mem_blend == false) {
|
if(disp->driver.mem_blend_cb == false) {
|
||||||
sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa);
|
sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa);
|
||||||
} else {
|
} else {
|
||||||
disp->driver.mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa);
|
disp->driver.mem_blend_cb(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa);
|
sw_mem_blend(vdb_buf_tmp, (lv_color_t *)map_p, map_useful_w, opa);
|
||||||
|
|||||||
@@ -67,8 +67,8 @@ void lv_disp_drv_init(lv_disp_drv_t * driver)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LV_USE_GPU
|
#if LV_USE_GPU
|
||||||
driver->mem_blend = NULL;
|
driver->mem_blend_cb = NULL;
|
||||||
driver->mem_fill = NULL;
|
driver->mem_fill_cb = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
driver->set_px_cb = NULL;
|
driver->set_px_cb = NULL;
|
||||||
|
|||||||
@@ -90,6 +90,15 @@ typedef struct _disp_drv_t
|
|||||||
* number of flushed pixels */
|
* number of flushed pixels */
|
||||||
void (*monitor_cb)(struct _disp_drv_t * disp_drv, uint32_t time, uint32_t px);
|
void (*monitor_cb)(struct _disp_drv_t * disp_drv, uint32_t time, uint32_t px);
|
||||||
|
|
||||||
|
|
||||||
|
#if LV_USE_GPU
|
||||||
|
/*OPTIONAL: Blend two memories using opacity (GPU only)*/
|
||||||
|
void (*mem_blend_cb)(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa);
|
||||||
|
|
||||||
|
/*OPTIONAL: Fill a memory with a color (GPU only)*/
|
||||||
|
void (*mem_fill_cb)(lv_color_t * dest_buf, const lv_area_t * dest_area, const lv_area_t * fill_area, lv_color_t color);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if LV_USE_USER_DATA_SINGLE
|
#if LV_USE_USER_DATA_SINGLE
|
||||||
lv_disp_drv_user_data_t user_data;
|
lv_disp_drv_user_data_t user_data;
|
||||||
#endif
|
#endif
|
||||||
@@ -101,13 +110,6 @@ typedef struct _disp_drv_t
|
|||||||
lv_disp_drv_user_data_t monitor_user_data;
|
lv_disp_drv_user_data_t monitor_user_data;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LV_USE_GPU
|
|
||||||
/*OPTIONAL: Blend two memories using opacity (GPU only)*/
|
|
||||||
void (*mem_blend)(lv_color_t * dest, const lv_color_t * src, uint32_t length, lv_opa_t opa);
|
|
||||||
|
|
||||||
/*OPTIONAL: Fill a memory with a color (GPU only)*/
|
|
||||||
void (*mem_fill)(lv_color_t * dest, uint32_t length, lv_color_t color);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} lv_disp_drv_t;
|
} lv_disp_drv_t;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user