SDL中文论坛
标题:
TTF_SizeUTF8
[打印本页]
作者:
admin
时间:
2017-3-10 15:38
标题:
TTF_SizeUTF8
针对同一字符串,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以整串一块计算长度会小于一个个字符然后累计的长度。
欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/)
Powered by Discuz! X3.3