diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 93e3ccc36a..0503d6d6ff 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -25,6 +25,14 @@ /********************** * TYPEDEFS **********************/ + +typedef struct { + lv_draw_unit_t base_unit; + lv_draw_task_t * task_act; + lv_cache_t * texture_cache; + lv_draw_buf_t render_draw_buf; +} lv_draw_sdl_unit_t; + typedef struct { lv_draw_dsc_base_t * draw_dsc; int32_t w; @@ -45,7 +53,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data); /********************** * GLOBAL PROTOTYPES **********************/ -static uint8_t sdl_render_buf[2048 * 1024 * 4]; /********************** * STATIC VARIABLES @@ -119,6 +126,8 @@ void lv_draw_sdl_init(void) .free_cb = (lv_cache_free_cb_t)sdl_texture_cache_free_cb, }); lv_cache_set_name(draw_sdl_unit->texture_cache, "SDL_TEXTURE"); + + lv_draw_buf_init(&draw_sdl_unit->render_draw_buf, 0, 0, LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, NULL, 0); } /********************** @@ -194,16 +203,25 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) int32_t texture_w = lv_area_get_width(&task->_real_area); int32_t texture_h = lv_area_get_height(&task->_real_area); - lv_draw_buf_t draw_buf; - dest_layer.draw_buf = &draw_buf; - lv_draw_buf_init(dest_layer.draw_buf, texture_w, texture_h, - LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO, sdl_render_buf, sizeof(sdl_render_buf)); - dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888; + if(!lv_draw_buf_reshape(&u->render_draw_buf, LV_COLOR_FORMAT_ARGB8888, texture_w, texture_h, LV_STRIDE_AUTO)) { + uint8_t * data = u->render_draw_buf.unaligned_data; + uint32_t data_size = LV_DRAW_BUF_SIZE(texture_w, texture_h, LV_COLOR_FORMAT_ARGB8888); + if(data == NULL) data = malloc(data_size); + else data = realloc(data, data_size); + LV_ASSERT_MALLOC(data); + lv_result_t init_result = lv_draw_buf_init(&u->render_draw_buf, texture_w, texture_h, LV_COLOR_FORMAT_ARGB8888, + LV_STRIDE_AUTO, data, data_size); + LV_ASSERT(init_result == LV_RESULT_OK); + } + + + dest_layer.draw_buf = &u->render_draw_buf; + dest_layer.color_format = LV_COLOR_FORMAT_ARGB8888; dest_layer.buf_area = task->_real_area; dest_layer._clip_area = task->_real_area; dest_layer.phy_clip_area = task->_real_area; - lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4 + 100); + lv_memzero(u->render_draw_buf.data, lv_area_get_size(&task->_real_area) * 4); lv_display_t * disp = lv_refr_get_disp_refreshing(); @@ -307,7 +325,7 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) SDL_Texture * texture = SDL_CreateTexture(lv_sdl_window_get_renderer(disp), SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STATIC, texture_w, texture_h); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); - SDL_UpdateTexture(texture, NULL, sdl_render_buf, texture_w * 4); + SDL_UpdateTexture(texture, NULL, u->render_draw_buf.data, texture_w * 4); lv_draw_dsc_base_t * base_dsc = task->draw_dsc; @@ -379,24 +397,47 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) void * user_data_saved = data_to_find.draw_dsc->user_data; data_to_find.draw_dsc->user_data = NULL; - /*img_dsc->image_area is an absolute coordinate so it's different - *for the same image on a different position. So make it relative before using for cache. */ + /*Absolute coordinates are different for the same draw_dsc on a different position. + *So make everything relative to 0;0 before caching*/ + lv_area_t a = t->area; if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)data_to_find.draw_dsc; lv_area_move(&img_dsc->image_area, -t->area.x1, -t->area.y1); } + else if(t->type == LV_DRAW_TASK_TYPE_TRIANGLE) { + lv_draw_triangle_dsc_t * tri_dsc = (lv_draw_triangle_dsc_t *)data_to_find.draw_dsc; + tri_dsc->p[0].x -= t->area.x1; + tri_dsc->p[0].y -= t->area.y1; + tri_dsc->p[1].x -= t->area.x1; + tri_dsc->p[1].y -= t->area.y1; + tri_dsc->p[2].x -= t->area.x1; + tri_dsc->p[2].y -= t->area.y1; + } + else if(t->type == LV_DRAW_TASK_TYPE_LINE) { + lv_draw_line_dsc_t * line_dsc = (lv_draw_line_dsc_t *)data_to_find.draw_dsc; + line_dsc->p1.x -= t->area.x1; + line_dsc->p1.y -= t->area.y1; + line_dsc->p2.x -= t->area.x1; + line_dsc->p2.y -= t->area.y1; + } + else if(t->type == LV_DRAW_TASK_TYPE_ARC) { + lv_draw_arc_dsc_t * arc_dsc = (lv_draw_arc_dsc_t *)data_to_find.draw_dsc; + arc_dsc->center.x -= t->area.x1; + arc_dsc->center.y -= t->area.y1; + } + + lv_area_move(&t->area, -a.x1, -a.y1); + lv_area_move(&t->_real_area, -a.x1, -a.y1); lv_cache_entry_t * entry_cached = lv_cache_acquire_or_create(u->texture_cache, &data_to_find, u); - if(t->type == LV_DRAW_TASK_TYPE_IMAGE) { - lv_draw_image_dsc_t * img_dsc = (lv_draw_image_dsc_t *)data_to_find.draw_dsc; - lv_area_move(&img_dsc->image_area, t->area.x1, t->area.y1); - } + + lv_area_move(&t->area, a.x1, a.y1); + lv_area_move(&t->_real_area, a.x1, a.y1); if(!entry_cached) { return; } - data_to_find.draw_dsc->user_data = user_data_saved; cache_data_t * data_cached = lv_cache_entry_get_data(entry_cached); diff --git a/src/draw/sdl/lv_draw_sdl.h b/src/draw/sdl/lv_draw_sdl.h index cb370a1bb0..db1a4a8a32 100644 --- a/src/draw/sdl/lv_draw_sdl.h +++ b/src/draw/sdl/lv_draw_sdl.h @@ -37,12 +37,6 @@ extern "C" { * TYPEDEFS **********************/ -typedef struct { - lv_draw_unit_t base_unit; - lv_draw_task_t * task_act; - lv_cache_t * texture_cache; -} lv_draw_sdl_unit_t; - /********************** * GLOBAL PROTOTYPES **********************/