在令人敬畏的wm 3.5中,您可以使用cairo创建自定义小部件来绘制其视觉效果。我想要一个显示单色PNG图标的小部件(如wibox.widget.imagebox),并允许快速更改其颜色。我尝试在wibox.widget.imagebox
的draw函数中修改几行local cairo = require("lgi").cairo
--- Draw an imagebox with the given cairo context in the given geometry.
function imagebox:draw(wibox, cr, width, height)
if not self._image then return end
if width == 0 or height == 0 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
-- Here is my modifications
cr:set_source_surface(self._image, 0, 0)
cr:paint()
cr:set_operator(cairo.Operator.IN)
cr:set_source_rgba(0, 0, 1, 0.5)
cr:paint()
-- End of my my modifications
-- This is original draw code how it was
--cr:set_source_surface(self._image, 0, 0)
--cr:paint()
cr:restore()
end
但它不起作用。我尝试设置其他几个cairo的合成操作符,其中大部分都不像预期的那样工作。错误的重叠区域和黑色区域而不是wibox背景颜色。 SOURCE和OVER只能正常工作。我在哪里弄错了?
答案 0 :(得分:0)
错误在于你对cairo绘图方法的理解。黑色/透明正是IN在它没有触及的地方留下的东西。换句话说,您首先在背景上绘制其他内容,因此背景会丢失。
请改为尝试:
local pat = require("lgi").cairo.Pattern
cr:set_source_rgba(0, 0, 1, 0.5)
cr:mask(pat.create_for_surface(self._image), 0, 0)