2016-01-16 2 views
1

Maintenant que j'ai les icônes, je veux les dessiner correctement. En ce moment j'utilise Cairo pour dessiner ces images sur une fenêtre. J'ai un masque et l'icône en tant que pixmap.dessiner une icône avec transparence dans xlib et cairo

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); 
} 

Mais les icônes n'ont pas de transparents. Je n'ai trouvé aucun exemple pour résoudre ce problème avec le cairo sur Internet. Il n'y a qu'une manière compliquée mais c'est tellement mal documenté que ça ne m'aide pas du tout. Est-ce que quelqu'un a un lien ou un exemple pour restaurer l'icône d'origine avec ses transparents? Merci d'avance.

Répondre

3

Voici un exemple impressionnant où il « tourne » l'icône dans une surface de cairo: https://github.com/awesomeWM/awesome/blob/430f4fab15bb101b4af9fadbebb9a9bfa47ba9de/objects/client.c#L1501

Il utilise XCB au lieu de Xlib, mais vous devriez arriver à comprendre encore ce. La partie qui gère un masque commence à la ligne 1538. Fondamentalement, une nouvelle surface de cairo est créée et un contexte de cairo est mis en place pour cela. La surface source est l'icône et le masque est appliqué via cairo_mask_surface ("utiliser le canal alpha de certaines surfaces cairo comme masque d'une opération de dessin"). Vous pouvez simplement copier cette partie dans votre code afin de ne pas avoir à dessiner les icônes sur une surface temporaire.

TL; DR: La réponse à votre //How do I apply the mask? est: Utiliser cairo_mask_surface() au lieu de cairo_paint().