Неправильные результаты при измерении высоты макета панго - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь динамически подогнать текст под максимально возможный размер шрифта в макете 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?

Выходное изображение

...