AwesomeWM просто "раздает" здесь каирские шаблоны. При беглом просмотре я нашел только https://www.cairographics.org/tutorial/#L2preparesource и ссылку на API в https://www.cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-create-radial и https://www.cairographics.org/manual/cairo-cairo-pattern-t.html#cairo-pattern-add-color-stop-rgb.
'радиальный: 960,540,10:0,0,10:0,#ff000000:0.5,#00ff0088:1,#0000ffff'
Этот радиальный шаблон определяется на основе двух кругов. Первый имеет центр 960, 540 и радиус 10. Второй круг имеет центр 0, 0 и радиус 10. Этим двум кругам можно назначить цвета. 0#ff00000000
назначает цвет в «относительной позиции» 0, т. е. назначает цвет, который следует использовать именно там, где находится первый цикл. Последний цвет имеет относительную позицию 1, что означает, что предоставленный цвет используется для второго круга. Средний цвет имеет относительное положение 0,5, что означает, что он используется «на полпути» между двумя кругами.
Чтобы сделать вышеизложенное немного более понятным, вот программа Lua (с некоторыми комментариями), которая создает следующее изображение. Два круга также нарисованы черным цветом, чтобы было более очевидно, где они находятся. Надеюсь, это проясняет, как цвет интерполируется между ними.
![пример шаблона](https://i.stack.imgur.com/v2f8F.png)
local cairo = require("lgi").cairo
local img = cairo.ImageSurface.create(cairo.Format.RGB24, 200, 200)
local pattern = cairo.Pattern.create_radial(
100, 100, 10, -- First cycle, center is center of the image, radius is 10
150, 150, 120) -- Second cycle, it is offset a bit and it has a radius of 100
-- Now add some color stops
pattern:add_color_stop_rgb(0, -- "relative position 0", i.e. at the first circle
1, 0, 0) -- We assign the color 'red'
pattern:add_color_stop_rgb(1, -- "relative position 1", i.e. at the second circle
0, 0, 1) -- We assign the color 'blue'
pattern:add_color_stop_rgb(0.5, -- "relative position 0.5", i.e. 'in the middle' between both circles
0, 1, 0) -- We assign the color 'green'
-- Draw the pattern to the image surface
local cr = cairo.Context(img)
cr:set_source(pattern)
cr:paint()
-- Also draw the two circles in black to make it (hopefully) clearer what is
-- going on
cr:arc(100, 100, 10, 0, 2*math.pi)
cr:new_sub_path()
cr:arc(150, 150, 120, 0, 2*math.pi)
cr:set_source_rgb(0, 0, 0)
cr:stroke()
img:write_to_png("gradient.png")
person
Uli Schlachter
schedule
14.03.2019