Tcl Tk画布文本小部件的居中是如何工作的?

Tcl Tk画布文本小部件的居中是如何工作的?,tcl,tk,Tcl,Tk,我注意到,将居中的画布文本\u25a1小部件放置在具有相同x的居中矩形小部件上方时出现了一个瑕疵: 使用字体渲染一两次后,我意识到有多种可能的定义。现在我想知道Tk canvas文本使用哪一种 在我以前的项目中,我使用了pen+text.advance/2,其中text.advance是每个字符的累积前进宽度。这就是我假设Tk是基于我所经历的行为而使用的 但是,另一种可能的居中文本的方法是使用累积位图覆盖率居中,从最左边的字符位图左边缘到最右边的位图右边缘测量。我相信这更有可能是我想要的 问题1

我注意到,将居中的画布文本\u25a1小部件放置在具有相同x的居中矩形小部件上方时出现了一个瑕疵:

使用字体渲染一两次后,我意识到有多种可能的定义。现在我想知道Tk canvas文本使用哪一种

在我以前的项目中,我使用了pen+text.advance/2,其中text.advance是每个字符的累积前进宽度。这就是我假设Tk是基于我所经历的行为而使用的

但是,另一种可能的居中文本的方法是使用累积位图覆盖率居中,从最左边的字符位图左边缘到最右边的位图右边缘测量。我相信这更有可能是我想要的

问题1:就字体度量而言,Tk画布文本中心应该如何工作

问题2:我看到的行为是一个bug,还是可能未被指定

编辑:再使用一段时间,方形符号有时与矩形对齐,有时不对齐。可能是舍入错误。问题是它是否是一个bug


编辑2:将0.5添加到x似乎将正方形放在正确的位置。对于rect和text,像素原点的定义可能有所不同?

Tk使用字体的逻辑属性来确定文本的空间。特别是,它要求字体引擎测量一段文本的长度(通常为一种字体,没有换行符或制表符),以确定该文本的边界框。然后,它还根据锚定规则、其他线条的大小、对齐规则、在画布上的旋转设置等来决定边界框的位置,最后要求字体引擎在框内绘制文本,即从框内的原点(不是左上角点IIRC)开始绘制文本,但实际上可能是基线上最左边的点——老实说,我让Tk来处理细节

从那时起,字体引擎就开始关注累积错误的细节,当文本以任何角度不平行于窗口边缘时,这是一个非常重要的问题,只要它保持在边界框内,Tk就会感到高兴


Tk的画布使用浮点坐标,但在大多数平台上,渲染时它将这些坐标舍入为整数。macOS是个例外,平台绘图引擎本身接受浮点坐标,画布上的所有图形输出都要经过良好的亚像素渲染。这可能会导致画布在该平台上的外观发生某种变化,即使模型没有变化;可以说,这也更接近于它们的外观,如果你将画布的显示转换为嵌入的postscript,你会得到同样的结果。

有趣。你是说这个字体引擎是由平台而不是Tk提供的吗?试图确定一个行动方案