针对同一字符串,TTF_SizeUTF8以整串一块计算长度还是一个个字符然后累计长度,得到值是不一样的。原因出在TTF_SizeUNICODE。
font_size=11 font_style=0 要计算的字符串:.刘备队进入砦。以整串计算得出长度是(3+67)70,以一个个字符累计然后得出长度是(3 + 12 + 13 + 12 + 11 + 12 + 11)74。 存在这个差别,代码注意地方。
ttext::recalculate()
void ttext::recalculate() { ........... if (maximum_width_ > 0) { std::string unwrapped_text(after_markup, ln->end()); const int unwrapped_text_width = line_size(unwrapped_text, sz, text_style).w; if (unwrapped_text_width <= maximum_width_) { wrapped_lines.push_back(unwrapped_text); } else if (ellipse_mode_ == PANGO_ELLIPSIZE_NONE) { wrapped_lines = utils::split(word_wrap_text(std::string(after_markup, ln->end()), sz, maximum_width_), '\n', 0); } else { wrapped_lines.push_back(make_text_ellipsis(std::string(after_markup, ln->end()), sz, maximum_width_, text_style)); } } else { wrapped_lines.push_back(std::string(after_markup, ln->end())); } ...... }
TTF_SizeUTF8以整串一块计算长度还是一个个字符然后累计长度,得到值是不一样的。word_wrap_text计算长度是使用一个个字符然后累计,maximum_width_往往是通过整串一块计算方式,如此一来在if (maximum_width_ > 0)时,要是直接就调用wrod_wrap_text往往会造成不必要的多行(因为同样N个字符,它计算出行长度大于容许长度maximum_width_,会自动换行)。
举个例子。
[label] id = "message" definition = "wml_message" wrap = "true" [/label]
在twidget::get_best_size()计算该控件尺寸用的是整串一块计算,得到值是70。当要渲染该字符串,即执行canvas.cpp中的ttext::draw,在text_renderer.render前text_renderer.maximum_width_会被置为70,于是就会满足if (maximum_width_ > 0),如直接调用word_wrap_text计算出值是74,导致出现不该有的换行。解决办就是在word_wrap_text之前再调用一次以整串一块计算方式计算,以确定是不是真的要换行。
以上要是wrap = "false"即使不加line_size也不会出现多换行问题。因为wrap = "false"时会把使得ellipse_mode_=PANGO_ELLIPSIZE_END,满足ellipse_mode_ != PANGO_ELLIPSIZE_NONE,导致先执行make_text_ellipsis而不是word_wrap_text!make_text_ellipsis首先会调用以整串一块计算长度的line_size,计算出70,一发现不用换行就啥也不干退出。
再举一个例子。
以下是以单词累加,一个单词用“一次”TTF_SizeUTF8。单词指的是一个或英文单词、或一个汉字、或一个标点符号。 sted, width: 34 sted , width: 39 sted in, width: 52 sted in , width: 57 sted in manare, width: 116 sted in manare , width: 121 sted in manare a, width: 130 sted in manare a , width: 135 sted in manare a wild, width: 165 sted in manare a wild叙, width: 181 sted in manare a wild叙利, width: 197 sted in manare a wild叙利亚, width: 213 sted in manare a wild叙利亚的, width: 229 sted in manare a wild叙利亚的人, width: 246 sted in manare a wild叙利亚的人是, width: 262 sted in manare a wild叙利亚的人是什, width: 278 sted in manare a wild叙利亚的人是什么, width: 294 sted in manare a wild叙利亚的人是什么的!!!!!!!, width: 422 sted in manare a wild叙利亚的人是什么的!!!!!!! , width: 427 sted in manare a wild叙利亚的人是什么的!!!!!!! and, width: 456 sted in manare a wild叙利亚的人是什么的!!!!!!! and , width: 461 ------------------------- 以下是一行一行计算,一行用“一次”TTF_SizeUTF8。 s, width: 9 st, width: 15 ste, width: 24 sted, width: 34 sted , width: 39 sted i, width: 42 sted in, width: 52 sted in , width: 57 sted in m, width: 72 sted in ma, width: 81 sted in man, width: 91 sted in mana, width: 100 sted in manar, width: 107 sted in manare, width: 116 sted in manare , width: 121 sted in manare a, width: 130 sted in manare a , width: 135 sted in manare a w, width: 149 sted in manare a wi, width: 151 sted in manare a wil, width: 154 sted in manare a wild, width: 164 sted in manare a wild叙, width: 180 sted in manare a wild叙利, width: 196 sted in manare a wild叙利亚, width: 212 sted in manare a wild叙利亚的, width: 228 sted in manare a wild叙利亚的人, width: 245 sted in manare a wild叙利亚的人是, width: 260 sted in manare a wild叙利亚的人是什, width: 276 sted in manare a wild叙利亚的人是什么, width: 292 sted in manare a wild叙利亚的人是什么的, width: 308 sted in manare a wild叙利亚的人是什么的!, width: 324 sted in manare a wild叙利亚的人是什么的!!, width: 340 sted in manare a wild叙利亚的人是什么的!!!, width: 356 sted in manare a wild叙利亚的人是什么的!!!!, width: 372 sted in manare a wild叙利亚的人是什么的!!!!!, width: 388 sted in manare a wild叙利亚的人是什么的!!!!!!, width: 404 sted in manare a wild叙利亚的人是什么的!!!!!!!, width: 420 sted in manare a wild叙利亚的人是什么的!!!!!!! , width: 425 sted in manare a wild叙利亚的人是什么的!!!!!!! a, width: 434 sted in manare a wild叙利亚的人是什么的!!!!!!! an, width: 444 sted in manare a wild叙利亚的人是什么的!!!!!!! and, width: 454 sted in manare a wild叙利亚的人是什么的!!!!!!! and , width: 459 sted in manare a wild叙利亚的人是什么的!!!!!!! and u, width: 469 sted in manare a wild叙利亚的人是什么的!!!!!!! and un, width: 479 sted in manare a wild叙利亚的人是什么的!!!!!!! and unc, width: 488 sted in manare a wild叙利亚的人是什么的!!!!!!! and unci, width: 491 sted in manare a wild叙利亚的人是什么的!!!!!!! and unciv, width: 501 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivi, width: 503 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivil, width: 506 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivili, width: 509 sted in manare a wild叙利亚的人是什么的!!!!!!! and unciviliz, width: 518 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilize, width: 527 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilized, width: 537 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedm, width: 552 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedma, width: 561 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedmai, width: 564 sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedmain, width: 574
从以上或许得出个结论,TTF_SizeUTF8以整串一块计算长度会小于一个个字符然后累计的长度。