Xorg加载图像

时间:2008-12-06 14:30:01

标签: x11 xorg window-managers

我开始编写自己的窗口管理器代码,并想知道如何使用xorg api从原始图像数据(例如libpng提供的数据)到Xorg Pixmap或Xorg可绘制的东西?

3 个答案:

答案 0 :(得分:3)

你可能在2008年以后的某个时候发现了这一点,但为了未来读者的利益......

XCreatePixmapFromBitmapData()将文字位图(即1位,黑色和白色)数据加载到像素图中。如果目标是从PNG加载,则很可能不是您想要的。

更新的方法是使用Cairo或GdkPixbuf。 XCreatePixmapFromBitmapData()和XDrawWhatever()之类的老式Xlib API几乎都被弃用了(并不是说它们实际上会被删除,但是它们已经过时并且与现代应用程序的工作方式不同步。)

这些天人们通常建议做事的方式是:

  • 更喜欢libxcb到libX11,libxcb只是X协议的一个非常薄的包装器,缺少执行多个X协议请求的调用(例如CreatePixmapFromBitmapData执行CreatePixmap,CreateGC,PutImage,FreeGC)
  • 更喜欢cairo(或类似的库,Skia是一个)到服务器端绘图API

如果您需要支持更多格式等,可以将cairo_image_surface_create_from_png()用于简单目的,或者使用GdkPixbuf。

答案 1 :(得分:1)

XCreatePixmapFromBitmapData就是这样做的。请记住,您需要输入与xserver使用的位深度相同的数据。

答案 2 :(得分:0)

你需要做XCreateImage,XCreatePixmap和XCopyArea的小舞会。它有点像这样:

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