From 2faaf78f3d36bc8b05725c918ab60b08cc2223f0 Mon Sep 17 00:00:00 2001 From: zhangyan63 Date: Tue, 10 Mar 2026 15:14:52 +0800 Subject: [PATCH] fix(span): prevent false ellipsis when text fits within container width Change-Id: I0787a3f0466acb699fac6f3a9e60b5efa53275b2 Signed-off-by: zhangyan63 Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- src/widgets/span/lv_span.c | 9 ++- tests/ref_imgs/widgets/span_16.png | Bin 0 -> 5272 bytes tests/ref_imgs/widgets/span_17.png | Bin 0 -> 2110 bytes tests/ref_imgs_vg_lite/widgets/span_16.png | Bin 0 -> 5269 bytes tests/ref_imgs_vg_lite/widgets/span_17.png | Bin 0 -> 2111 bytes tests/src/test_cases/widgets/test_span.c | 83 +++++++++++++++++++++ 6 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/ref_imgs/widgets/span_16.png create mode 100644 tests/ref_imgs/widgets/span_17.png create mode 100644 tests/ref_imgs_vg_lite/widgets/span_16.png create mode 100644 tests/ref_imgs_vg_lite/widgets/span_17.png diff --git a/src/widgets/span/lv_span.c b/src/widgets/span/lv_span.c index e4ab8df855..49f71a5e94 100644 --- a/src/widgets/span/lv_span.c +++ b/src/widgets/span/lv_span.c @@ -1230,15 +1230,20 @@ static void lv_draw_span(lv_obj_t * obj, lv_layer_t * layer) { lv_snippet_t * last_snippet = lv_get_snippet(item_cnt - 1); int32_t next_line_h = last_snippet->line_h; - if(last_snippet->txt[last_snippet->bytes] == '\0') { + bool has_more_content = last_snippet->txt[last_snippet->bytes] != '\0'; + if(!has_more_content) { next_line_h = 0; lv_span_t * next_span = lv_ll_get_next(&spans->child_ll, last_snippet->span); + while(next_span && (!next_span->txt || next_span->txt[0] == '\0')) { + next_span = lv_ll_get_next(&spans->child_ll, next_span); + } if(next_span && next_span->txt && next_span->txt[0]) { /* have the next line */ next_line_h = lv_font_get_line_height(lv_span_get_style_text_font(obj, next_span)) + line_space; + has_more_content = true; } } if(txt_pos.y + max_line_h + next_line_h - line_space > coords.y2 + 1) { /* for overflow if is end line. */ - ellipsis_valid = spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS; + ellipsis_valid = has_more_content && spans->overflow == LV_SPAN_OVERFLOW_ELLIPSIS; is_end_line = true; } } diff --git a/tests/ref_imgs/widgets/span_16.png b/tests/ref_imgs/widgets/span_16.png new file mode 100644 index 0000000000000000000000000000000000000000..3fddc042e34a9475ce073f520d4df685a5ac69b0 GIT binary patch literal 5272 zcmdUzXHe5yx5od}geIY=NHGDVOO+y_MrqQe3Iq@nKzdh7Fmw@Vp%*Di2MN84NReKY z(3K_;=}n6C_ndRzxik06{eHeaGkf-W=Gkk_Z?9MSy6SY)tkeJi&^^#lF#rHE7yytg zfd3KzUuP2m0ARL$pn@>+CD}-(dK9yI+Os`8;hDfdT>#NZ6tK1XlE#~;J@}{_PRrFT zQJ>@d6;d76mm(a25SW&D(w)uIpTIDkP@JSmJudD8FS;0Mc~bx%mbJXRy!0n*Umz!& za!xIhN#f+L&(39Qj;TUgGdn&;eRA4 za)X`9{AWW=V^QX^tH1ka!Y>QkMjIcvHb;B(^LXOvqhUV5U}AT)cfXbp_wvFQi>|`L z(p2;yyM>99rEiXGU1q_RsdA6RWU{Cm_GXikzJX!uceo?xzyRY9kz-wk&qIF%lyS7W zQ5*S!vXo4$L}%n!=UKWqN&mFR&Xg;Hm3|+>zOk;K7aK^i^F9aIIj;QiRIPypK=8Lt61X6Qg&{t%jLmg5(4;}cNAOo#Bb@)-;l#E4`$)$JFq z-!j#1sW~_9RVF{n4H2F=Z&Z{CS)n*5VXNS02qwr}clCbzE|L$mah0I(l3%DZfjJw~ zcdR=Q6KU8ukLIz)>G*<1V87W}%HMTv%t<>r{K8x%cG?=EG(~N zi%uD?wy&EvEHR6BEM)^FbXMmK?~bZs%|!fl-bAU2l7%%H^(TNTB|`6B7Y$KG9&nrq zzA^((Xc+|Y^P6kD8yS{j>pf^^P=S)iC#%o1xtq<1Q)S<)riEvDIrr$=C-V!@Oo=~t zl^_at>^9CFfiR z7rZJ_g1}otNMzOoz~2U=Ir~zMtsC{{+8avN=1}l{H?=Vg6jv8Y8*5b`-lq>%3=p z3kkh}*ni0geq>=N-R89EP?MrLX(XI=Lr+@*TuidSkvY^1e)#b5Nufgw@2cMy3(CXT z9bhBJGw?Ba2~DkX?o>3(uAZ~VFSnoG?vbO$Ev5@2N~?<<6vmn#Z;OL+9iVX|D&x}p z$N&ZCr@6A13OoY#%-}slJDAu|ZHy5+rO(vT2j`!QCJ8qmaxm4~60Qgd2+=SLn_H{2 zC`-2M4V({37jA#gU`w+s-bhYiu+v4Z(g_LSM_$8xLau3S?Z#qs5)X;iP#FJjj^ES2 z`dMV_R`jMH?XWhM6}MI2EnZdc6R!&Zb33aL?mU&Ls)bJWsKz%VuzPa0d9Q{xKQH%B zd*oGZS7SSd$f%Dpw0Ra6dG7F*Ui)Z9zf|f|9WZibGkK2lPwe^-u)<*o|t^;GdW!<^49N{&(VkW?E!$#~4kJogFQ&nSCb8}@>L89)SQxi=s*gOK=$-ja~(7X++6)98h zN!GL}T{n=jq`5ueu+L$wG`?@Rv1g#vP~ZKuYu@-%l#-n%L^<7FK-mcnuTQRy9UN;P z(nmXH)X$&|wHSRCp?8%jmGC1mFn=3Z@EDg&|2iN19$mvESlbelY}!8?P>?*JFa_AEfI-ikDR@zd{_i64xp$$^Ly7l+^MsYaXmO<2@5AsY4XR;@!{5!3J@Q9_Ikq zAO{f)i@c@}1HYqS28TRt4_XH;T-j#9=Kv*_;9E!~68p%e7XXngsONwTrV&U<5dt$; z{y#@Z{+5bG;$@C6*CP^0blf8h{rO{760#LqkI9*y~_prPP^Eh5^f7=ZZMW2wvgiqC zW>fuQUS)UDKBV|iNNVhB6zKl-J62a~y+ND6v7tVcD?u~EZ)zWu49W03x5819@<7~4S4>Wtr4nUn^N`FnE|@XRxD{p%jJ)`V z76>TIsE;Zy^V2lA!3HRi)mAfic{r1wy3@JA>zK})^eExg+!L3c(F6?=O&IW%c$2f) zy)H7ZGl?OoU@HyxyxyYf_4egcuaKSt3sqKH(q~Dr0n%>#KZ#bghHGS7qQ*jjB{k`% zar-;`hbVP`Grv2;LsU#U;<{GMHQZUpg|=CR=Yc9mgmunpe$_1NG`Trcznhxa8vUV0 zCdlWgQ)~>hhm8QJ(dbHM;eBg=TdHH|<$Xmp*ni3T6t#6Qm_^d)aZt z6WuNm{SC1KEmho&6yw2Ld7I3JXOr)XTFa|_FB zkw}gB=L9UD!(m+Lt85;f`HKBij zSHhSUmeA)&G`KOLBz*~Fs)xQ7y_d(+MLIuLds|ReNkuds+Qt076b?r|-|ho(YE5^r zmw|5*Q9hD&XvM=_f>0HGe55T}yf**>l;M_9!GY`CJ2r zv~_xa8{*ePe3V=fQyo?Qj7R&3DvHrz<0-S`+9b~?9_M{&+|M6-@$QWVD+A6EXu zto=ovNc;FcN!DrhqwR{O%z@mtt(K22{p3C7`X&>ttMlHz*f-{!*qD(5Egfl@<&$tO zI+}21!Qsspus^m5z(=Ya)&qGJZ9c<0-^4C2NSw!Qy@bn&@mF!U;U@}~9u-TLZxhe<~+FPHaG#z2nWhi5c1#aE+d3PZyM zCbyX!9`ln+@Gvxw6tvy%>3y|pQ?rVeM0fca=t6{Oh3Bp3rsOp=02(<__0dhwFH3SoMZR9`I__C;HO2a28YeTl~4TM3yK7NZaUk| zB3D}KJ7qYGA(0ubu(9<-i1&7r>LAm&H|3+%nO662?V2O7_5?%1$KR+NW4LVJNW*dv z%qR5B3A&O=i8>lGSP8|f|E4WLoRm46xc5c&O0=?4=~5!tt{)Oc%nYv-SWr7&we87f z-wvGQvt%&E>76?7!#=)sō9b7St0qZU^GI!BWSn{s<3wE@mnoIzRAek#C*@BSrwLr?fD%r1%a^lhbFqv z(xshjt6-&X8BMGm+Yr0RBsx{u}a8i{qG2vz5&E&E$GBra@i1#lzi zUp28X$LYgRhcxT<8`kp^U0*a4lFmBSv-=HxD$W1CFo^@vS!+bdz0L_bm(+{r zpcW#p@F7NpOc&{ywe2MY7o4VADu(p;#@J>Zf=hThZw4);S~o|gQPMxlqGzGp@sS(n zZEEG0v%{Y#{*4HZUwc7ce0TV1Y=8KTRXuT!lnhIaYtfG>qj!wtLAGJ?FHo?)R&{Kc zenPe>(&{r4n2s(+$Gk3x?KCw*T#90ZT2rv}>7?1f{LTPJ&H-nrchcr3*QDFI8~YF1 z;sp41&fc0-emIsnbhdTvT1lz(s{T?I?*Do+rmv%n7hkIF?GavyI&wTU@|BS*zQ((~ zvhHA1o_p3$VJ$bSt{x0)7XPz-uBi`;boE6l0U=}d|BzU4+B)9?ts5Q+90UI^uKmMa z|HUy4g&)|dA`~kCuz>GfSWdPN>D-jxiGxANgJEED1PuJw7ats=3?UEscS$#%Z4fv~ z0DzYK?M3g9ivh)+l5T!{hzWf=It%_a0afQ(~-``??<|M(iDls#OH z|7*P!WTSsM;U?xo#SsMhx0`ws@;(p_Aq9ZPFru46C}=AA{?3DcMI(ig2;&E%nLK1| Q{$4pgP}Nnz-+LVLA0<1(x&QzG literal 0 HcmV?d00001 diff --git a/tests/ref_imgs/widgets/span_17.png b/tests/ref_imgs/widgets/span_17.png new file mode 100644 index 0000000000000000000000000000000000000000..dc655b3e5cd8d1c841b5c6ffa1676324317fcb9a GIT binary patch literal 2110 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;9&K1aSW+od~?+?@768x z;~#~O=rC0>ig6e0Wq89H@c;RgG{z3YN9T7qN(LXY(Es{FbfLM=L~(~mhE&EA+$WSz z{gFJ*;{0IG^bpP?zv@KvuD2H-nD*( z)t=w@`tysu_k<)Xw_V;9TXyBog>CY7YkO03{9V`0y&d}1(|UsH&#z`1&WYD0i@aa{ zHqDZ!=jpcB{<~Z!UVC$gM=CsTtL?1s>wA{W^4Q88If=_7Q6XvWS?|+-eO@J17w!z1 z@?ymdcJrk#_P#IMb8g8iwX0J@fF`bNu()`7ngO53(@Q@yLWA57`PjL?j{Wj#-psjg z^D8g$r8w8^-p~>L*xg{~o*%}g9w)v(TJ`Y#?YA0lGT1jMY+s&trON*7!(X>19WdZA zeDdx8S^l^6x$K(~{T%y4 zcJ48ry|v=K@2yt*o<7Sj-1G0ej<-Kzkw5)y`>Vb(1!uo^_aC_X-GAiX5I({B3opa* zo(2XkCMFFIjs+(?_m;k>X6O@B=UAYi(4fS5VrzPJGcW*OT9nnwO_$kiR>tNTpI^E4 z>Vz{_sxBIBU+$mQP_8e(es1FBSur}Vln#Ho?z-PlD3jGU`&z`-t!dBGF6<}@=6yZW zeYWv|-{R~kc5kX4iT%E4|LxG$j!HBAv(2d|bL>mbHqV}P<5D?D;ncH|3d}{PQ`O?O zgr#ada*>WcwB(6utntq`7Jc@U-?mkxr53ZDX!ujL`^HY+8vVQ&y-V-A=L$Qp9Z~O4 zU7W$YX!65}s?8a)HgT+Ni5(NAV$RP<+%nT=H`p3S~dw%CdxR18)cea=NQ0@0_tN-$J^QF)09{0_>{M*@H?Ss+JTKOwo zqQ-l4?6u|fXEOHPyeFLU>i-^N?X~H(H}^^U3G4}1&;O__|KI9MGLwGsq55|R>UKKc zXDB!Wj16E6G{K{0kZ>M!{5fnVdzpdZfP=uN_q+J=@;*IitY>Ld;9zl7;9znT;AnCX zU};hi7+OLnHYCsI<78k+P~iBQzn9JYJD1e~{~_uZL`8LpF{e{z^1EvC+RB=qU!C=3m?Enpb+iV6Yjw2@m3_haxF&FEG|DlnQc$OZsY*f0cIUVSD22WQ%mvv4FO#nGQopk^J literal 0 HcmV?d00001 diff --git a/tests/ref_imgs_vg_lite/widgets/span_16.png b/tests/ref_imgs_vg_lite/widgets/span_16.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b679a50c460e5963c1c952704879ce1612a7fa GIT binary patch literal 5269 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 Dx3Daa?;9&D~aSW+od~@}D(4z>E z;~$leo|F2-Fo|8Df?@Aw_VoS_3}WwQ?vQ)2*J1tJrbz3;YbNhzKV#h>ukec@Vds2- z11{eSy1 zi$u@YueVUzJ9$o_+vL8W=XTR)-_!lNbiQ=gma`dgv6<|TR0Q*?o1@OI_WADo{L3!2 zYbm!imaX5dbT0SpuNQmryZS2DdS{1Com!^gH|e3-*M5&>Z*EThJ9m!fHi0Q`r=+;< ziM#&ozWwZ9p0xocn_tB&k?ol5;n4RtJZu@`$?ZONv-@Q@%Y(jM-}pak%H^+5{Ud=k zDsGIa;0aqDU7PdQuIJv4cV)Zp@9XSIv5At4y3BXPG0FL^RqmI|c@=XfMxWkvWYR@f z)9R1=-#XajaCAf${eD+#b|d|L_1=lGIi|ng$=B{YF)xoVDsQr^Fm-Iwy;b{|Uxb7$^fV_*cC&&U|N=_!OUYSIpn7S#P;BDr?5s zDYO1PdfKLKe4u?g&$VB^Ukg5D)~FQ~*ZjP(sz$W1>gr+n=bz2eBfP(#Tko?(aZcqn z3+9>{M~6ML-5h(ae)_+0`M!=Nr{}%>sb z{zXk$cw*!JlU?T8qG_?^L1xEF-lgnRoG~+c4r7vnWZv^0u&iVbbAzp~Z<<++8`RnGoNNCrFVR%V}CE5zauT}f9CCe z&OLrbmwP8owXevK-LE0PekNnt&11qTH-6grJ^x>Gu|0RzLzaW?TffW27kzraO?d1eu(Z<#k@c&wNLGk(p%zuWeU*Iuu;><>W zc2@=l1%Z}d+qWJ3x3`h+!^EK*M-YFdHOu@i@c>5E0fQCwugz!dYT-N3Jk&kq=XlLd vmV=Rj!9d{C_IU@H-<(qXp)w>g(jf-UZI*FTmr~+^QNrNq>gTe~DWM4fGsCO= 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 b7926fde71..5a26607c1b 100644 --- a/tests/src/test_cases/widgets/test_span.c +++ b/tests/src/test_cases/widgets/test_span.c @@ -644,4 +644,87 @@ void test_span_properties(void) #endif } +/* + * Ellipsis should not appear when all text fits horizontally but max-height is smaller than font line_height. + */ +#if LV_USE_FREETYPE && __WORDSIZE == 64 + +void test_spangroup_ellipsis_not_shown_when_text_fits(void) +{ + lv_font_t * font = lv_freetype_font_create("src/test_files/fonts/noto/NotoSansSC-Regular.ttf", + LV_FREETYPE_FONT_RENDER_MODE_BITMAP, 24, LV_FREETYPE_FONT_STYLE_NORMAL); + if(!font) { + LV_LOG_ERROR("freetype font create failed."); + TEST_FAIL(); + } + + int32_t font_h = lv_font_get_line_height(font); + int32_t constrained_h = font_h - 2; /* ensure max-height < line_height */ + + active_screen = lv_screen_active(); + + /* Case 1: width = text width, text fits — no ellipsis expected */ + lv_obj_t * spangroup1 = lv_spangroup_create(active_screen); + lv_obj_set_style_text_font(spangroup1, font, 0); + lv_obj_set_style_outline_width(spangroup1, 1, 0); + lv_spangroup_set_overflow(spangroup1, LV_SPAN_OVERFLOW_ELLIPSIS); + lv_spangroup_set_mode(spangroup1, LV_SPAN_MODE_BREAK); + + lv_span_t * span1 = lv_spangroup_add_span(spangroup1); + lv_span_set_text(span1, "消息免打扰"); + + /* Set width to exactly fit the text, like CSS width: fit-content */ + uint32_t text_w1 = lv_spangroup_get_expand_width(spangroup1, UINT32_MAX); + lv_obj_set_width(spangroup1, text_w1); + lv_obj_set_style_max_height(spangroup1, constrained_h, 0); + + /* Case 2: text overflows width — ellipsis expected */ + lv_obj_t * spangroup2 = lv_spangroup_create(active_screen); + lv_obj_set_style_text_font(spangroup2, font, 0); + lv_obj_set_style_outline_width(spangroup2, 1, 0); + lv_spangroup_set_overflow(spangroup2, LV_SPAN_OVERFLOW_ELLIPSIS); + lv_spangroup_set_mode(spangroup2, LV_SPAN_MODE_BREAK); + lv_obj_set_y(spangroup2, 40); + lv_obj_set_width(spangroup2, 250); + lv_obj_set_style_max_height(spangroup2, constrained_h, 0); + + lv_span_t * span2 = lv_spangroup_add_span(spangroup2); + lv_span_set_text(span2, "这是一段很长的中文文字用来测试文本溢出省略号的显示效果"); + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_16.png"); + + lv_obj_set_style_text_font(spangroup1, LV_FONT_DEFAULT, 0); + lv_obj_set_style_text_font(spangroup2, LV_FONT_DEFAULT, 0); + lv_freetype_font_delete(font); +} + +#else + +void test_spangroup_ellipsis_not_shown_when_text_fits(void) +{ +} + +#endif + + +/* Text wraps to 3+ lines, max-height fits 2 — ellipsis on last visible line */ +void test_spangroup_ellipsis_multiline_truncated(void) +{ + active_screen = lv_screen_active(); + spangroup = lv_spangroup_create(active_screen); + + int32_t line_h = lv_font_get_line_height(LV_FONT_DEFAULT); + + lv_obj_set_style_outline_width(spangroup, 1, 0); + lv_obj_set_width(spangroup, 100); + lv_obj_set_style_max_height(spangroup, line_h * 2, 0); + lv_spangroup_set_overflow(spangroup, LV_SPAN_OVERFLOW_ELLIPSIS); + lv_spangroup_set_mode(spangroup, LV_SPAN_MODE_BREAK); + + lv_span_t * span = lv_spangroup_add_span(spangroup); + lv_span_set_text(span, "This text is long enough to wrap into three or more lines in a 100px container"); + + TEST_ASSERT_EQUAL_SCREENSHOT("widgets/span_17.png"); +} + #endif