将XCreateImage与LodePNG一起使用时出现意外故障

时间:2014-01-29 20:09:28

标签: image background window png xlib

我正在尝试在Linux中将背景图像添加到X11窗口。我使用简单的LodePNG将PNG图像解码为原始数据(RGBA)然后我尝试设置窗口背景。 发生的事情是窗口显示一段时间后意外关闭。如果我注释掉XCreateImageXPutImage函数(包括析构函数),则窗口会正确显示,因此窗口创建不是问题。 我的代码如下所示:

// Headers here (xlib, lodepng) ...

// Global vars ...
Display *display;
Window window;
int window_width = 640;
int window_height = 480;

// Entry point, initialization, window creation ...
int main(int argc, char* argv[]) {

    vector<unsigned char> image; //the raw pixels
    unsigned width, height;

    // Decode
    unsigned error = lodepng::decode(image, width, height, "bg.png");

    // If there's no error continue
    if(!error)
    {
        Pixmap pixmap = XCreatePixmap
        (
            display, 
            XDefaultRootWindow(display), 
            width, 
            height, 
            DefaultDepth(display, 0)
        );

        XGCValues gr_values; 
        GC gr_context = XCreateGC
        (
            display, 
            window, 
            GCBackground, 
            &gr_values
        );

        // Here is where it fails !!!
        unsigned rowbytes = 0;
        XImage *ximage = XCreateImage
        (
            display, 
            CopyFromParent, 
            32, 
            XYPixmap, 
            0, 
            (char*)image.data(), 
            width, 
            height, 
            32, 
            rowbytes
        );

        XPutImage(
            display, 
            pixmap, 
            gr_context, 
            ximage, 
            0, 0, 
            0, 0, 
            window_width, 
            window_height
        );

        XSetWindowBackgroundPixmap(display, window, pixmap);

        XFreePixmap(display, pixmap);
        XFreeGC(display, gr_context);
        XDestroyImage(ximage);
    }
}

解码PNG后,我可以看到图像的宽度和高度正确。原始数据(image变量)的大小总是819200,无论我选择什么图像,这有点奇怪,我想知道LodePNG是否没有正确加载图像(但它没有给出错误和正确的宽度和高度)。这个问题的其他原因,我不知道。我没有得到任何错误消息,窗口只是在看到一点后关闭。也许XCreateImage的一些论点是错误的,但我无法弄清楚哪一个。

0 个答案:

没有答案