Как правильно построить простой шаблон повторяющейся формы для использования в качестве заливки в Каире? - PullRequest
0 голосов
/ 05 мая 2018

Я довольно новичок в Каире, и я возился с программой для создания небольших 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.

1 Ответ

0 голосов
/ 05 мая 2018

При увеличении изображения вы увеличиваете масштаб до surf. Из-за начального context.scale(256, 256) содержимое поверхности patternSurf масштабируется с коэффициентом 256 перед рисованием. Когда я добавляю contxt.scale(1.0/256.0, 1.0/256.0) перед вызовом к set_source_surface, я получаю результат, который, я полагаю, вы ожидаете.

...