From 407d8b6ddfe6292f89a5dee9b077f8ca75b3999c Mon Sep 17 00:00:00 2001 From: Liam <30486941+liamHowatt@users.noreply.github.com> Date: Fri, 21 Jun 2024 04:43:09 -0400 Subject: [PATCH] fix(spangroup): handle style_text_letter_space better (#6364) --- src/widgets/span/lv_span.c | 18 +++++++++++++----- tests/ref_imgs/widgets/span_08.png | Bin 0 -> 3061 bytes tests/ref_imgs_vg_lite/widgets/span_08.png | Bin 0 -> 3060 bytes tests/src/test_cases/widgets/test_span.c | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 tests/ref_imgs/widgets/span_08.png create mode 100644 tests/ref_imgs_vg_lite/widgets/span_08.png diff --git a/src/widgets/span/lv_span.c b/src/widgets/span/lv_span.c index 8af5f2416..df38d4431 100644 --- a/src/widgets/span/lv_span.c +++ b/src/widgets/span/lv_span.c @@ -479,7 +479,11 @@ int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) /* break word deal width */ if(isfill && next_ofs > 0 && snippet_cnt > 0) { - if(max_w < use_width) { + int32_t drawn_width = use_width; + if(_lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { + drawn_width -= snippet.letter_space; + } + if(max_w < drawn_width) { break; } @@ -502,7 +506,7 @@ int32_t lv_spangroup_get_expand_height(lv_obj_t * obj, int32_t width) max_line_h = snippet.line_h; } snippet_cnt ++; - max_w = max_w - use_width - snippet.letter_space; + max_w = max_w - use_width; if(isfill || max_w <= 0) { break; } @@ -871,9 +875,13 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) if(isfill) { if(next_ofs > 0 && lv_get_snippet_count() > 0) { + int32_t drawn_width = use_width; + if(_lv_ll_get_next(&spans->child_ll, cur_span) == NULL) { + drawn_width -= snippet.letter_space; + } /* To prevent infinite loops, the lv_text_get_next_line() may return incomplete words, */ /* This phenomenon should be avoided when lv_get_snippet_count() > 0 */ - if(max_w < use_width) { + if(max_w < drawn_width) { break; } uint32_t tmp_ofs = next_ofs; @@ -898,7 +906,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) } lv_snippet_push(&snippet); - max_w = max_w - use_width - snippet.letter_space; + max_w = max_w - use_width; if(isfill || max_w <= 0) { break; } @@ -946,7 +954,7 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) uint32_t i; for(i = 0; i < item_cnt; i++) { lv_snippet_t * pinfo = lv_get_snippet(i); - txts_w = txts_w + pinfo->txt_w + pinfo->letter_space; + txts_w = txts_w + pinfo->txt_w; } txts_w -= lv_get_snippet(item_cnt - 1)->letter_space; align_ofs = max_width > txts_w ? max_width - txts_w : 0; diff --git a/tests/ref_imgs/widgets/span_08.png b/tests/ref_imgs/widgets/span_08.png new file mode 100644 index 0000000000000000000000000000000000000000..ca568173c6acc1606d4107b69555e39c990db137 GIT binary patch literal 3061 zcmeH}|4-US7{{;Z(zVsFb&1`SVwWW}YaBAGZB?qS(O6T|WnaKmDoU($D{7tXiUnk; ziF9GsWTdt83v4qP+fb3YYKtf=)_p=5TE>vU_#y?0f+#8|h{8VE-@*O#Ja_lL+`XUY zmE2eFSCl3nOg#tyNG>~H`~d(7#{k&3_%Z^X`RlUa2LKMq%ZlIoh|%w}NI$Elr7P_^ zWb^N{N4^Unim^rS4Dg?Q@?h?+b|`>2x73g6eT~$5p!b5Gd>gA=LL8Xnzu8uwh{|}6Sk&PeU=0- zH@%$^+4AX$`FK1&KY#L;>=K!+@c8|Hr?VbbWB7d!(q-REfl{~~K@Xj7w!+sK931qW z(2Gfurswr*)~SC->dG;EOX+|>P{0cLFaGp#a8n9DOM4}-o{9p>9EGCeAsGwrob0-{ zABoOL;aNz=acpL$q-0*J)vhw-1$3FIWsZ{dEn&fXBgGG`#k71sHi&q*{c7InWes)+VzF`*`8w6)EM4SXY!@8WDq^D)mc|H zOq{{7Vtd;pj+BfQTkxcq%l5dHHc4YaO4F*PMq*GkgbP2Ns^K#KXr|_DcEZZg1y~sh zyM^w}u--M!r-$~?u~HjdHwDyOHUv(GHag-2l_XTzx~PeNME z*le&^X<`OFdY8)urKh2~A+>8`-2qJs9V;tz=CzgsbXh_R3&scf*+Rrj0$Z z=Xce>BH%?{lMHm<@)?F`_A7v zy5#_r&gq|b=Qo{K$mMcb=uB$YFQT%eD3qKP-hiw5@M0q=_c&j*>7M7`)2P*On~k5f z7F_wQcXxevc=>v-GXwaIZ2Q$OV?mbjBw$ged9Q$Dm{9N%YVW1QF?gn6>bC9+Z_- K6px&%z5O3Lg2@m7 literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/span_08.png b/tests/ref_imgs_vg_lite/widgets/span_08.png new file mode 100644 index 0000000000000000000000000000000000000000..5038dcc4f7cb3b5beb0d52bfe807caa51ef00c09 GIT binary patch literal 3060 zcmeHJ`%juz7(T^KmRi^8mTIPzE!z)ETt3`dFQHYOaY0v$y=x~c-a6Mx`KnPtMOl_b zwlSxZZlpydnaRjzE0SHjfXc=SVG6`Lt6T*2n?eK%3Mf#Jearrg@!QEcC(rY~&-*;d z`}sLCDe>^jhXDYIr6t7|0El}9fJ1A~VbGgL*N46XAVF4I{LUrjplel1zqp^F*jXH* zm1q)P#}|e`=~Iw&A$On+I-g%BO__?Tp|@7|)Jx3MYbhnnj}>t%$xn|{ewiG*UB5&Zbt8JqbZ4%ouMJTpvaf?cX2fw(1b~9rtH6NIZc(~C{$(naLJ5Z) zlB%jIjZfW&BX)&+`y7ElU^1B)ZcAi?iysIov%W;~1X>7!dTLgz*65xIUdA1)-*CI# z)|oCD!L`37G0(E2cDtRR8a?qM2;jp>l{T9#B_##LX=rFrtJO+I%w$f;WSz~;$?=apqA0>(FlNKMb6hUhALl?dfGzS# z<4qEY#CT%>yuusd`<1*Qhuc}Yu@HXF@-{5c5X{l(&?@p zd*GSi)^>t^D1W5QD<8)?c6WDuz80AS%)_x1QrAB=A5oN8E843B(URnqru$}u>c660tU7c!e^lz$b zQn$Q8TFx2zV%8Dm93NkSg{?D@O+NM7bVs(3tYihd4*t~Xbkz3j=fOll8j_chk5i)8M&;BL?SqL_^qo33dBbZ(<+}@ z_$WK53}&MKD%D|t$lTB!AHeDR^5YcLc{m9J{&?mXD5N2(-ZW7tec~Fm%fBQpcoqbr zwMWs1`Q%qYVOjN||Gvczs3b8FVj{%i5KBQU1+f(T?^AG)Xn*t4z&Q7@8QtbV>AU3O J(W2^4{s9M%zoP&E literal 0 HcmV?d00001 diff --git a/tests/src/test_cases/widgets/test_span.c b/tests/src/test_cases/widgets/test_span.c index c15263798..654fb69ac 100644 --- a/tests/src/test_cases/widgets/test_span.c +++ b/tests/src/test_cases/widgets/test_span.c @@ -356,4 +356,22 @@ void test_spangroup_chinese_break_line(void) #endif +void test_spangroup_style_text_letter_space(void) +{ + active_screen = lv_screen_active(); + spangroup = lv_spangroup_create(active_screen); + + lv_obj_set_style_outline_width(spangroup, 1, 0); + lv_obj_set_style_text_letter_space(spangroup, 20, 0); + + lv_span_set_text(lv_spangroup_new_span(spangroup), "A"); + lv_span_set_text(lv_spangroup_new_span(spangroup), "B"); + lv_span_set_text(lv_spangroup_new_span(spangroup), "C"); + lv_span_set_text(lv_spangroup_new_span(spangroup), "D"); + lv_span_set_text(lv_spangroup_new_span(spangroup), "E"); + lv_span_set_text(lv_spangroup_new_span(spangroup), "F"); + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_08.png"); +} + #endif