2008-12-06 18 views
2

Je commence à coder mon propre gestionnaire de fenêtres, et je me demandais comment utiliser l'API xorg pour obtenir des données d'image brutes (telles que les données fournies par libpng), dans un Pixmap Xorg ou quelque chose dessinable par Xorg?Xorg charger une image

Répondre

1

XCreatePixmapFromBitmapData devrait faire exactement cela. N'oubliez pas que vous devez fournir des données de la même profondeur que votre xserver.

3

Vous avez sans doute découvert ce à un moment donné depuis 2008, mais pour le bénéfice des futurs lecteurs ...

XCreatePixmapFromBitmapData() va charger des données bitmap littérale (à savoir 1-bit, blanc noir &) dans un pixmap. Ce n'est probablement pas ce que vous voulez, si l'objectif est de charger à partir d'un fichier PNG.

Une façon plus récente de faire cela est d'utiliser Cairo ou GdkPixbuf. Les API Xlib old-school telles que XCreatePixmapFromBitmapData() et XDrawWhatever() sont toutes à peu près obsolètes (non pas qu'elles seront réellement supprimées, mais elles sont obsolètes et désynchronisées par rapport au fonctionnement des applications modernes).

La façon dont les gens recommanderaient généralement faire des choses ces jours-ci est:

  • préfèrent libxcb à libX11, libxcb est juste une enveloppe très mince autour du protocole X et manque des appels qui font plusieurs requêtes de protocole X (par exemple CreatePixmapFromBitmapData ne CreatePixmap, CreateGC, PutImage, FreeGC)
  • préfèrent caire (ou d'une bibliothèque comparable, Skia est un) à l'API de dessin côté serveur

Vous pouvez utiliser cairo_image_surface_create_from_png() pour simp le but ou GdkPixbuf si vous avez besoin de supporter plus de formats, etc.

0

Il y a un peu de danse avec XCreateImage, XCreatePixmap et XCopyArea que vous avez à faire. Cela ressemble un peu à ceci:

struct Image img = get_pixels_and_geometry_from_libpng("filename.png"); 
XImage *img = XCreateImage(/*5000 paremeters*/); 
Pixmap pixmap = XCreatePixmap(dpy, img.width, img.height, 24); 
XPutImage(dpy, pixmap, gc, 0, 0, img.width, img.height); 
XCopyArea(dpy, pixmap, window, 0, 0, img.width, img.height, x, y);