c - Xlib - 在窗口上仅绘制位图的设置位

标签 c linux x11 xlib

我正在尝试在窗口上绘制位图。我只需要绘制位图中1位对应的像素即可;与 0 位相对应的那些应保持不变。我正在使用这样的代码:

XImage *image;
uint8_t bitmap[8192]; /* 256 x 256 / 8 */

memset(bitmap, 0xaa, sizeof(bitmap));

XSetForeground(g_display, g_gc, 0x000000ff);
XSetBackground(g_display, g_gc, 0x00000000);

image = XCreateImage(g_display, g_visual, 1, XYBitmap,
    0, (char *)bitmap, 256, 256, 32, 0);
XPutImage(g_display, g_wnd, g_gc, image, 0, 0, 10, 10, 255, 255);
XFree(image);

(是的,我知道像我一样直接指定颜色是错误的,但现在对我来说没问题)。

显然,位图的 0 位是用背景颜色(即黑色)绘制的。我希望它们根本不被绘制。实现这一目标的最佳方法是什么?有什么方法可以指定掩码什么的吗?

最佳答案

首先,对于非透明位图,您不需要从位图数据创建全深度图像。创建一位像素图并使用 XCopyPlane。

对于透明位图,您需要操作 GC 的剪辑蒙版。

Pixmap bitmap;
...; /* create 1-bit-deep pixmap */
XSetClipMask(display, gc, bitmap);
XSetClipOrigin(display, gc, x, y);
/* 1-bits of the bitmap are filled with the foreground color,
   and 0-bits are left intact */
XFillRectangle(display, window, gc, x, y, width, heiht);

关于c - Xlib - 在窗口上仅绘制位图的设置位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10513367/

相关文章:

linux - Unix awk 命令 BEGIN 和 END 语法错误

x11 - 需要帮助了解 X11 协议(protocol)错误

c++ - XRender 显示来自磁盘/应用程序生成图像的图片

linux - GNUPLOT 无法放大

c - 打印到缓冲区或文件重用代码

c - 具有灵活数组成员的结构数组如何表现?

c++ - 在 CentOs 7 上安装 gcc 7.4.0 不会更新我的 libstdc++ 版本

c++ - Makefile:无需执行任何操作

PHP/PAM 更改用户密码?

linux - 无法通过 SSH 连接到 Linux GCP 实例