测量Pango布局的高度时结果不正确

时间:2019-04-17 13:43:21

标签: text-size pango pangocairo

我正在尝试在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中的错误?

Output image

0 个答案:

没有答案