簡體   English   中英

在xlib和cairo中繪制帶有透明度的圖標

[英]draw icon with transparency in xlib and cairo

現在我已經有了我想要正確繪制它們的圖標。 目前我正在使用開羅在窗戶上繪制這些圖像。 我有一個掩碼,圖標為pixmap。

cairo_surface_t *image;
cairo_surface_t *imask;
cairo_surface_t *surface;
cairo_t *csurface;

surface = cairo_xlib_surface_create(display, d, DefaultVisual(display, screen), 400, 400);
csurface = cairo_create(surface);

Pixmap icon;
Pixmap mask;

//XWM Stuff ...
if(icon != 0)
{
   get_pixmap_geometry(display, icon, &width, &height, &depth);
   image = cairo_xlib_surface_create(display, icon, DefaultVisual(display, screen), width, height);
   cairo_set_source_surface(csurface, image, 0, 0);
   //How do I apply the mask?
   //I tried cairo_set_operator(csurface, CAIRO_OPERATOR_SOURCE);
   cairo_paint(csurface);
}

但圖標沒有任何透明度。 我找不到用互聯網上的cairo來解決這個問題的例子。 只有一種復雜的方式,但它的記錄非常嚴重,根本無法幫助我。 有人有關於如何使用透明膠片恢復原始圖標的鏈接或示例嗎? 先感謝您。

這是一個很棒的例子,它將圖標“轉變”為一個開放表面: https//github.com/awesomeWM/awesome/blob/430f4fab15bb101b4af9fadbebb9a9bfa47ba9de/objects/client.c#L1501

這使用xcb而不是Xlib,但你應該設法仍然理解這一點。 處理掩碼的部分從第1538行開始。基本上,創建一個新的cairo表面並為其設置一個cairo上下文。 源表面是圖標,掩碼通過cairo_mask_surface應用(“使用某些cairo表面的alpha通道作為繪圖操作的掩碼”)。 您只需將此部件復制到代碼中,這樣就不必將圖標繪制到臨時表面。

TL; DR:你的答案//How do I apply the mask? 是:使用cairo_mask_surface()而不是cairo_paint()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM