"stroke" 在 "showing" Pango 布局之后需要?
"stroke" required after "showing" Pango layout?
我一直在追寻 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()
调用来使该行消失。
有效,但感觉不对。文本不需要线条描边。出了什么问题?中风是真的需要还是我又犯了一个错误?
尝试 ctx.new_path()
而不是 ctx.stroke()
。
显示布局似乎设置了当前点,因此 arc
在其开头隐式执行的以下 line_to
实际上显示了一条线。
我一直在追寻 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()
调用来使该行消失。
有效,但感觉不对。文本不需要线条描边。出了什么问题?中风是真的需要还是我又犯了一个错误?
尝试 ctx.new_path()
而不是 ctx.stroke()
。
显示布局似乎设置了当前点,因此 arc
在其开头隐式执行的以下 line_to
实际上显示了一条线。