Собственно, суть проблемы в названии.
Копаюсь с настройкой awesome. Для одного конкретного imagebox'а переопределяю функцию отрисовки, и всё неплохо за одним минусом — cairo отказывается использовать маску.
Вероятно, проблема в моей голове или в каком-то невозможно базовом понятии. Поиск ничего не дал, чтение документации тоже.
-- Это обычная функция отрисовки imagebox'а, за исключением конечных строк
function l_box:draw (wibox, cr, width, height)
if not self._image then return end
cr:save()
if not self.resize_forbidden then
-- Let's scale the image so that it fits into (width, height)
local w = self._image:get_width()
local h = self._image:get_height()
local aspect = width / w
local aspect_h = height / h
if aspect > aspect_h then aspect = aspect_h end
cr:scale(aspect, aspect)
end
-- Вот тут и изменения
if l_box._mask then -- _mask — это просто true/false
cr:set_source_rgb(0, 0, 0) -- источник заполняем чёрным
cr:mask_surface(self._image,0,0) -- как я думаю, это должно заставить cairo
-- закрасить чёрным только те области,
-- которые в self._image непрозрачны. Но почему-то,
-- если добавить эту строчку, ничего не рисуется вообще.
-- Если убрать, то, как и надо, область изображения
-- целиком заливается чёрным.
cr:paint()
else
cr:set_source_surface(self._image, 0, 0)
cr:paint()
end
cr:restore()
end