【问题标题】:"stroke" required after "showing" Pango layout?“显示” Pango 布局后需要“中风”吗?
【发布时间】:2020-06-14 18:20:31
【问题描述】:

我一直在寻找 PyCairo 和 PangoCairo 之间的问题。下面的代码说明了这一点:

import math
import cairo
import gi
gi.require_version('Pango', '1.0')
gi.require_version('PangoCairo', '1.0')
from gi.repository import Pango, PangoCairo

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 400, 400)
ctx = cairo.Context(surface)

# TOP LEFT CIRCLE
ctx.save()
ctx.arc(100.0, 100.0, 50, 0, 2 * math.pi)
ctx.set_source_rgba(0.0, 0.0, 1.0, 1.0)
ctx.set_line_width(2.0)
ctx.stroke()
ctx.restore()

# CENTER TEXT
ctx.save()
layout = PangoCairo.create_layout(ctx)
layout.set_font_description(Pango.font_description_from_string('Arial 10.0'))
layout.set_markup('<b>Foo Bar</b>', -1)
ctx.set_source_rgba(0.0, 1.0, 0.0, 1.0)
_, text_extents = layout.get_pixel_extents()
text_width, text_height = text_extents.width, text_extents.height
ctx.translate(200.0, 200.0)
ctx.translate(-text_width / 2, -text_height / 2)
ctx.move_to(0.0, 0.0)
PangoCairo.show_layout(ctx, layout)
# ctx.stroke() # WHY?
ctx.restore()

# BOTTOM RIGHT CIRCLE
ctx.save()
ctx.arc(300.0, 300.0, 50, 0, 2 * math.pi)
ctx.set_source_rgba(1.0, 0.0, 0.0, 1.0)
ctx.set_line_width(2.0)
ctx.stroke()
ctx.restore()

surface.write_to_png('test.png')

结果如下图:

我的意图是画两个圆圈和文字。文本和右下角圆圈之间的线不存在。我可以通过在中心文本代码块中的PangoCairo.show_layout 正下方添加/取消注释ctx.stroke() 调用来使该行消失。

它有效,但感觉不对。文本不需要线条笔划。出了什么问题?是真的需要中风还是我犯了另一个错误?

【问题讨论】:

    标签: python cairo pango pycairo pangocairo


    【解决方案1】:

    尝试ctx.new_path() 而不是ctx.stroke()

    显示布局似乎设置了当前点,因此arc 在其开头隐式执行的以下line_to 实际上显示了一条线。

    【讨论】:

    • 是的,这确实有帮助 - 谢谢!是布局的“故意特征”还是某种错误?
    • 我认为这就是你所说的“有意特征”。看例如在cairo_show_text()。它只获取文本作为参数。先前调用cairo_move_to() 设置文本的位置。此外,该函数将当前点移动到“文本之后”,例如如果您想接下来显示更多文本,这很有用。您所看到的是“用于绘制文本的当前点”和“用于绘制形状的当前点”之间的交互,这在 IMO 中是有意义的。
    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 2014-05-27
    相关资源
    最近更新 更多