c - XPutImage 出现问题

标签 c image git x11

我有这些函数调用:

OSPImgBlit(&img->_obj, &win1->_obj, 0, 0, 0, 0, 640, 480);
OSPRun(&win1->_obj, OSPWND_SWAP);

对于这些实现:

void OSPwnd_swap(OSPobj *obj, va_list arg) {
    OSPwindow *wnd = (OSPwindow *) obj;
    XdbeSwapInfo swpifo;

    swpifo.swap_window = wnd->_wnd;
    swpifo.swap_action = XdbeUndefined;

    // XdbeSwapBuffers returns true on success, we return 0 on success.
    if(XdbeSwapBuffers(wnd->_dpy->_dpy, &swpifo, 1)) {
        OSPrint(1, "OSPwnd_swap : Window %d swapped "
                    "on connection %d",
                    wnd->_wnd, XConnectionNumber(wnd->_dpy->_dpy));
/*      XFlush(wnd->_dpy->_dpy); */
    }
    else {
        OSPrint(1, "OSPwnd_swap : Unable to swap window %d "
                    "on connection %d",
                    wnd->_wnd, XConnectionNumber(wnd->_dpy->_dpy));
    }
}

void OSPImgBlit(OSPobj *orig, OSPobj *dest, int x_orig, int y_orig,
            int x_dest, int y_dest, unsigned int width, unsigned int height) {
    OSPimage *orig_as_image = (OSPimage *) orig;
    OSPwindow *orig_as_window = (OSPwindow *) orig;
    OSPimage *dest_as_image = (OSPimage *) dest;
    OSPwindow *dest_as_window = (OSPwindow *) dest;

    enum {
        image_to_image = 0,
        image_to_window = 1,
        window_to_image = 2,
        window_to_window = 3
    } mode = image_to_window;

    switch(mode) {
        case image_to_window:
            XPutImage(dest_as_window->_dpy->_dpy, dest_as_window->_bbf,
                        dest_as_window->_gc, orig_as_image->_img,
                        x_orig, y_orig, x_dest, y_dest, width, height);
        default:;
    }
}

完整代码在这里:https://github.com/DJTECKING/OSPOOC.git

我的应用程序正确启动,但是当我尝试关闭我创建的窗口时,它会随机发生以下行为之一: - 段错误 - X_PutImage 上的 BadDrawable - 什么都没有(关闭窗口上的关闭按钮不起作用) - 正确关闭窗口和应用程序

我想我正在使用已经关闭的窗口或释放的图像, 但在整个代码中我不明白这是怎么发生的,有什么想法吗?

此外,XPutImage 只传输一个正方形 当我试图复制整个窗口时。

另一个可能与本主题分开的问题, 即使使用 Xdouble 缓冲区扩展,我仍然面临丑陋的撕裂效果, 这个扩展不是应该避免这种情况吗?

我没有 10 声望,所以这里是直接图片链接: http://i.stack.imgur.com/AnlMo.png

最佳答案

撕裂效果可能是由于 Xdbe mate 的实现造成的 fedora22 上的 waylang 下没有撕裂效果。

Segfault 和 BadDrawable 是由于 OSPwnd:OSPDpyHdl 中的事件处理循环造成的。 直到事件队列为空才停止,关闭窗口上的事件先于其他事件到达,例如鼠标指针进入窗口。 然后 OSPDpyHdl 在使用对象检索下一个事件之前删除对象。 这些事件在从 OSPDpyHdl 返回之前也没有得到正确处理。

部分 XPutImage 的原因是 用户无法按[x][y]顺序访问图像的数据表 因为图像在内存中是连续的。 因此 win->_data[y] 访问每一行,win->_data[y][x] 访问每个像素。

问题是所有图像每秒发送 60 次,从而阻碍 X 连接并禁用服务器 react 性。

关于c - XPutImage 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137677/

相关文章:

c - 在 C 中交换方矩阵名称

php - 从 PHP 编译 C,尝试执行 'cc1' 时出现执行错误

html - 强制 Firefox 在 CSS 指定的尺寸内呈现空图像

git - 如何 merge 来自包含另一个目录子集的分支的更改?

git - 远程添加源与远程设置 url 源

git - 维护两个 github 用户帐户

c - 从服务生成 GUI

c - 如何从我的 C 程序运行 bcdedit?

python - 将gif图像转换为png图像的正确方法

python - 如何从 image.pixel 中找到像素位置?