Awesome WM: как работает радиальный градиент

Пытаюсь сделать градиент в виде виньетки - от центра экрана к краям, от полупрозрачного к черному, используя радиальный градиент шаблона.
Наличие виджета размером с экран со следующими bg:

bg = 'radial:960,540,10:0,0,10:0,#ff000000:0.5,#00ff0088:1,#0000ffff'

не могу понять, что такое "начальная/конечная точка шаблона" и "радиусы начальной/конечной окружности", которая в основном представляет собой :0,0,10: часть строки выше.


person streetturtle    schedule 13.03.2019    source источник


Ответы (1)


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 (с некоторыми комментариями), которая создает следующее изображение. Два круга также нарисованы черным цветом, чтобы было более очевидно, где они находятся. Надеюсь, это проясняет, как цвет интерполируется между ними.

пример шаблона

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
comment
Потрясающий! Спасибо! Поэтому для градиента, подобного виньетке, я использовал два круга с центрами в центре экрана: 'radial:960,540,20:960,540,500:0,#00000000:0.2,#88888888:1,#000000ff' - person streetturtle; 14.03.2019