SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5088|回复: 0
打印 上一主题 下一主题

[SDL] TTF_SizeUTF8

[复制链接]

21

主题

36

帖子

334

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
334
跳转到指定楼层
楼主
发表于 2017-3-10 15:38:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
针对同一字符串,TTF_SizeUTF8以整串一块计算长度还是一个个字符然后累计长度,得到值是不一样的。原因出在textTTF_SizeUNICODE。
  1. font_size=11
  2. font_style=0
  3. 要计算的字符串:.刘备队进入砦。以整串计算得出长度是(3+67)70,以一个个字符累计然后得出长度是(3 + 12 + 13 + 12 + 11 + 12 + 11)74。
复制代码
存在这个差别,代码注意地方。
ttext::recalculate()
  1. void ttext::recalculate()
  2. {
  3.         ...........
  4.         if (maximum_width_ > 0) {
  5.                 std::string unwrapped_text(after_markup, ln->end());
  6.                 const int unwrapped_text_width = line_size(unwrapped_text, sz, text_style).w;
  7.                 if (unwrapped_text_width <= maximum_width_) {
  8.                         wrapped_lines.push_back(unwrapped_text);
  9.                 } else if (ellipse_mode_ == PANGO_ELLIPSIZE_NONE) {
  10.                         wrapped_lines = utils::split(word_wrap_text(std::string(after_markup, ln->end()), sz, maximum_width_), '\n', 0);
  11.                 } else {
  12.                         wrapped_lines.push_back(make_text_ellipsis(std::string(after_markup, ln->end()), sz, maximum_width_, text_style));
  13.                 }
  14.         } else {
  15.                 wrapped_lines.push_back(std::string(after_markup, ln->end()));
  16.         }
  17.         ......
  18. }
复制代码
TTF_SizeUTF8以整串一块计算长度还是一个个字符然后累计长度,得到值是不一样的。word_wrap_text计算长度是使用一个个字符然后累计,maximum_width_往往是通过整串一块计算方式,如此一来在if (maximum_width_ > 0)时,要是直接就调用wrod_wrap_text往往会造成不必要的多行(因为同样N个字符,它计算出行长度大于容许长度maximum_width_,会自动换行)。

举个例子。
  1. [label]
  2.         id = "message"
  3.         definition = "wml_message"
  4.         wrap = "true"
  5. [/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,一发现不用换行就啥也不干退出。

再举一个例子。

  1. 以下是以单词累加,一个单词用“一次”TTF_SizeUTF8。单词指的是一个或英文单词、或一个汉字、或一个标点符号。
  2. sted, width: 34
  3. sted , width: 39
  4. sted in, width: 52
  5. sted in , width: 57
  6. sted in manare, width: 116
  7. sted in manare , width: 121
  8. sted in manare a, width: 130
  9. sted in manare a , width: 135
  10. sted in manare a wild, width: 165
  11. sted in manare a wild叙, width: 181
  12. sted in manare a wild叙利, width: 197
  13. sted in manare a wild叙利亚, width: 213
  14. sted in manare a wild叙利亚的, width: 229
  15. sted in manare a wild叙利亚的人, width: 246
  16. sted in manare a wild叙利亚的人是, width: 262
  17. sted in manare a wild叙利亚的人是什, width: 278
  18. sted in manare a wild叙利亚的人是什么, width: 294
  19. sted in manare a wild叙利亚的人是什么的!!!!!!!, width: 422
  20. sted in manare a wild叙利亚的人是什么的!!!!!!! , width: 427
  21. sted in manare a wild叙利亚的人是什么的!!!!!!! and, width: 456
  22. sted in manare a wild叙利亚的人是什么的!!!!!!! and , width: 461
  23. -------------------------
  24. 以下是一行一行计算,一行用“一次”TTF_SizeUTF8。
  25. s, width: 9
  26. st, width: 15
  27. ste, width: 24
  28. sted, width: 34
  29. sted , width: 39
  30. sted i, width: 42
  31. sted in, width: 52
  32. sted in , width: 57
  33. sted in m, width: 72
  34. sted in ma, width: 81
  35. sted in man, width: 91
  36. sted in mana, width: 100
  37. sted in manar, width: 107
  38. sted in manare, width: 116
  39. sted in manare , width: 121
  40. sted in manare a, width: 130
  41. sted in manare a , width: 135
  42. sted in manare a w, width: 149
  43. sted in manare a wi, width: 151
  44. sted in manare a wil, width: 154
  45. sted in manare a wild, width: 164
  46. sted in manare a wild叙, width: 180
  47. sted in manare a wild叙利, width: 196
  48. sted in manare a wild叙利亚, width: 212
  49. sted in manare a wild叙利亚的, width: 228
  50. sted in manare a wild叙利亚的人, width: 245
  51. sted in manare a wild叙利亚的人是, width: 260
  52. sted in manare a wild叙利亚的人是什, width: 276
  53. sted in manare a wild叙利亚的人是什么, width: 292
  54. sted in manare a wild叙利亚的人是什么的, width: 308
  55. sted in manare a wild叙利亚的人是什么的!, width: 324
  56. sted in manare a wild叙利亚的人是什么的!!, width: 340
  57. sted in manare a wild叙利亚的人是什么的!!!, width: 356
  58. sted in manare a wild叙利亚的人是什么的!!!!, width: 372
  59. sted in manare a wild叙利亚的人是什么的!!!!!, width: 388
  60. sted in manare a wild叙利亚的人是什么的!!!!!!, width: 404
  61. sted in manare a wild叙利亚的人是什么的!!!!!!!, width: 420
  62. sted in manare a wild叙利亚的人是什么的!!!!!!! , width: 425
  63. sted in manare a wild叙利亚的人是什么的!!!!!!! a, width: 434
  64. sted in manare a wild叙利亚的人是什么的!!!!!!! an, width: 444
  65. sted in manare a wild叙利亚的人是什么的!!!!!!! and, width: 454
  66. sted in manare a wild叙利亚的人是什么的!!!!!!! and , width: 459
  67. sted in manare a wild叙利亚的人是什么的!!!!!!! and u, width: 469
  68. sted in manare a wild叙利亚的人是什么的!!!!!!! and un, width: 479
  69. sted in manare a wild叙利亚的人是什么的!!!!!!! and unc, width: 488
  70. sted in manare a wild叙利亚的人是什么的!!!!!!! and unci, width: 491
  71. sted in manare a wild叙利亚的人是什么的!!!!!!! and unciv, width: 501
  72. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivi, width: 503
  73. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivil, width: 506
  74. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivili, width: 509
  75. sted in manare a wild叙利亚的人是什么的!!!!!!! and unciviliz, width: 518
  76. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilize, width: 527
  77. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilized, width: 537
  78. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedm, width: 552
  79. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedma, width: 561
  80. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedmai, width: 564
  81. sted in manare a wild叙利亚的人是什么的!!!!!!! and uncivilizedmain, width: 574
复制代码



从以上或许得出个结论,TTF_SizeUTF8以整串一块计算长度会小于一个个字符然后累计的长度。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 03:51 , Processed in 0.053509 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表