|
针对同一字符串,TTF_SizeUTF8以整串一块计算长度还是一个个字符然后累计长度,得到值是不一样的。原因出在textTTF_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以整串一块计算长度会小于一个个字符然后累计的长度。 |
|