From 39993427d71283941863930437f9e072e532c2a0 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Thu, 27 Jun 2024 23:40:48 +0200 Subject: [PATCH 01/15] add other line, triangle, and shadow drawing --- demos/widgets/lv_demo_widgets.c | 4 +- src/draw/lv_draw_arc.c | 1 + src/draw/lv_draw_line.c | 1 + src/draw/lv_draw_triangle.c | 1 + src/draw/sdl/lv_draw_sdl.c | 114 ++++++++++++++++++++++++-------- 5 files changed, 90 insertions(+), 31 deletions(-) diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index a8ee61764a4d..05d413ecd138 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -252,8 +252,8 @@ static void profile_create(lv_obj_t * parent) LV_IMAGE_DECLARE(img_demo_widgets_avatar); lv_obj_t * avatar = lv_image_create(panel1); - lv_image_set_src(avatar, &img_demo_widgets_avatar); - // lv_image_set_src(avatar, "A:lvgl/demos/widgets/assets/avatar.png") + // lv_image_set_src(avatar, &img_demo_widgets_avatar); + lv_image_set_src(avatar, "A:lvgl/demos/widgets/assets/avatar.png"); lv_obj_t * name = lv_label_create(panel1); lv_label_set_text(name, "Elena Smith"); diff --git a/src/draw/lv_draw_arc.c b/src/draw/lv_draw_arc.c index 670aedec4e04..f092ea73ff15 100644 --- a/src/draw/lv_draw_arc.c +++ b/src/draw/lv_draw_arc.c @@ -42,6 +42,7 @@ void lv_draw_arc_dsc_init(lv_draw_arc_dsc_t * dsc) dsc->width = 1; dsc->opa = LV_OPA_COVER; dsc->color = lv_color_black(); + dsc->base.dsc_size = sizeof(lv_draw_arc_dsc_t); } lv_draw_arc_dsc_t * lv_draw_task_get_arc_dsc(lv_draw_task_t * task) diff --git a/src/draw/lv_draw_line.c b/src/draw/lv_draw_line.c index 51d3040b2b4a..00fc203b10d9 100644 --- a/src/draw/lv_draw_line.c +++ b/src/draw/lv_draw_line.c @@ -42,6 +42,7 @@ void LV_ATTRIBUTE_FAST_MEM lv_draw_line_dsc_init(lv_draw_line_dsc_t * dsc) dsc->width = 1; dsc->opa = LV_OPA_COVER; dsc->color = lv_color_black(); + dsc->base.dsc_size = sizeof(lv_draw_line_dsc_t); } lv_draw_line_dsc_t * lv_draw_task_get_line_dsc(lv_draw_task_t * task) diff --git a/src/draw/lv_draw_triangle.c b/src/draw/lv_draw_triangle.c index 44d5be3ffd1e..6bf1c7c21cc0 100644 --- a/src/draw/lv_draw_triangle.c +++ b/src/draw/lv_draw_triangle.c @@ -48,6 +48,7 @@ void lv_draw_triangle_dsc_init(lv_draw_triangle_dsc_t * dsc) dsc->bg_grad.stops[1].frac = 0xFF; dsc->bg_grad.stops_count = 2; dsc->bg_opa = LV_OPA_COVER; + dsc->base.dsc_size = sizeof(lv_draw_triangle_dsc_t); LV_PROFILER_END; } diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index d72ab67ab29c..943e80e07ff7 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -16,6 +16,7 @@ #include "../../display/lv_display_private.h" #include "../../stdlib/lv_string.h" #include "../../drivers/sdl/lv_sdl_window.h" +#include "../../misc/cache/lv_cache_entry_private.h" /********************* * DEFINES @@ -40,7 +41,7 @@ static void execute_drawing(lv_draw_sdl_unit_t * u); static int32_t dispatch(lv_draw_unit_t * draw_unit, lv_layer_t * layer); static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task); -static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data); +static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data); /********************** * GLOBAL PROTOTYPES @@ -169,23 +170,34 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) return 0; } -static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) +static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) { lv_draw_task_t * task = u->task_act; lv_layer_t dest_layer; lv_memzero(&dest_layer, sizeof(dest_layer)); + + 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, lv_area_get_width(&task->area), lv_area_get_height(&task->area), + 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; - dest_layer.buf_area = task->area; - dest_layer._clip_area = task->area; - lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4 + 100); + dest_layer.buf_area = task->_real_area; + dest_layer._clip_area = task->_real_area; + lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4); lv_display_t * disp = lv_refr_get_disp_refreshing(); + lv_obj_t * obj = ((lv_draw_dsc_base_t *)task->draw_dsc)->obj; + bool original_send_draw_task_event = false; + if(obj) { + original_send_draw_task_event = lv_obj_has_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + lv_obj_remove_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); + } + SDL_Texture * texture = NULL; switch(task->type) { case LV_DRAW_TASK_TYPE_FILL: { @@ -202,7 +214,7 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) } break; case LV_DRAW_TASK_TYPE_BORDER: { - lv_draw_border_dsc_t * border_dsc = task->draw_dsc;; + lv_draw_border_dsc_t * border_dsc = task->draw_dsc; lv_draw_rect_dsc_t rect_dsc; lv_draw_rect_dsc_init(&rect_dsc); rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); @@ -215,6 +227,22 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) lv_draw_rect(&dest_layer, &rect_dsc, &task->area); break; } + case LV_DRAW_TASK_TYPE_BOX_SHADOW: { + lv_draw_box_shadow_dsc_t * box_shadow_dsc = task->draw_dsc; + lv_draw_rect_dsc_t rect_dsc; + lv_draw_rect_dsc_init(&rect_dsc); + rect_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + rect_dsc.bg_opa = LV_OPA_0; + rect_dsc.radius = box_shadow_dsc->radius; + rect_dsc.bg_color = box_shadow_dsc->color; + rect_dsc.shadow_opa = LV_OPA_20;//box_shadow_dsc->opa; + rect_dsc.shadow_width = box_shadow_dsc->width; + rect_dsc.shadow_spread = box_shadow_dsc->spread; + rect_dsc.shadow_offset_x = box_shadow_dsc->ofs_x; + rect_dsc.shadow_offset_y = box_shadow_dsc->ofs_y; + lv_draw_rect(&dest_layer, &rect_dsc, &task->area); + break; + } case LV_DRAW_TASK_TYPE_LABEL: { lv_draw_label_dsc_t label_dsc; lv_draw_label_dsc_init(&label_dsc); @@ -223,6 +251,30 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) lv_draw_label(&dest_layer, &label_dsc, &task->area); } break; + case LV_DRAW_TASK_TYPE_ARC: { + lv_draw_arc_dsc_t arc_dsc; + lv_draw_arc_dsc_init(&arc_dsc); + lv_memcpy(&arc_dsc, task->draw_dsc, sizeof(arc_dsc)); + arc_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_arc(&dest_layer, &arc_dsc); + } + break; + case LV_DRAW_TASK_TYPE_LINE: { + lv_draw_line_dsc_t line_dsc; + lv_draw_line_dsc_init(&line_dsc); + lv_memcpy(&line_dsc, task->draw_dsc, sizeof(line_dsc)); + line_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_line(&dest_layer, &line_dsc); + } + break; + case LV_DRAW_TASK_TYPE_TRIANGLE: { + lv_draw_triangle_dsc_t triangle_dsc; + lv_draw_triangle_dsc_init(&triangle_dsc); + lv_memcpy(&triangle_dsc, task->draw_dsc, sizeof(triangle_dsc)); + triangle_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_triangle(&dest_layer, &triangle_dsc); + } + break; case LV_DRAW_TASK_TYPE_IMAGE: { lv_draw_image_dsc_t * image_dsc = task->draw_dsc; lv_image_src_t type = lv_image_src_get_type(image_dsc->src); @@ -271,6 +323,7 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) return false; } + while(dest_layer.draw_task_head) { lv_draw_dispatch_layer(disp, &dest_layer); if(dest_layer.draw_task_head) { @@ -278,17 +331,11 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) } } - SDL_Rect rect; - rect.x = dest_layer.buf_area.x1; - rect.y = dest_layer.buf_area.y1; - rect.w = lv_area_get_width(&dest_layer.buf_area); - rect.h = lv_area_get_height(&dest_layer.buf_area); - if(texture == NULL) { texture = SDL_CreateTexture(lv_sdl_window_get_renderer(disp), SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STATIC, rect.w, rect.h); + SDL_TEXTUREACCESS_STATIC, texture_w, texture_h); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); - SDL_UpdateTexture(texture, NULL, sdl_render_buf, rect.w * 4); + SDL_UpdateTexture(texture, NULL, sdl_render_buf, texture_w * 4); } else { SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); @@ -296,11 +343,15 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * data) lv_draw_dsc_base_t * base_dsc = task->draw_dsc; - data->draw_dsc = lv_malloc(base_dsc->dsc_size); - lv_memcpy((void *)data->draw_dsc, base_dsc, base_dsc->dsc_size); - data->w = lv_area_get_width(&task->area); - data->h = lv_area_get_height(&task->area); - data->texture = texture; + cache_data->draw_dsc = lv_malloc(base_dsc->dsc_size); + lv_memcpy((void *)cache_data->draw_dsc, base_dsc, base_dsc->dsc_size); + cache_data->w = texture_w; + cache_data->h = texture_h; + cache_data->texture = texture; + + if(obj) { + lv_obj_update_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS, original_send_draw_task_event); + } return true; } @@ -338,7 +389,6 @@ static void blend_texture_layer(lv_draw_sdl_unit_t * u) static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) { - lv_draw_task_t * t = u->task_act; cache_data_t data_to_find; @@ -394,10 +444,10 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) SDL_RenderCopy(renderer, texture, NULL, &rect); } else { - rect.x = t->area.x1 - dest_layer->buf_area.x1; - rect.y = t->area.y1 - dest_layer->buf_area.y1; - rect.w = lv_area_get_width(&t->area); - rect.h = lv_area_get_height(&t->area); + rect.x = t->_real_area.x1 - dest_layer->buf_area.x1; + rect.y = t->_real_area.y1 - dest_layer->buf_area.y1; + rect.w = data_cached->w; + rect.h = data_cached->h; SDL_RenderSetClipRect(renderer, &clip_rect); SDL_RenderCopy(renderer, texture, NULL, &rect); @@ -405,17 +455,23 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) SDL_RenderSetClipRect(renderer, NULL); + /*Do not cache label's with local text as the text will be freed*/ + if(t->type == LV_DRAW_TASK_TYPE_LABEL) { + lv_draw_label_dsc_t * label_dsc = t->draw_dsc; + if(label_dsc->text_local) { + // lv_cache_entry_set_invalid(entry_cached, true); + printf("a\n"); + } + } + printf("b\n"); lv_cache_release(u->texture_cache, entry_cached, u); + printf("c\n"); } static void execute_drawing(lv_draw_sdl_unit_t * u) { lv_draw_task_t * t = u->task_act; - if(t->type == LV_DRAW_TASK_TYPE_BOX_SHADOW) return; - if(t->type == LV_DRAW_TASK_TYPE_LINE) return; - if(t->type == LV_DRAW_TASK_TYPE_TRIANGLE) return; - if(t->type == LV_DRAW_TASK_TYPE_LAYER) { blend_texture_layer(u); } From 10542979006994763d6cbbca4dea4383d53ab4a6 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 17 Jul 2024 16:59:55 +0200 Subject: [PATCH 02/15] fix crash --- demos/widgets/lv_demo_widgets.c | 3 +-- src/draw/sdl/lv_draw_sdl.c | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index 05d413ecd138..26a8279c4859 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -252,8 +252,7 @@ static void profile_create(lv_obj_t * parent) LV_IMAGE_DECLARE(img_demo_widgets_avatar); lv_obj_t * avatar = lv_image_create(panel1); - // lv_image_set_src(avatar, &img_demo_widgets_avatar); - lv_image_set_src(avatar, "A:lvgl/demos/widgets/assets/avatar.png"); + lv_image_set_src(avatar, &img_demo_widgets_avatar); lv_obj_t * name = lv_label_create(panel1); lv_label_set_text(name, "Elena Smith"); diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 943e80e07ff7..4a08412bbd90 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -172,6 +172,9 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) { + static int32_t x = 0; + printf("%d\n", x++); + lv_draw_task_t * task = u->task_act; lv_layer_t dest_layer; @@ -345,8 +348,10 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) cache_data->draw_dsc = lv_malloc(base_dsc->dsc_size); lv_memcpy((void *)cache_data->draw_dsc, base_dsc, base_dsc->dsc_size); - cache_data->w = texture_w; - cache_data->h = texture_h; + // cache_data->w = texture_w; + // cache_data->h = texture_h; + cache_data->w = lv_area_get_width(&task->area); + cache_data->h = lv_area_get_height(&task->area); cache_data->texture = texture; if(obj) { @@ -426,13 +431,13 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) SDL_SetRenderTarget(renderer, layer_get_texture(dest_layer)); - lv_draw_image_dsc_t * draw_dsc = lv_draw_task_get_image_dsc(t); - if(draw_dsc) { + lv_draw_image_dsc_t * image_draw_dsc = lv_draw_task_get_image_dsc(t); + if(image_draw_dsc) { lv_area_t image_area; image_area.x1 = 0; image_area.y1 = 0; - image_area.x2 = draw_dsc->header.w - 1; - image_area.y2 = draw_dsc->header.h - 1; + image_area.x2 = image_draw_dsc->header.w - 1; + image_area.y2 = image_draw_dsc->header.h - 1; lv_area_move(&image_area, t->area.x1 - dest_layer->buf_area.x1, t->area.y1 - dest_layer->buf_area.y1); rect.x = image_area.x1; @@ -441,7 +446,9 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) rect.h = lv_area_get_height(&image_area); SDL_RenderSetClipRect(renderer, &clip_rect); - SDL_RenderCopy(renderer, texture, NULL, &rect); + // SDL_RenderCopy(renderer, texture, NULL, &rect); + SDL_Point center = {image_draw_dsc->pivot.x, image_draw_dsc->pivot.y}; + SDL_RenderCopyEx(renderer, texture, NULL, &rect, image_draw_dsc->rotation / 10, ¢er, SDL_FLIP_NONE); } else { rect.x = t->_real_area.x1 - dest_layer->buf_area.x1; @@ -455,17 +462,15 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) SDL_RenderSetClipRect(renderer, NULL); + lv_cache_release(u->texture_cache, entry_cached, u); + /*Do not cache label's with local text as the text will be freed*/ if(t->type == LV_DRAW_TASK_TYPE_LABEL) { lv_draw_label_dsc_t * label_dsc = t->draw_dsc; if(label_dsc->text_local) { - // lv_cache_entry_set_invalid(entry_cached, true); - printf("a\n"); + lv_cache_drop(u->texture_cache, &data_to_find, NULL); } } - printf("b\n"); - lv_cache_release(u->texture_cache, entry_cached, u); - printf("c\n"); } static void execute_drawing(lv_draw_sdl_unit_t * u) From d4dc5b57714cb0ada0a023f874ba296c79f1ec47 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 17 Jul 2024 17:58:51 +0200 Subject: [PATCH 03/15] remove SDL_image --- demos/widgets/lv_demo_widgets.c | 1 + examples/widgets/image/lv_example_image_1.c | 10 +- src/draw/sdl/lv_draw_sdl.c | 111 +++++--------------- 3 files changed, 32 insertions(+), 90 deletions(-) diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index 26a8279c4859..1cdf538ffa65 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -253,6 +253,7 @@ static void profile_create(lv_obj_t * parent) LV_IMAGE_DECLARE(img_demo_widgets_avatar); lv_obj_t * avatar = lv_image_create(panel1); lv_image_set_src(avatar, &img_demo_widgets_avatar); + lv_image_set_rotation(avatar, 300); lv_obj_t * name = lv_label_create(panel1); lv_label_set_text(name, "Elena Smith"); diff --git a/examples/widgets/image/lv_example_image_1.c b/examples/widgets/image/lv_example_image_1.c index 0e2bd55e1073..a9ff76b6a0a1 100644 --- a/examples/widgets/image/lv_example_image_1.c +++ b/examples/widgets/image/lv_example_image_1.c @@ -7,10 +7,14 @@ void lv_example_image_1(void) lv_obj_t * img1 = lv_image_create(lv_screen_active()); lv_image_set_src(img1, &img_cogwheel_argb); lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_style_transform_rotation(img1, 600, 0); + lv_obj_set_style_transform_scale(img1, 700, 0); + lv_obj_set_style_transform_pivot_x(img1, -100, 0); - lv_obj_t * img2 = lv_image_create(lv_screen_active()); - lv_image_set_src(img2, LV_SYMBOL_OK "Accept"); - lv_obj_align_to(img2, img1, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + + // lv_obj_t * img2 = lv_image_create(lv_screen_active()); + // lv_image_set_src(img2, LV_SYMBOL_OK "Accept"); + // lv_obj_align_to(img2, img1, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); } #endif diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 4a08412bbd90..deeecad1340d 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -9,8 +9,6 @@ #include "../lv_draw_private.h" #if LV_USE_DRAW_SDL #include LV_SDL_INCLUDE_PATH -#include - #include "lv_draw_sdl.h" #include "../../core/lv_refr_private.h" #include "../../display/lv_display_private.h" @@ -238,7 +236,7 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) rect_dsc.bg_opa = LV_OPA_0; rect_dsc.radius = box_shadow_dsc->radius; rect_dsc.bg_color = box_shadow_dsc->color; - rect_dsc.shadow_opa = LV_OPA_20;//box_shadow_dsc->opa; + rect_dsc.shadow_opa = box_shadow_dsc->opa; rect_dsc.shadow_width = box_shadow_dsc->width; rect_dsc.shadow_spread = box_shadow_dsc->spread; rect_dsc.shadow_offset_x = box_shadow_dsc->ofs_x; @@ -279,47 +277,11 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) } break; case LV_DRAW_TASK_TYPE_IMAGE: { - lv_draw_image_dsc_t * image_dsc = task->draw_dsc; - lv_image_src_t type = lv_image_src_get_type(image_dsc->src); - SDL_Surface * surface = NULL; - if(type == LV_IMAGE_SRC_FILE) { - const char * path = image_dsc->src; - surface = IMG_Load(&path[2]); - if(surface == NULL) { - LV_LOG_ERROR("could not load image from file: %s", IMG_GetError()); - return false; - } - } - else if(type == LV_IMAGE_SRC_VARIABLE) { - lv_image_dsc_t * lvd = (lv_image_dsc_t *)image_dsc->src; - surface = SDL_CreateRGBSurfaceFrom((void *)lvd->data, - lvd->header.w, lvd->header.h, - LV_COLOR_FORMAT_GET_BPP(lvd->header.cf), - lvd->header.stride, -#if SDL_BYTEORDER == SDL_LIL_ENDIAN - 0x00FF0000, - 0x0000FF00, - 0x000000FF, - 0xFF000000 -#else - 0x0000FF00, - 0x00FF0000, - 0xFF000000, - 0x000000FF -#endif - ); - if(surface == NULL) { - LV_LOG_ERROR("could not load image from variable"); - return false; - } - } - else { - LV_LOG_WARN("image source type unknown"); - return false; - } - - SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); - texture = SDL_CreateTextureFromSurface(renderer, surface); + lv_draw_image_dsc_t image_dsc; + lv_draw_image_dsc_init(&image_dsc); + lv_memcpy(&image_dsc, task->draw_dsc, sizeof(image_dsc)); + image_dsc.base.user_data = lv_sdl_window_get_renderer(disp); + lv_draw_image(&dest_layer, &image_dsc, &task->area); break; } default: @@ -334,24 +296,17 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) } } - if(texture == NULL) { - 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); - } - else { - SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); - } + 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); lv_draw_dsc_base_t * base_dsc = task->draw_dsc; cache_data->draw_dsc = lv_malloc(base_dsc->dsc_size); lv_memcpy((void *)cache_data->draw_dsc, base_dsc, base_dsc->dsc_size); - // cache_data->w = texture_w; - // cache_data->h = texture_h; - cache_data->w = lv_area_get_width(&task->area); - cache_data->h = lv_area_get_height(&task->area); + cache_data->w = texture_w; + cache_data->h = texture_h; cache_data->texture = texture; if(obj) { @@ -387,7 +342,10 @@ static void blend_texture_layer(lv_draw_sdl_unit_t * u) SDL_SetTextureBlendMode(src_texture, SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(renderer, layer_get_texture(u->base_unit.target_layer)); SDL_RenderSetClipRect(renderer, &clip_rect); - SDL_RenderCopy(renderer, src_texture, NULL, &rect); + + SDL_Point center = {draw_dsc->pivot.x, draw_dsc->pivot.y}; + SDL_RenderCopyEx(renderer, src_texture, NULL, &rect, draw_dsc->rotation / 10, ¢er, SDL_FLIP_NONE); + SDL_DestroyTexture(src_texture); SDL_RenderSetClipRect(renderer, NULL); } @@ -399,8 +357,8 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) cache_data_t data_to_find; data_to_find.draw_dsc = (lv_draw_dsc_base_t *)t->draw_dsc; - data_to_find.w = lv_area_get_width(&t->area); - data_to_find.h = lv_area_get_height(&t->area); + data_to_find.w = lv_area_get_width(&t->_real_area); + data_to_find.h = lv_area_get_height(&t->_real_area); data_to_find.texture = NULL; /*user_data stores the renderer to differentiate it from SW rendered tasks. @@ -431,34 +389,13 @@ static void draw_from_cached_texture(lv_draw_sdl_unit_t * u) SDL_SetRenderTarget(renderer, layer_get_texture(dest_layer)); - lv_draw_image_dsc_t * image_draw_dsc = lv_draw_task_get_image_dsc(t); - if(image_draw_dsc) { - lv_area_t image_area; - image_area.x1 = 0; - image_area.y1 = 0; - image_area.x2 = image_draw_dsc->header.w - 1; - image_area.y2 = image_draw_dsc->header.h - 1; - - lv_area_move(&image_area, t->area.x1 - dest_layer->buf_area.x1, t->area.y1 - dest_layer->buf_area.y1); - rect.x = image_area.x1; - rect.y = image_area.y1; - rect.w = lv_area_get_width(&image_area); - rect.h = lv_area_get_height(&image_area); - - SDL_RenderSetClipRect(renderer, &clip_rect); - // SDL_RenderCopy(renderer, texture, NULL, &rect); - SDL_Point center = {image_draw_dsc->pivot.x, image_draw_dsc->pivot.y}; - SDL_RenderCopyEx(renderer, texture, NULL, &rect, image_draw_dsc->rotation / 10, ¢er, SDL_FLIP_NONE); - } - else { - rect.x = t->_real_area.x1 - dest_layer->buf_area.x1; - rect.y = t->_real_area.y1 - dest_layer->buf_area.y1; - rect.w = data_cached->w; - rect.h = data_cached->h; + rect.x = t->_real_area.x1 - dest_layer->buf_area.x1; + rect.y = t->_real_area.y1 - dest_layer->buf_area.y1; + rect.w = data_cached->w; + rect.h = data_cached->h; - SDL_RenderSetClipRect(renderer, &clip_rect); - SDL_RenderCopy(renderer, texture, NULL, &rect); - } + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_RenderCopy(renderer, texture, NULL, &rect); SDL_RenderSetClipRect(renderer, NULL); From 9a8a4f183aebb934fb0d90c511cc4ee521ed8fbd Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 17 Jul 2024 18:01:03 +0200 Subject: [PATCH 04/15] fix widget demo typo --- demos/widgets/lv_demo_widgets.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/demos/widgets/lv_demo_widgets.c b/demos/widgets/lv_demo_widgets.c index 1cdf538ffa65..21a366d834f2 100644 --- a/demos/widgets/lv_demo_widgets.c +++ b/demos/widgets/lv_demo_widgets.c @@ -253,7 +253,6 @@ static void profile_create(lv_obj_t * parent) LV_IMAGE_DECLARE(img_demo_widgets_avatar); lv_obj_t * avatar = lv_image_create(panel1); lv_image_set_src(avatar, &img_demo_widgets_avatar); - lv_image_set_rotation(avatar, 300); lv_obj_t * name = lv_label_create(panel1); lv_label_set_text(name, "Elena Smith"); @@ -998,11 +997,11 @@ void shop_create(lv_obj_t * parent) lv_obj_add_style(title, &style_title, 0); LV_IMAGE_DECLARE(img_clothes); - create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$722"); - create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$411"); - create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$917"); - create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$64"); - create_shop_item(list, &img_clothes, "Blue jeans", "Clothes", "$805"); + create_shop_item(list, &img_clothes, "Blue T-shirt", "Clothes", "$722"); + create_shop_item(list, &img_clothes, "Blue T-shirt", "Clothes", "$411"); + create_shop_item(list, &img_clothes, "Blue T-shirt", "Clothes", "$917"); + create_shop_item(list, &img_clothes, "Blue T-shirt", "Clothes", "$64"); + create_shop_item(list, &img_clothes, "Blue T-shirt", "Clothes", "$805"); lv_obj_t * notifications = lv_obj_create(parent); if(disp_size == DISP_SMALL) { From 76bf1058e1a13fd24dd590c9a34c70d72fa13203 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 29 Jul 2024 10:35:58 +0200 Subject: [PATCH 05/15] use simple fill directly --- src/draw/sdl/lv_draw_sdl.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index deeecad1340d..eff643338362 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -414,6 +414,34 @@ static void execute_drawing(lv_draw_sdl_unit_t * u) { lv_draw_task_t * t = u->task_act; + if(t->type == LV_DRAW_TASK_TYPE_FILL) { + lv_draw_fill_dsc_t * fill_dsc = t->draw_dsc; + if(fill_dsc->radius == 0 && fill_dsc->grad.dir == LV_GRAD_DIR_NONE) { + SDL_Rect rect; + lv_layer_t * layer = u->base_unit.target_layer; + rect.x = t->area.x1 - layer->buf_area.x1; + rect.y = t->area.y1 - layer->buf_area.y1; + rect.w = lv_area_get_width(&t->area); + rect.h = lv_area_get_height(&t->area); + + lv_display_t * disp = _lv_refr_get_disp_refreshing(); + SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); + SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); + SDL_SetRenderDrawColor(renderer, fill_dsc->color.red, fill_dsc->color.green, fill_dsc->color.blue, fill_dsc->opa); + + SDL_Rect clip_rect; + clip_rect.x = u->base_unit.clip_area->x1 - layer->buf_area.x1; + clip_rect.y = u->base_unit.clip_area->y1 - layer->buf_area.y1; + clip_rect.w = lv_area_get_width(u->base_unit.clip_area); + clip_rect.h = lv_area_get_height(u->base_unit.clip_area); + + SDL_RenderSetClipRect(renderer, &clip_rect); + SDL_RenderFillRect(renderer, &rect); + SDL_RenderSetClipRect(renderer, NULL); + return; + } + } + if(t->type == LV_DRAW_TASK_TYPE_LAYER) { blend_texture_layer(u); } From 6016a4f34995bf70ce2f61d9b47f76d43e4ef102 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 29 Jul 2024 11:49:51 +0200 Subject: [PATCH 06/15] handle layer scale --- src/draw/sdl/lv_draw_sdl.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index eff643338362..1a32ce5c86cc 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -328,13 +328,18 @@ static void blend_texture_layer(lv_draw_sdl_unit_t * u) clip_rect.h = lv_area_get_height(u->base_unit.clip_area); lv_draw_task_t * t = u->task_act; + lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; SDL_Rect rect; - rect.x = t->area.x1; - rect.y = t->area.y1; - rect.w = lv_area_get_width(&t->area); - rect.h = lv_area_get_height(&t->area); + rect.w = (lv_area_get_width(&t->area) * draw_dsc->scale_x) / 256; + rect.h = (lv_area_get_height(&t->area) * draw_dsc->scale_y) / 256; + + rect.x = -draw_dsc->pivot.x; + rect.y = -draw_dsc->pivot.y; + rect.x = (rect.x * draw_dsc->scale_x) / 256; + rect.y = (rect.y * draw_dsc->scale_y) / 256; + rect.x += t->area.x1 + draw_dsc->pivot.x; + rect.y += t->area.y1 + draw_dsc->pivot.y; - lv_draw_image_dsc_t * draw_dsc = t->draw_dsc; lv_layer_t * src_layer = (lv_layer_t *)draw_dsc->src; SDL_Texture * src_texture = layer_get_texture(src_layer); From b832344f21ff2d22af78ef32b3e25b4de4fd3122 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Mon, 29 Jul 2024 11:53:42 +0200 Subject: [PATCH 07/15] fix window resizing --- src/drivers/sdl/lv_sdl_window.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/drivers/sdl/lv_sdl_window.c b/src/drivers/sdl/lv_sdl_window.c index 2844112679ae..faa196a8d320 100644 --- a/src/drivers/sdl/lv_sdl_window.c +++ b/src/drivers/sdl/lv_sdl_window.c @@ -14,6 +14,7 @@ #include "../../core/lv_global.h" #include "../../display/lv_display_private.h" #include "../../lv_init.h" +#include "../../draw/lv_draw_buf.h" /* for aligned_alloc */ #ifndef __USE_ISOC11 @@ -133,12 +134,13 @@ lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res) LV_SDL_RENDER_MODE); } #else /*/*LV_USE_DRAW_SDL == 1*/ - uint32_t stride = lv_draw_buf_width_to_stride(disp->hor_res, - lv_display_get_color_format(disp)); /*It will render directly to default Texture, so the buffer is not used, so just set something*/ - static uint8_t dummy_buf[1]; - lv_display_set_buffers(disp, dummy_buf, NULL, stride * disp->ver_res, - LV_SDL_RENDER_MODE); + static lv_draw_buf_t draw_buf; + static uint8_t dummy_buf; /*It won't be used as it will render to the SDL textures directly*/ + lv_draw_buf_init(&draw_buf, 4096, 4096, LV_COLOR_FORMAT_ARGB8888, 4096 * 4, &dummy_buf, 4096 * 4096 * 4); + + lv_display_set_draw_buffers(disp, &draw_buf, NULL); + lv_display_set_render_mode(disp, LV_DISPLAY_RENDER_MODE_DIRECT); #endif /*LV_USE_DRAW_SDL == 0*/ lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); From 4ffe7c12320206624909a4290d8a67d9e2a151bd Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 14 Aug 2024 15:51:50 +0200 Subject: [PATCH 08/15] optimize performance --- lv_conf_template.h | 1 + src/draw/sdl/lv_draw_sdl.c | 48 ++++++++++++++++++++------------- src/drivers/sdl/lv_sdl_window.c | 3 ++- src/lv_conf_internal.h | 11 ++++++++ 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/lv_conf_template.h b/lv_conf_template.h index 956e764fc09d..934aaaf94cc5 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -938,6 +938,7 @@ #define LV_SDL_INCLUDE_PATH #define LV_SDL_RENDER_MODE LV_DISPLAY_RENDER_MODE_DIRECT /*LV_DISPLAY_RENDER_MODE_DIRECT is recommended for best performance*/ #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ + #define LV_SDL_ACCELERATED 1 /*1: Use hardware acceleration*/ #define LV_SDL_FULLSCREEN 0 /*1: Make the window full screen by default*/ #define LV_SDL_DIRECT_EXIT 1 /*1: Exit the application when all SDL windows are closed*/ #define LV_SDL_MOUSEWHEEL_MODE LV_SDL_MOUSEWHEEL_MODE_ENCODER /*LV_SDL_MOUSEWHEEL_MODE_ENCODER/CROWN*/ diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 1a32ce5c86cc..453a66f49e85 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -91,7 +91,12 @@ static lv_cache_compare_res_t sdl_texture_cache_compare_cb(const cache_data_t * return lhs_dsc_size > rhs_dsc_size ? 1 : -1; } - int cmp_res = memcmp(lhs->draw_dsc, rhs->draw_dsc, lhs->draw_dsc->dsc_size); + uint8_t * left_draw_dsc = lhs->draw_dsc; + uint8_t * right_draw_dsc = rhs->draw_dsc; + left_draw_dsc += sizeof(lv_draw_dsc_base_t); + right_draw_dsc += sizeof(lv_draw_dsc_base_t); + + int cmp_res = memcmp(left_draw_dsc, right_draw_dsc, lhs->draw_dsc->dsc_size - sizeof(lv_draw_dsc_base_t)); if(cmp_res != 0) { return cmp_res > 0 ? 1 : -1; @@ -189,7 +194,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) dest_layer.buf_area = task->_real_area; dest_layer._clip_area = task->_real_area; lv_memzero(sdl_render_buf, lv_area_get_size(&dest_layer.buf_area) * 4); - lv_display_t * disp = lv_refr_get_disp_refreshing(); lv_obj_t * obj = ((lv_draw_dsc_base_t *)task->draw_dsc)->obj; @@ -350,6 +354,7 @@ static void blend_texture_layer(lv_draw_sdl_unit_t * u) SDL_Point center = {draw_dsc->pivot.x, draw_dsc->pivot.y}; SDL_RenderCopyEx(renderer, src_texture, NULL, &rect, draw_dsc->rotation / 10, ¢er, SDL_FLIP_NONE); + // SDL_RenderCopy(renderer, src_texture, NULL, &rect); SDL_DestroyTexture(src_texture); SDL_RenderSetClipRect(renderer, NULL); @@ -371,11 +376,24 @@ 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. */ + 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_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); + } + 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); @@ -424,35 +442,29 @@ static void execute_drawing(lv_draw_sdl_unit_t * u) if(fill_dsc->radius == 0 && fill_dsc->grad.dir == LV_GRAD_DIR_NONE) { SDL_Rect rect; lv_layer_t * layer = u->base_unit.target_layer; - rect.x = t->area.x1 - layer->buf_area.x1; - rect.y = t->area.y1 - layer->buf_area.y1; - rect.w = lv_area_get_width(&t->area); - rect.h = lv_area_get_height(&t->area); + lv_area_t fill_area = t->area; + _lv_area_intersect(&fill_area, &fill_area, u->base_unit.clip_area); + rect.x = fill_area.x1 - layer->buf_area.x1; + rect.y = fill_area.y1 - layer->buf_area.y1; + rect.w = lv_area_get_width(&fill_area); + rect.h = lv_area_get_height(&fill_area); lv_display_t * disp = _lv_refr_get_disp_refreshing(); SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(renderer, fill_dsc->color.red, fill_dsc->color.green, fill_dsc->color.blue, fill_dsc->opa); - - SDL_Rect clip_rect; - clip_rect.x = u->base_unit.clip_area->x1 - layer->buf_area.x1; - clip_rect.y = u->base_unit.clip_area->y1 - layer->buf_area.y1; - clip_rect.w = lv_area_get_width(u->base_unit.clip_area); - clip_rect.h = lv_area_get_height(u->base_unit.clip_area); - - SDL_RenderSetClipRect(renderer, &clip_rect); - SDL_RenderFillRect(renderer, &rect); SDL_RenderSetClipRect(renderer, NULL); + SDL_RenderFillRect(renderer, &rect); return; } } if(t->type == LV_DRAW_TASK_TYPE_LAYER) { blend_texture_layer(u); + return; } - else { - draw_from_cached_texture(u); - } + + draw_from_cached_texture(u); } static SDL_Texture * layer_get_texture(lv_layer_t * layer) diff --git a/src/drivers/sdl/lv_sdl_window.c b/src/drivers/sdl/lv_sdl_window.c index faa196a8d320..7280a7b8d9f9 100644 --- a/src/drivers/sdl/lv_sdl_window.c +++ b/src/drivers/sdl/lv_sdl_window.c @@ -363,7 +363,8 @@ static void window_create(lv_display_t * disp) SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, hor_res * dsc->zoom, ver_res * dsc->zoom, flag); /*last param. SDL_WINDOW_BORDERLESS to hide borders*/ - dsc->renderer = SDL_CreateRenderer(dsc->window, -1, SDL_RENDERER_SOFTWARE); + dsc->renderer = SDL_CreateRenderer(dsc->window, -1, + LV_SDL_ACCELERATED ? SDL_RENDERER_ACCELERATED : SDL_RENDERER_SOFTWARE); #if LV_USE_DRAW_SDL == 0 texture_resize(disp); diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 1f950263d8d4..5e61563edc3c 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -3059,6 +3059,17 @@ #define LV_SDL_BUF_COUNT 1 /*1 or 2*/ #endif #endif + #ifndef LV_SDL_ACCELERATED + #ifdef _LV_KCONFIG_PRESENT + #ifdef CONFIG_LV_SDL_ACCELERATED + #define LV_SDL_ACCELERATED CONFIG_LV_SDL_ACCELERATED + #else + #define LV_SDL_ACCELERATED 0 + #endif + #else + #define LV_SDL_ACCELERATED 1 /*1: Use hardware acceleration*/ + #endif + #endif #ifndef LV_SDL_FULLSCREEN #ifdef CONFIG_LV_SDL_FULLSCREEN #define LV_SDL_FULLSCREEN CONFIG_LV_SDL_FULLSCREEN From f16fa63924224d860dce3c74be133c60b202a6f6 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 14 Aug 2024 15:59:44 +0200 Subject: [PATCH 09/15] fix warnings --- src/draw/sdl/lv_draw_sdl.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 453a66f49e85..d65b7374711f 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -15,6 +15,7 @@ #include "../../stdlib/lv_string.h" #include "../../drivers/sdl/lv_sdl_window.h" #include "../../misc/cache/lv_cache_entry_private.h" +#include "../../misc/lv_area_private.h" /********************* * DEFINES @@ -91,8 +92,8 @@ static lv_cache_compare_res_t sdl_texture_cache_compare_cb(const cache_data_t * return lhs_dsc_size > rhs_dsc_size ? 1 : -1; } - uint8_t * left_draw_dsc = lhs->draw_dsc; - uint8_t * right_draw_dsc = rhs->draw_dsc; + const uint8_t * left_draw_dsc = (const uint8_t *)lhs->draw_dsc; + const uint8_t * right_draw_dsc = (const uint8_t *)rhs->draw_dsc; left_draw_dsc += sizeof(lv_draw_dsc_base_t); right_draw_dsc += sizeof(lv_draw_dsc_base_t); @@ -443,13 +444,13 @@ static void execute_drawing(lv_draw_sdl_unit_t * u) SDL_Rect rect; lv_layer_t * layer = u->base_unit.target_layer; lv_area_t fill_area = t->area; - _lv_area_intersect(&fill_area, &fill_area, u->base_unit.clip_area); + lv_area_intersect(&fill_area, &fill_area, u->base_unit.clip_area); rect.x = fill_area.x1 - layer->buf_area.x1; rect.y = fill_area.y1 - layer->buf_area.y1; rect.w = lv_area_get_width(&fill_area); rect.h = lv_area_get_height(&fill_area); - lv_display_t * disp = _lv_refr_get_disp_refreshing(); + lv_display_t * disp = lv_refr_get_disp_refreshing(); SDL_Renderer * renderer = lv_sdl_window_get_renderer(disp); SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND); SDL_SetRenderDrawColor(renderer, fill_dsc->color.red, fill_dsc->color.green, fill_dsc->color.blue, fill_dsc->opa); From 750ddfef20380eadd1fb732b3600369f9c5af66d Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Wed, 14 Aug 2024 16:03:06 +0200 Subject: [PATCH 10/15] fix CI --- src/draw/sdl/lv_draw_sdl.c | 2 +- src/lv_conf_internal.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index d65b7374711f..74d420dc5bfd 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -97,7 +97,7 @@ static lv_cache_compare_res_t sdl_texture_cache_compare_cb(const cache_data_t * left_draw_dsc += sizeof(lv_draw_dsc_base_t); right_draw_dsc += sizeof(lv_draw_dsc_base_t); - int cmp_res = memcmp(left_draw_dsc, right_draw_dsc, lhs->draw_dsc->dsc_size - sizeof(lv_draw_dsc_base_t)); + int cmp_res = lv_memcmp(left_draw_dsc, right_draw_dsc, lhs->draw_dsc->dsc_size - sizeof(lv_draw_dsc_base_t)); if(cmp_res != 0) { return cmp_res > 0 ? 1 : -1; diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 5e61563edc3c..f2817aad5fbd 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -3060,7 +3060,7 @@ #endif #endif #ifndef LV_SDL_ACCELERATED - #ifdef _LV_KCONFIG_PRESENT + #ifdef LV_KCONFIG_PRESENT #ifdef CONFIG_LV_SDL_ACCELERATED #define LV_SDL_ACCELERATED CONFIG_LV_SDL_ACCELERATED #else From 8d3ee064cbacd0b5b6fcee75e3fbc3b27ecb97b7 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 23 Aug 2024 09:17:22 +0200 Subject: [PATCH 11/15] revert lv_example_image_1.c --- examples/widgets/image/lv_example_image_1.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/examples/widgets/image/lv_example_image_1.c b/examples/widgets/image/lv_example_image_1.c index a9ff76b6a0a1..0e2bd55e1073 100644 --- a/examples/widgets/image/lv_example_image_1.c +++ b/examples/widgets/image/lv_example_image_1.c @@ -7,14 +7,10 @@ void lv_example_image_1(void) lv_obj_t * img1 = lv_image_create(lv_screen_active()); lv_image_set_src(img1, &img_cogwheel_argb); lv_obj_align(img1, LV_ALIGN_CENTER, 0, 0); - lv_obj_set_style_transform_rotation(img1, 600, 0); - lv_obj_set_style_transform_scale(img1, 700, 0); - lv_obj_set_style_transform_pivot_x(img1, -100, 0); - - // lv_obj_t * img2 = lv_image_create(lv_screen_active()); - // lv_image_set_src(img2, LV_SYMBOL_OK "Accept"); - // lv_obj_align_to(img2, img1, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); + lv_obj_t * img2 = lv_image_create(lv_screen_active()); + lv_image_set_src(img2, LV_SYMBOL_OK "Accept"); + lv_obj_align_to(img2, img1, LV_ALIGN_OUT_BOTTOM_MID, 0, 20); } #endif From 35d82474e10706f51dec42d408f97cc19592410d Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 23 Aug 2024 09:41:10 +0200 Subject: [PATCH 12/15] minor fixes --- src/draw/sdl/lv_draw_sdl.c | 4 ---- src/drivers/sdl/lv_sdl_window.c | 4 +++- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index 899d57fe89b8..fb28b3175ce3 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -176,9 +176,6 @@ static int32_t evaluate(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) { - static int32_t x = 0; - printf("%d\n", x++); - lv_draw_task_t * task = u->task_act; lv_layer_t dest_layer; @@ -296,7 +293,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) return false; } - while(dest_layer.draw_task_head) { lv_draw_dispatch_layer(disp, &dest_layer); if(dest_layer.draw_task_head) { diff --git a/src/drivers/sdl/lv_sdl_window.c b/src/drivers/sdl/lv_sdl_window.c index 7280a7b8d9f9..ee4fb9cbb964 100644 --- a/src/drivers/sdl/lv_sdl_window.c +++ b/src/drivers/sdl/lv_sdl_window.c @@ -144,6 +144,9 @@ lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res) #endif /*LV_USE_DRAW_SDL == 0*/ lv_display_add_event_cb(disp, res_chg_event_cb, LV_EVENT_RESOLUTION_CHANGED, NULL); + /*Process the initial events*/ + sdl_event_handler(NULL); + return disp; } @@ -315,7 +318,6 @@ static void sdl_event_handler(lv_timer_t * t) lv_display_t * disp = lv_sdl_get_disp_from_win_id(event.window.windowID); if(disp == NULL) continue; lv_sdl_window_t * dsc = lv_display_get_driver_data(disp); - switch(event.window.event) { #if SDL_VERSION_ATLEAST(2, 0, 5) case SDL_WINDOWEVENT_TAKE_FOCUS: From 9f1b31c57d0d6cb63838a9e5680736f8c0115339 Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 23 Aug 2024 21:57:46 +0200 Subject: [PATCH 13/15] fixes based on feedback --- scripts/install-prerequisites.sh | 2 +- src/draw/sdl/lv_draw_sdl.c | 10 ++-------- src/drivers/sdl/lv_sdl_window.c | 11 ----------- tests/CMakeLists.txt | 3 --- 4 files changed, 3 insertions(+), 23 deletions(-) diff --git a/scripts/install-prerequisites.sh b/scripts/install-prerequisites.sh index 05d1f1a44e34..98a008f33354 100755 --- a/scripts/install-prerequisites.sh +++ b/scripts/install-prerequisites.sh @@ -9,7 +9,7 @@ sudo dpkg --add-architecture i386 sudo apt update sudo apt install gcc gcc-multilib g++-multilib ninja-build \ libpng-dev libjpeg-turbo8-dev libfreetype6-dev \ - libglew-dev libglfw3-dev libsdl2-dev libsdl2-image-dev \ + libglew-dev libglfw3-dev libsdl2-dev \ libpng-dev:i386 libjpeg-dev:i386 libfreetype6-dev:i386 \ ruby-full gcovr cmake python3 pngquant libinput-dev libxkbcommon-dev libdrm-dev pkg-config pip3 install pypng lz4 diff --git a/src/draw/sdl/lv_draw_sdl.c b/src/draw/sdl/lv_draw_sdl.c index fb28b3175ce3..c155ac1140ce 100644 --- a/src/draw/sdl/lv_draw_sdl.c +++ b/src/draw/sdl/lv_draw_sdl.c @@ -204,7 +204,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) lv_obj_remove_flag(obj, LV_OBJ_FLAG_SEND_DRAW_TASK_EVENTS); } - SDL_Texture * texture = NULL; switch(task->type) { case LV_DRAW_TASK_TYPE_FILL: { lv_draw_fill_dsc_t * fill_dsc = task->draw_dsc; @@ -251,7 +250,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) } case LV_DRAW_TASK_TYPE_LABEL: { lv_draw_label_dsc_t label_dsc; - lv_draw_label_dsc_init(&label_dsc); lv_memcpy(&label_dsc, task->draw_dsc, sizeof(label_dsc)); label_dsc.base.user_data = lv_sdl_window_get_renderer(disp); lv_draw_label(&dest_layer, &label_dsc, &task->area); @@ -259,7 +257,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) break; case LV_DRAW_TASK_TYPE_ARC: { lv_draw_arc_dsc_t arc_dsc; - lv_draw_arc_dsc_init(&arc_dsc); lv_memcpy(&arc_dsc, task->draw_dsc, sizeof(arc_dsc)); arc_dsc.base.user_data = lv_sdl_window_get_renderer(disp); lv_draw_arc(&dest_layer, &arc_dsc); @@ -267,7 +264,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) break; case LV_DRAW_TASK_TYPE_LINE: { lv_draw_line_dsc_t line_dsc; - lv_draw_line_dsc_init(&line_dsc); lv_memcpy(&line_dsc, task->draw_dsc, sizeof(line_dsc)); line_dsc.base.user_data = lv_sdl_window_get_renderer(disp); lv_draw_line(&dest_layer, &line_dsc); @@ -275,7 +271,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) break; case LV_DRAW_TASK_TYPE_TRIANGLE: { lv_draw_triangle_dsc_t triangle_dsc; - lv_draw_triangle_dsc_init(&triangle_dsc); lv_memcpy(&triangle_dsc, task->draw_dsc, sizeof(triangle_dsc)); triangle_dsc.base.user_data = lv_sdl_window_get_renderer(disp); lv_draw_triangle(&dest_layer, &triangle_dsc); @@ -283,7 +278,6 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) break; case LV_DRAW_TASK_TYPE_IMAGE: { lv_draw_image_dsc_t image_dsc; - lv_draw_image_dsc_init(&image_dsc); lv_memcpy(&image_dsc, task->draw_dsc, sizeof(image_dsc)); image_dsc.base.user_data = lv_sdl_window_get_renderer(disp); lv_draw_image(&dest_layer, &image_dsc, &task->area); @@ -300,8 +294,8 @@ static bool draw_to_texture(lv_draw_sdl_unit_t * u, cache_data_t * cache_data) } } - texture = SDL_CreateTexture(lv_sdl_window_get_renderer(disp), SDL_PIXELFORMAT_ARGB8888, - SDL_TEXTUREACCESS_STATIC, texture_w, texture_h); + 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); diff --git a/src/drivers/sdl/lv_sdl_window.c b/src/drivers/sdl/lv_sdl_window.c index ee4fb9cbb964..8448e79d4744 100644 --- a/src/drivers/sdl/lv_sdl_window.c +++ b/src/drivers/sdl/lv_sdl_window.c @@ -25,10 +25,6 @@ #define SDL_MAIN_HANDLED /*To fix SDL's "undefined reference to WinMain" issue*/ #include "lv_sdl_private.h" -#if LV_USE_DRAW_SDL - #include -#endif - /********************* * DEFINES *********************/ @@ -92,13 +88,6 @@ lv_display_t * lv_sdl_window_create(int32_t hor_res, int32_t ver_res) event_handler_timer = lv_timer_create(sdl_event_handler, 5, NULL); lv_tick_set_cb(SDL_GetTicks); -#if LV_USE_DRAW_SDL - if(!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG)) { - fprintf(stderr, "could not initialize sdl2_image: %s\n", IMG_GetError()); - return NULL; - } -#endif - inited = true; } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 3651ac07adec..35f4a47aceac 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -338,10 +338,7 @@ include_directories(${FREETYPE_INCLUDE_DIRS}) if(OPTIONS_SDL) find_package(SDL2 REQUIRED) - find_library(NAME SDL2_image REQUIRED) - link_libraries(SDL2_image) include_directories(${SDL2_INCLUDE_DIRS}) - include_directories(${SDL2_IMAGE_INCLUDE_DIRS}) endif() # libinput is required for the libinput device driver test case From 850272c7ed430be07bc45b9d3c05461297aa0cbf Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 23 Aug 2024 22:02:38 +0200 Subject: [PATCH 14/15] update Kconfig --- Kconfig | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Kconfig b/Kconfig index b79268fc65c6..254fe2170be0 100644 --- a/Kconfig +++ b/Kconfig @@ -1510,10 +1510,16 @@ menu "LVGL configuration" default 1 if LV_SDL_SINGLE_BUFFER default 2 if LV_SDL_DOUBLE_BUFFER + config LV_SDL_ACCELERATED + bool "Use hardware acceleration" + depends on LV_USE_SDL + default y + config LV_SDL_FULLSCREEN bool "SDL fullscreen" depends on LV_USE_SDL default n + config LV_SDL_DIRECT_EXIT bool "Exit the application when all SDL windows are closed" depends on LV_USE_SDL From 2f7139b9d01690630ccdde82964c131823e1218d Mon Sep 17 00:00:00 2001 From: Gabor Kiss-Vamosi Date: Fri, 23 Aug 2024 23:19:15 +0200 Subject: [PATCH 15/15] minor fix --- tests/CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 35f4a47aceac..7da23321fe08 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -458,9 +458,7 @@ foreach( test_case_fname ${TEST_CASE_FILES} ) ${TEST_LIBS}) if(OPTIONS_SDL) - target_link_libraries(${test_name} PRIVATE - ${SDL_LIBRARY} - ${SDL_IMAGE_LIBRARY}) + target_link_libraries(${test_name} PRIVATE ${SDL_LIBRARY}) endif() if (NOT $ENV{NON_AMD64_BUILD})