Python 如何使用Pango和(py)Cairo激活亚像素定位?

Python 如何使用Pango和(py)Cairo激活亚像素定位?,python,cairo,pango,pycairo,pangocairo,Python,Cairo,Pango,Pycairo,Pangocairo,我只是偶然发现,亚像素定位在2019年被添加到Pango 1.44中——但并非没有问题。显然是的。两篇文章都说需要开罗最新的大师。也许它已经被释放在同一时间(?) 实际上有两个问题: 激活此功能需要哪一版本/版本的Cairo(或pycairo)?或者我(仍然)需要从(未发布的)master构建cairo吗 如何使用Cairo(pycairo)/pangocairo激活亚像素定位? pangocairo有多个Python绑定。我在Python 3中使用以下方法: 导入cairo 导入gi g

我只是偶然发现,亚像素定位在2019年被添加到Pango 1.44中——但并非没有问题。显然是的。两篇文章都说需要开罗最新的大师。也许它已经被释放在同一时间(?)

实际上有两个问题:

  • 激活此功能需要哪一版本/版本的Cairo(或pycairo)?或者我(仍然)需要从(未发布的)master构建cairo吗
  • 如何使用Cairo(pycairo)/pangocairo激活亚像素定位?

pangocairo有多个Python绑定。我在Python 3中使用以下方法:

导入cairo
导入gi
gi.require_版本('Pango','1.0')
gi.require_版本('PangoCairo','1.0')
从gi.repository导入Pango、PangoCairo
我的文本呈现如下所示:

\u路线={
“tl”:lambda宽度,高度:(0.0,0.0),#左上角
“tc”:lambda宽度,高度:(-width/2,0.0),#顶部中心
“tr”:lambda宽度,高度:(-width,0.0),#右上角
“cl”:lambda宽度,高度:(0.0,-高度/2),#左中
“cc”:lambda宽度,高度:(-width/2,-height/2),#中心
“cr”:lambda宽度,高度:(-width,-height/2),#右中
“bl”:lambda宽度,高度:(0.0,-高度),#左下角
“bc”:lambda宽度,高度:(-width/2,-height),#底部中心
“br”:lambda宽度,高度:(-width,-height),#右下角
}
def make_字体(系列、大小):
从字符串(f'{family:s}{size:.2f}'返回Pango.font_description_)
font=make_font('Arial',10.0)
x=0.0
y=0.0
角度=0.0
字体颜色=(1.0,0.0,0.0,0.5)
text='test'
_ctx.save()#u ctx是cairo.Context对象
布局=PangoCairo。创建布局(_ctx)
布局。设置字体描述(字体)
布局.集合标记(文本,-1)
_ctx.set\u source\u rgba(*字体\u颜色)
_,text\u extensts=layout.get\u pixel\u extensts()
文本宽度,文本高度=文本范围.width,文本范围.height
_ctx.translate(x,y)
如果角度!=0.0:
_ctx.旋转(角度)
_ctx.translate(*自对齐[对齐](文本宽度,文本高度))
_ctx.移动到(0.0,0.0)
PangoCairo.显示布局(ctx,布局)
_ctx.restore()
激活此功能需要哪一版本/版本的Cairo(或pycairo)?或者我(仍然)需要从(未发布的)master构建cairo吗

随机猜测:这与开罗的
src/cairo ft-font.c
有关,所以我快速浏览了一下 查看git log src/cairo ft font.c的输出。第三条 听起来像是你要找的:

commit ea9329215d3431ded51a71b724baf0edc25ad633
Author: Matthias Clasen <mclasen@redhat.com>
Date:   Sat Jul 28 12:25:47 2018 +0000

    image compositor: Support subpixel positioning

    Support subpixel positioning with a 4x4 subpixel grid.

    When compositing glyphs in the image compositor,
    we store the subpixel phases in the high bits of the
    glyph index. The _cairo_scaled_glyph_index() macro
    has been updated to discard these bits. By storing
    the phases in the glyph index, the glyph cache just
    keeps working. When loading a glyph, the Freetype
    font backend shifts the outline according to the
    phases.
嗯,似乎没有任何版本,所以你需要大师

如何使用Cairo(pycairo)/pangocairo激活亚像素定位

你没有。据我所知,它是自动激活的。接下来的问题是:如何停用它?答案似乎也是“你没有”


编辑:根据,答案似乎(部分)在函数
pango\u context\u set\u round\u glyph\u positions
中。这似乎处理了Pango和PangoCairo部分的支持。

相关:其中一篇博客文章明确表示“为了解决这个问题,亚像素定位现在是可选的,默认情况下是关闭的”。我还针对所有相关库的最新版本对此进行了大量测试:在我描述的工作流程中没有文本的子像素定位……你是指在你引用后的下一句话中所说的博客帖子:“使用pango_context_set_round_glyph_positions(context,FALSE)打开它。”如果是这样,这似乎是你问题的答案。(当然,我们仍然需要一个具有这种支持的cairo版本,它不是最新版本)是的。我需要建立一个测试系统,从头开始编译。让我们看看我能走多远……根据经验,pycairo API在一些地方看起来有点不同,因此有时很难找出pycairo的等效策略。
$ git describe --contains ea9329215d3431ded51a71b724baf0edc25ad633
fatal: cannot describe 'ea9329215d3431ded51a71b724baf0edc25ad633'