2014-07-23 7 views
1

awmome wm 3.5에서는 cairo를 사용하여 사용자 정의 위젯을 만들어 시각적으로 그릴 수 있습니다. 단색 PNG 아이콘 (wibox.widget.imagebox처럼)을 표시하는 위젯이 필요하며 색상을 빠르게 변경할 수 있습니다. wibox.widget.imagebox의 draw 함수에서 몇 줄을 수정 해 보았습니다.멋진 wm을 통해 아이콘 색상 변경

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 

그러나 작동하지 않습니다. 나는 여러 다른 카이로 합성 연산자를 설정하려고 시도했으며 대부분은 예상대로 작동하지 않습니다. wibox 배경색 대신 겹치는 영역과 검정색 영역이 잘못되었습니다. SOURCE 및 OVER는 올바르게 작동합니다. 나는 어디에서 실수 했습니까?

답변

0

실수는 카이로의 그림 그리기 방법에 대한 이해입니다. 검은 색/투명 함은 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)