Я довольно новичок в Каире, и я возился с программой для создания небольших SVG-изображений. Я хотел бы заполнить области некоторых из этих изображений повторяющимися узорами, которые также были созданы в Каире - другими словами, я пытался нарисовать на поверхности Каира в памяти, а затем использовать его в качестве исходного рисунка для заполнения путей. на другой поверхности. С точки зрения API это выглядит так, как будто это должно быть относительно просто, но я, кажется, упускаю что-то, пытаясь сделать что-то столь же простое, как рисунок на поверхности с цветом фона, а простая форма заполняется только цветом фона поверхности.
Ниже приведен сравнительно минимизированный пример (использовались пути вместо прямоугольных, поскольку мое предполагаемое использование включает произвольные формы):
import cairo
def drawPattern(ctx):
ctx.move_to(0.0, 0.0)
ctx.line_to(0.0, 1.0)
ctx.line_to(1.0, 1.0)
ctx.line_to(1.0, 0.0)
ctx.line_to(0.0, 0.0)
ctx.set_source_rgb(0.8, 1.0, 0)
ctx.fill()
ctx.move_to(0.5, 0.8)
ctx.line_to(0.8, 0.5)
ctx.line_to(0.5, 0.2)
ctx.line_to(0.2, 0.5)
ctx.line_to(0.5, 0.8)
ctx.set_source_rgb(0, 0, 0)
ctx.fill()
surf = cairo.SVGSurface("test.svg", 256, 256)
context = cairo.Context(surf)
context.scale(256, 256)
patternSurf = cairo.SVGSurface(None, 32, 32)
patternCtx = cairo.Context(patternSurf)
patternCtx.scale(32, 32)
drawPattern(patternCtx)
patternSurf.flush()
context.move_to(0.0, 0.0)
context.line_to(0.0, 1.0)
context.line_to(1.0, 1.0)
context.line_to(1.0, 0.0)
context.line_to(0.0, 0.0)
context.set_source_rgb(0.0, 1.0, 0.0)
context.fill()
context.move_to(0.5, 0.0)
context.line_to(0.5, 1.0)
context.line_to(1.0, 1.0)
context.line_to(1.0, 0.0)
context.line_to(0.5, 0.0)
context.set_source_surface(patternSurf)
context.get_source().set_extend(cairo.Extend.REPEAT)
context.fill()
surf.finish()
Моя цель в этом примере состояла в том, чтобы получить простое квадратное изображение с левой половиной зеленого цвета, а с правой - больше желто-зеленого с повторяющимися черными бриллиантами. Тем не менее, алмазы не появляются, хотя желто-зеленый цвет фона появляется (это является представителем более широкой проблемы, с которой я столкнулся). Как бы это исправить, чтобы поверхность с черными бриллиантами правильно использовалась в качестве повторяющегося рисунка для другой поверхности?
Я использую Pycairo с установленной Cairo версией 1.14.12, хотя я предполагаю, что вопрос, вероятно, является общим для использования Cairo, а не специфическим для привязок Python.