在透明 xcb 窗口上绘图时出现绘图伪影。我该如何解决这个问题?

问题描述 投票:0回答:1

我正在尝试使用 xcb 创建透明窗口,并由合成器提供透明度信息。

我已经成功创建了透明窗口,并使用 cairo 绘制它们,但是,我的问题在我提供的图像中应该是不言自明的。
由于某种原因,我在第一个窗口的第二个窗口中得到了工件。我不知道如何准确解决这个问题。

这是我正在使用的lua代码:

local init_x = 80
local init_y = 280
local init_width = 300
local init_height = 200

local win_id = swin.create(init_x, init_y, init_width, init_height)
local pix_id = spixmap.create(init_width, init_height)

local surf = scairo.create_from_pixmap(pix_id, init_width, init_height)
local lsurf = lgi.cairo.Surface(surf, true)
local cr = lgi.cairo.Context(lsurf)

-- the source operator should use data from the compositor
cr:set_operator(lgi.cairo.Operator.SOURCE)
-- paint the window transparent. 
cr:paint_with_alpha(0.0)

cr:rectangle(0, 0, 40, 40)
cr:set_source_rgb(0.8, 0.1, 0.8)
cr:fill()

swin.map(win_id)
spixmap.draw_portion_to_window(pix_id, win_id, 0, 0, init_width, init_height)

lua代码显然是C代码的简化,但尽管如此,我不认为我做错了什么。

我会添加更多细节,但我不想污染这篇文章。如果您想了解什么,请询问,我会编辑我的帖子。

xorg xcb
1个回答
0
投票

您是否看到来自未初始化内存的垃圾?具体来说,当您发送

CreatePixmap
请求时,X11 服务器仅分配内存,但不会以任何方式初始化它。

我不得不承认我不太明白你的Lua代码在做什么,但是下面的评论提出了一个危险信号:

-- paint the window transparent. 
cr:paint_with_alpha(0.0)

该评论表明您认为这会使开罗表面完全透明(用 alpha=0 填充所有内容)。但相反,这条线根本没有做任何事情。

要将开罗表面清除为透明,您需要:

cr:set_operator(lgi.cairo.Operator.SOURCE)
cr:set_source_rgba(0, 0, 0, 0)
cr:paint()
© www.soinside.com 2019 - 2024. All rights reserved.