Как работает центрирование текстового виджета Tk canvas? - PullRequest
0 голосов
/ 13 мая 2019

Я заметил артефакт при размещении виджета с текстом по центру холста (\ u25a1) над виджетом с центрированным прямоугольником с таким же значением x:

Square character is not aligned with gray rectangle

Поработав с рендерингом шрифтов один или два раза, я понимаю, что существует несколько возможных определений "центрированного". Теперь мне интересно, какой текст Tk canvas используется.

В моих предыдущих проектах я использовал (pen+text.advance)/2, где text.advance - это накопленная ширина продвижения каждого символа. Это то, что я предполагаю, что Tk использует, основываясь на поведении, которое я испытываю.

Однако другим возможным способом центрирования текста будет центрирование с использованием накопленного покрытия растрового изображения , измеренного от левого края самого левого растрового изображения до правого края самого растрового изображения. Я считаю, что это более вероятно, что я хотел бы.

Q1: Как центрирование текста на холсте Tk должно работать с точки зрения метрик шрифта?

Q2: поведение, которое я вижу, является ошибкой, или, возможно, недостаточно указано?


Редактировать: Работая с ним, квадратный символ иногда выравнивается с прямоугольником, иногда нет. Возможно какая-то ошибка округления. Вопрос в том, является ли это ошибкой.


Редактировать 2: добавление 0.5 к x, кажется, помещает квадрат в правильное место. Может быть, происхождение пикселя определяется по-разному для прямоугольника и текста?

1 Ответ

1 голос
/ 14 мая 2019

Tk использует логические свойства шрифта для определения места для текста. В частности, он просит механизм шрифтов измерить длину фрагмента текста (обычно одним шрифтом и без перевода строки или вкладок), чтобы определить ограничивающую рамку этого текста. Затем он решает, где должен находиться этот ограничивающий прямоугольник (в зависимости также от правил привязки, размеров других строк, правил выравнивания, настройки поворота на холсте и т. Д.), И, наконец, запрашивает механизм шрифтов нарисовать текст внутри прямоугольник, т. е. от исходной точки внутри прямоугольника (которая не является верхней левой точкой IIRC, но может фактически быть самой левой точкой на базовой линии - я позволю Tk обработать детали этого, чтобы быть честным).

С этого момента это зависит от механизма шрифтов (который заботится о деталях кумулятивной ошибки, нетривиальной проблеме, когда текст находится под любым углом, не параллельным краю окна), и пока он остается в ограничительной рамке Tk счастлив.

Канва Tk работает с координатами с плавающей точкой, но на большинстве платформ при рендеринге округляет их до целых. (Исключение составляет macOS, где механизм рисования платформы сам принимает координаты с плавающей запятой, и весь графический вывод на холсте подвергается хорошему субпиксельному рендерингу. Это может вызвать некоторые изменения в том, как холсты выглядят на этой платформе, даже если нет изменение в модели; возможно, это ближе к тому, как они должны выглядеть, и вы получите то же самое, если конвертируете отображение холста во встроенный постскриптум.)

...