使用XPutImage将CLUT和RGB图像绘制到同一窗口
我试图在使用使用XPutImage将CLUT和RGB图像绘制到同一窗口,c,linux,x11,xlib,C,Linux,X11,Xlib,我试图在使用XCreateWindow()打开的窗口中绘制两种类型的图形: RGB图形取自原始32位像素的内存缓冲区 (AARGGBB),无阿尔法混合 CLUT图形取自一个8位像素的内存缓冲区,用于描述存储库中的条目 单独的颜色映射 通过使用XCreateImage()从内存缓冲区创建一个XImage,我可以轻松地在窗口中绘制RGB图形,然后使用XPutImage()绘制此图像。这很好用 然而,当涉及到绘制CLUT图形时,事情似乎变得更加棘手。据我所知,Xlib有一种特殊的视觉类型,名为伪彩色,
XCreateWindow()
打开的窗口中绘制两种类型的图形:
XCreateImage()
从内存缓冲区创建一个XImage
,我可以轻松地在窗口中绘制RGB图形,然后使用XPutImage()
绘制此图像。这很好用
然而,当涉及到绘制CLUT图形时,事情似乎变得更加棘手。据我所知,Xlib有一种特殊的视觉类型,名为伪彩色,它似乎符合我的要求,因为文档中说:
对于伪彩色,像素值索引要生成的彩色贴图
独立的RGB值,并且可以动态更改RGB值
()
但是,据我所知,创建窗口时必须指定窗口的视觉类型,因为它作为参数传递给XCreateWindow()
。因此,在我看来,似乎我必须在使用真彩色或假彩色窗口视觉效果之间做出选择,但我不能同时使用这两种效果
这是对的吗?换句话说,是否不可能将RGB和CLUT像素绘制到同一窗口
当然,我可以通过手动将CLUT像素转换为RGB像素,然后使用XPutImage()
如上所述绘制转换后的像素来解决此限制。然而,在我这么做之前,我首先想知道是否有任何方法可以直接在RGB图形旁边绘制CLUT图形
编辑
作为参考,以下是我迄今为止尝试过的内容:
unsigned char *pixels = malloc(640 * 480); // in reality this is filled with real pens
unsigned int palette[256]; // in reality this is filled with real RGB values
Colormap cm;
XColor rgb;
int i;
cm = XCreateColormap(display, window, visual, AllocAll);
for(i = 0; i < 256; i++) {
rgb.pixel = i;
rgb.red = GetRValue(palette[i]) * 257;
rgb.green = GetGValue(palette[i]) * 257;
rgb.blue = GetBValue(palette[i]) * 257;
rgb.flags = DoRed|DoGreen|DoBlue;
XStoreColor(display, cm, &rgb);
}
XSetWindowColormap(display, window, cm);
image = XCreateImage(display, visual, 8, ZPixmap, 0, pixels, 640, 480, 8, 640);
XPutImage(display, window, gc, image, 0, 0, 0, 0, 640, 480);
XFlush(display);
image->data = NULL;
XDestroyImage(image);
XFreeColormap(display, cm);
unsigned char*pixels=malloc(640*480);//事实上,这是充满了真正的钢笔
无符号整数调色板[256];//实际上,这是用真实的RGB值填充的
彩色地图厘米;
XColor rgb;
int i;
cm=XCreateColormap(显示、窗口、可视、AllocAll);
对于(i=0;i<256;i++){
rgb.pixel=i;
rgb.red=GetRValue(调色板[i])*257;
rgb.green=GetGValue(调色板[i])*257;
rgb.blue=GetBValue(调色板[i])*257;
rgb.flags=DoRed | DoGreen | DoBlue;
XStoreColor(显示器、cm和rgb);
}
XSetWindowColormap(显示器、窗口、厘米);
image=XCreateImage(显示,可视,8,ZPixmap,0,像素,640480,8640);
XPutImage(显示、窗口、gc、图像、0、0、0、640、480);
XFlush(显示);
图像->数据=NULL;
XDestroyImage(图像);
XFreeColormap(显示,厘米);
它已在XCreateColormap()
中失败,说明:
失败请求的X错误:错误匹配(无效参数属性)失败请求的主要操作码:78(X_CreateColormap)序列号 失败请求的数量:497输出流中的当前序列号:500 如果我使用
AllocNone
而不是AllocAll
,XCreateColormap()
成功,但XStoreColor()
失败,说明:
失败请求的X错误:BadAccess(拒绝尝试访问专用资源)
失败请求的主要操作码:89(X_)
失败请求的序列号:493输出流中的当前序列号:751
在TrueColor窗口上绘制伪彩色视觉效果时会发生什么?(我猜它弄乱了颜色,因为它没有颜色映射,或者它只是返回了一个错误)(我指的是伪彩色图像,不是视觉的)@user253751:我甚至还不能画出任何东西。它甚至不允许我创建一个colormap,即调用
XCreateColormap(显示、窗口、可视、AllocAll)
失败并返回一个BadMatch(无效参数属性)
错误,大概是因为我正在传递AllocAll
,根据文档,这必须是TrueColor
的AllocNone
,但显然我需要笔来完成我想做的事情……好的。那么我的假设是:X不能这样做。@user253751:我也这么认为。所以我想我必须把CLUT像素转换成RGB,然后把它们画成RGB。