问题描述
我正在尝试使用 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")
产生这样的结果:
但是,我想启用自由连字(字体肯定有),所以它看起来像这样(在 LibreOffice 中使用 :dlig
字体后缀完成):
我尝试在 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)