XPutImage 有问题
Having issues with XPutImage
我有这些函数调用:
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
我的应用程序可以正常启动,但是当我尝试关闭我创建的 window 时,它会随机发生以下行为之一:
- 段错误
- X_PutImage 上的 BadDrawable
- 什么都没有(关闭时关闭按钮不起作用 window)
- 正确关闭 window 和应用程序
我想我正在使用已经关闭的 window 或释放的图像,
但是在整个代码中我不明白这是怎么发生的,知道吗?
另外,XPutImage 只 blits 一个正方形
当我试图复制整个 window.
另一个可能与本主题分开的问题,
我继续面对丑陋的撕裂效果,即使有 Xdouble 缓冲区扩展,
这个扩展不是应该避免这种情况吗?
我没有 10 个声望所以这是直接图片 link:
http://i.stack.imgur.com/AnlMo.png
撕裂效果可能是由于 Xdbe mate 的实现
fedora22 上的 waylang 下无撕裂效果。
Segfault 和 BadDrawable 是由于 OSPwnd:OSPDpyHdl 中的事件处理循环。
直到事件队列为空它才停止,关闭 window 的事件比其他事件先到达,例如鼠标指针进入 window。
然后 OSPDpyHdl 在使用它们检索下一个事件之前删除对象。
这些事件在从 OSPDpyHdl 返回之前也没有得到正确处理。
部分 XPutImage 是因为
用户无法按 [x][y] 顺序访问图像的数据 table
因为图像在内存中是连续的。
所以 win->_data[y] 访问每一行和 win->_data[y][x] 每个像素。
问题是所有图像每秒发送 60 次,阻碍了 X 连接并禁用了服务器反应。
我有这些函数调用:
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
我的应用程序可以正常启动,但是当我尝试关闭我创建的 window 时,它会随机发生以下行为之一: - 段错误 - X_PutImage 上的 BadDrawable - 什么都没有(关闭时关闭按钮不起作用 window) - 正确关闭 window 和应用程序
我想我正在使用已经关闭的 window 或释放的图像, 但是在整个代码中我不明白这是怎么发生的,知道吗?
另外,XPutImage 只 blits 一个正方形 当我试图复制整个 window.
另一个可能与本主题分开的问题, 我继续面对丑陋的撕裂效果,即使有 Xdouble 缓冲区扩展, 这个扩展不是应该避免这种情况吗?
我没有 10 个声望所以这是直接图片 link:
http://i.stack.imgur.com/AnlMo.png
撕裂效果可能是由于 Xdbe mate 的实现
fedora22 上的 waylang 下无撕裂效果。
Segfault 和 BadDrawable 是由于 OSPwnd:OSPDpyHdl 中的事件处理循环。 直到事件队列为空它才停止,关闭 window 的事件比其他事件先到达,例如鼠标指针进入 window。 然后 OSPDpyHdl 在使用它们检索下一个事件之前删除对象。 这些事件在从 OSPDpyHdl 返回之前也没有得到正确处理。
部分 XPutImage 是因为 用户无法按 [x][y] 顺序访问图像的数据 table 因为图像在内存中是连续的。 所以 win->_data[y] 访问每一行和 win->_data[y][x] 每个像素。
问题是所有图像每秒发送 60 次,阻碍了 X 连接并禁用了服务器反应。