【问题标题】:Xorg loading an imageXorg 加载图像
【发布时间】:2011-07-21 14:16:12
【问题描述】:

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

【问题讨论】:

    标签: x11 xorg window-managers


    【解决方案1】:

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

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

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

    如今人们通常推荐的做事方式是:

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

    如果需要支持更多格式等,可以使用 cairo_image_surface_create_from_png() 或 GdkPixbuf。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您必须在 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);
        

        【讨论】:

          猜你喜欢
          • 2013-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-01
          • 2017-04-07
          • 1970-01-01
          • 2015-03-22
          • 1970-01-01
          相关资源
          最近更新 更多