我正在尝试在Pango布局中以最大可能的字体大小动态适合文本。 (“适合”可以定义为非椭圆形,并且墨水范围不为负,并且不超过布局的预期高度或宽度。)
在这个简化的示例中,我通过更改布局的字体大小直到不再适合文本,然后减小一个大小来找到最大的文本大小。
在大多数情况下,这非常有效。但是,在某些罕见的情况下,渲染布局时不会出现线条。换句话说,文本大小设置得太大,以至于没有显示空间。但是,计算文字大小时应 留出空间,如果没有的话,布局无论如何都应将文字省略。
据我所知,当在文本之间插入空白行并且至少有三行文本时,尤其容易出现此问题。在下面的示例中,调整文本大小,以使第三行不出现。 (这是一个简化的示例,从根本上说明了问题。)
import cairo
import gi
gi.require_version('PangoCairo', '1.0')
from gi.repository import PangoCairo, Pango
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 500, 500)
context = cairo.Context(surface)
layout = PangoCairo.create_layout(context)
markup = "SOME TEXT\n\nSOME TEXT\nMORE TEXT"
layout.set_markup(markup)
layout.set_ellipsize(Pango.EllipsizeMode(3))
layout.set_width(500 * Pango.SCALE)
layout.set_height(500 * Pango.SCALE)
while True:
fd = layout.get_font_description() or Pango.FontDescription.new()
fd.set_size(fd.get_size() + Pango.SCALE)
layout.set_font_description(fd)
ink_extents = layout.get_extents()[0]
ink_height = ink_extents.y + ink_extents.height
too_high = ink_height > layout.get_height()
if layout.is_ellipsized() or too_high:
break
font = layout.get_font_description()
font.set_size(font.get_size() - Pango.SCALE)
layout.set_font_description(font)
PangoCairo.show_layout(context, layout)
surface.write_to_png('mwe.png')
这有点神秘。显然,布局不是椭圆形的(当我检查文本是否仍然存在并且正确报告了行数时),但是报告的墨水范围显然是不正确的。 (当改用逻辑范围时,出现同样的问题,ink_extents.y 是> 0,依此类推)
我是否缺少某些东西,或者这是Pango中的错误?