0

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

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

        context = cairo.Context(surface)
        context.set_source_rgb(0, 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")

这会产生这样的东西:

在此处输入图像描述

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

在此处输入图像描述

我尝试设置各种值FontOptions而输出没有变化。

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

4

2 回答 2

1

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

你没有。

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

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

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

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

于 2021-07-21T14:04:58.707 回答
1

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

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

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, 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)
于 2021-07-21T14:11:15.930 回答