在开罗启用字体自由连字

问题描述

我正在尝试使用 Cairo 渲染一些文本(通过 PyCairo):

    with cairo.PSSurface("output.ps",700,100) as surface:

        context = cairo.Context(surface)
        context.set_source_rgb(0,0)

        context.set_font_size(25)

        # Font Style
        context.select_font_face(
            "Adobe Caslon Pro",cairo.FONT_SLANT_NORMAL,cairo.FONT_WEIGHT_NORMAL)

        # TODO: turn on ligatures

        context.move_to(50,50)
        context.show_text("dictum")

产生这样的结果:

enter image description here

但是,我想启用自由连字(字体肯定有),所以它看起来像这样(在 LibreOffice 中使用 :dlig 字体后缀完成):

enter image description here

我尝试在 FontOptions 上设置各种值,但输出没有变化。

如何在开罗启用自由连字?最好是 Python,但如果 C 不是 Python 绑定的一部分,也可以。

解决方法

如何在开罗启用自由连字?

你没有。

您正在使用 cairo 的玩具文本 API。这仅作为“入门”和显示示例的一种简单方法而存在。它不做复杂的事情,比如塑造。我猜连字也是其中的一部分。

“真正的”API 是 cairo_show_text_glyphs。此函数不呈现文本,而是呈现字形列表。函数的调用者必须将文本本身转换为相应的字形。

这样做的一个好方法是使用 Pango。 Pango 正是这样做的:将文本转换为字形。

我敢打赌,Pango 有 Python 绑定,但我从未使用过它们。如果您需要,我可以提供 Pango + Cairo 的 C 示例。

,

正如@Uli Schlachter 所说,答案是 Pango。

具体来说,在 Pango 标记中设置 font_features

import cairo
import gi
gi.require_version('Gtk','3.0')
gi.require_version('Gdk','3.0')
gi.require_version('Pango','1.0')
gi.require_version('PangoCairo','1.0')
from gi.repository import Pango,PangoCairo

def doText(text):
     with cairo.ImageSurface(cairo.Format.RGB24,w,h) as surface:
        features = [ "dlig" ]
        markup = f'<span font_features="{features}">' + text + '</span>'

        context = cairo.Context(surface)
        context.set_source_rgb(0,0)

        layout = PangoCairo.create_layout(context)

        font = "Adobe Caslon Pro"
        size = 25

        font_desc = Pango.font_description_from_string(f'{font} {size}')
        layout.set_font_description(font_desc)

        layout.set_markup(markup,-1)

        # position for the text
        context.move_to(100,100)
        PangoCairo.show_layout(context,layout)

        surface.write_to_png(outfile)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...