diff --git a/src/widgets/image/lv_image.c b/src/widgets/image/lv_image.c index be115da185..3dde44ca7e 100644 --- a/src/widgets/image/lv_image.c +++ b/src/widgets/image/lv_image.c @@ -884,7 +884,26 @@ static void draw_image(lv_event_t * e) label_dsc.base.layer = layer; lv_obj_init_draw_label_dsc(obj, LV_PART_MAIN, &label_dsc); label_dsc.text = img->src; - lv_draw_label(layer, &label_dsc, &obj->coords); + lv_area_t * coords; + lv_area_t aligned_coords; + const bool image_area_is_same_as_coords = img->w == lv_area_get_width(&obj->coords) + && img->h == lv_area_get_height(&obj->coords); + const bool needs_inner_alignment = img->align > LV_IMAGE_ALIGN_TOP_LEFT + && !image_area_is_same_as_coords; + const bool has_offset = img->offset.x || img->offset.y; + const bool inner_alignment_is_transforming = img->align >= LV_IMAGE_ALIGN_AUTO_TRANSFORM; + if((needs_inner_alignment || has_offset) && !inner_alignment_is_transforming) { + lv_point_t text_size; + lv_text_get_size(&text_size, label_dsc.text, label_dsc.font, label_dsc.letter_space, + label_dsc.line_space, LV_COORD_MAX, LV_TEXT_FLAG_NONE); + lv_area_set(&aligned_coords, 0, 0, text_size.x, text_size.y); + lv_area_align(&obj->coords, &aligned_coords, img->align, img->offset.x, img->offset.y); + coords = &aligned_coords; + } + else { + coords = &obj->coords; + } + lv_draw_label(layer, &label_dsc, coords); } else if(img->src == NULL) { /*Do not need to draw image when src is NULL*/ diff --git a/tests/ref_imgs/widgets/image_symbol_normal_align.png b/tests/ref_imgs/widgets/image_symbol_normal_align.png new file mode 100644 index 0000000000..b97e92aa79 Binary files /dev/null and b/tests/ref_imgs/widgets/image_symbol_normal_align.png differ diff --git a/tests/ref_imgs/widgets/image_symbol_normal_align_offset.png b/tests/ref_imgs/widgets/image_symbol_normal_align_offset.png new file mode 100644 index 0000000000..c712656301 Binary files /dev/null and b/tests/ref_imgs/widgets/image_symbol_normal_align_offset.png differ diff --git a/tests/ref_imgs_vg_lite/widgets/image_symbol_normal_align.png b/tests/ref_imgs_vg_lite/widgets/image_symbol_normal_align.png new file mode 100644 index 0000000000..ef3c110d69 Binary files /dev/null and b/tests/ref_imgs_vg_lite/widgets/image_symbol_normal_align.png differ diff --git a/tests/ref_imgs_vg_lite/widgets/image_symbol_normal_align_offset.png b/tests/ref_imgs_vg_lite/widgets/image_symbol_normal_align_offset.png new file mode 100644 index 0000000000..ef2296f0b5 Binary files /dev/null and b/tests/ref_imgs_vg_lite/widgets/image_symbol_normal_align_offset.png differ diff --git a/tests/src/test_cases/widgets/test_image.c b/tests/src/test_cases/widgets/test_image.c index abf4f35acd..19173cca09 100644 --- a/tests/src/test_cases/widgets/test_image.c +++ b/tests/src/test_cases/widgets/test_image.c @@ -661,4 +661,48 @@ void test_image_properties(void) #endif } +void test_image_symbol_normal_align(void) +{ + lv_obj_t * img; + uint32_t i; + lv_image_align_t aligns[] = { + LV_IMAGE_ALIGN_TOP_LEFT, LV_IMAGE_ALIGN_TOP_MID, LV_IMAGE_ALIGN_TOP_RIGHT, + LV_IMAGE_ALIGN_LEFT_MID, LV_IMAGE_ALIGN_CENTER, LV_IMAGE_ALIGN_RIGHT_MID, + LV_IMAGE_ALIGN_BOTTOM_LEFT, LV_IMAGE_ALIGN_BOTTOM_MID, LV_IMAGE_ALIGN_BOTTOM_RIGHT, + }; + + for(i = 0; i < 9; i++) { + img = img_create(); + lv_image_set_src(img, LV_SYMBOL_IMAGE); + lv_obj_set_size(img, 200, 120); + lv_obj_set_pos(img, 30 + (i % 3) * 260, 40 + (i / 3) * 150); + lv_image_set_inner_align(img, aligns[i]); + } + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/image_symbol_normal_align.png"); +} + +void test_image_symbol_normal_align_offset(void) +{ + lv_obj_t * img; + uint32_t i; + lv_image_align_t aligns[] = { + LV_IMAGE_ALIGN_TOP_LEFT, LV_IMAGE_ALIGN_TOP_MID, LV_IMAGE_ALIGN_TOP_RIGHT, + LV_IMAGE_ALIGN_LEFT_MID, LV_IMAGE_ALIGN_CENTER, LV_IMAGE_ALIGN_RIGHT_MID, + LV_IMAGE_ALIGN_BOTTOM_LEFT, LV_IMAGE_ALIGN_BOTTOM_MID, LV_IMAGE_ALIGN_BOTTOM_RIGHT, + }; + + for(i = 0; i < 9; i++) { + img = img_create(); + lv_image_set_src(img, LV_SYMBOL_IMAGE); + lv_obj_set_size(img, 200, 120); + lv_obj_set_pos(img, 30 + (i % 3) * 260, 40 + (i / 3) * 150); + lv_image_set_inner_align(img, aligns[i]); + lv_image_set_offset_x(img, 10); + lv_image_set_offset_y(img, 15); + } + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/image_symbol_normal_align_offset.png"); +} + #endif