Xephyr: Fix broken image when endianess of client machine and host-Xserver differ

The image is created in the native byte order of the machine Xephyr is
rendered on however drawn in the image byte order of the Xephyr server.
Correct byte order in the xcb_image_t structure and convert to native
before updating the window.
If depths of Xephyr and host server differ this is already taken care of
by the depth conversion routine.
It is a terrible wase to always convert and transmit the entire image
no matter of the size of the damaged area. One should probably use
sub-images here. For now we leave this as an exercise.

Signed-off-by: Egbert Eich <eich@freedesktop.org>
Reviewed-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Egbert Eich 2015-05-12 09:52:48 -07:00 committed by Keith Packard
parent c65eda5e66
commit 910ddf8521

View File

@ -866,6 +866,11 @@ hostx_screen_init(KdScreenInfo *screen,
~0,
NULL);
/* Match server byte order so that the image can be converted to
* the native byte order by xcb_image_put() before drawing */
if (host_depth_matches_server(scrpriv))
scrpriv->ximg->byte_order = IMAGE_BYTE_ORDER;
scrpriv->ximg->data =
xallocarray(scrpriv->ximg->stride, buffer_height);
}
@ -1034,8 +1039,11 @@ hostx_paint_rect(KdScreenInfo *screen,
sx, sy, dx, dy, width, height, FALSE);
}
else {
xcb_image_put(HostX.conn, scrpriv->win, HostX.gc, scrpriv->ximg,
0, 0, 0);
/* This is slow and could be done better */
xcb_image_t *img = xcb_image_native (HostX.conn, scrpriv->ximg, 1);
xcb_image_put(HostX.conn, scrpriv->win, HostX.gc, img, 0, 0, 0);
if (scrpriv->ximg != img)
xcb_image_destroy(img);
}
xcb_aux_sync(HostX.conn);