使用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()
打开的窗口中绘制两种类型的图形:

  • RGB图形取自原始32位像素的内存缓冲区 (AARGGBB),无阿尔法混合

  • CLUT图形取自一个8位像素的内存缓冲区,用于描述存储库中的条目 单独的颜色映射

  • 通过使用
    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。