From c4895ca1ac1d11b1fd5b690f85a8d449b6d15052 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 7 Aug 2011 14:09:18 -0400 Subject: [PATCH] xfreerdp: improve X11 GDI software rendering performance --- client/X11/xfreerdp.c | 25 +++++++++++-------------- client/X11/xfreerdp.h | 1 + 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c index 1e2f62580..a10d9fb38 100644 --- a/client/X11/xfreerdp.c +++ b/client/X11/xfreerdp.c @@ -66,6 +66,8 @@ void xf_end_paint(rdpUpdate* update) { GDI* gdi; xfInfo* xfi; + sint32 x, y; + uint32 w, h; XImage* image; gdi = GET_GDI(update); @@ -74,22 +76,14 @@ void xf_end_paint(rdpUpdate* update) if (gdi->primary->hdc->hwnd->invalid->null) return; - image = XCreateImage(xfi->display, xfi->visual, xfi->depth, ZPixmap, 0, - (char*) gdi->primary_buffer, gdi->width, gdi->height, xfi->scanline_pad, 0); - - XPutImage(xfi->display, xfi->primary, xfi->gc_default, image, 0, 0, 0, 0, gdi->width, gdi->height); - - XCopyArea(xfi->display, xfi->primary, xfi->window, xfi->gc_default, - gdi->primary->hdc->hwnd->invalid->x, - gdi->primary->hdc->hwnd->invalid->y, - gdi->primary->hdc->hwnd->invalid->w, - gdi->primary->hdc->hwnd->invalid->h, - gdi->primary->hdc->hwnd->invalid->x, - gdi->primary->hdc->hwnd->invalid->y); + x = gdi->primary->hdc->hwnd->invalid->x; + y = gdi->primary->hdc->hwnd->invalid->y; + w = gdi->primary->hdc->hwnd->invalid->w; + h = gdi->primary->hdc->hwnd->invalid->h; + XPutImage(xfi->display, xfi->primary, xfi->gc_default, xfi->image, x, y, x, y, w, h); + XCopyArea(xfi->display, xfi->primary, xfi->window, xfi->gc_default, x, y, w, h, x, y); XFlush(xfi->display); - - XFree(image); } boolean xf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount) @@ -380,6 +374,9 @@ boolean xf_post_connect(freerdp* instance) XFillRectangle(xfi->display, xfi->primary, xfi->gc, 0, 0, xfi->width, xfi->height); xfi->modifier_map = XGetModifierMapping(xfi->display); + xfi->image = XCreateImage(xfi->display, xfi->visual, xfi->depth, ZPixmap, 0, + (char*) gdi->primary_buffer, gdi->width, gdi->height, xfi->scanline_pad, 0); + instance->update->BeginPaint = xf_begin_paint; instance->update->EndPaint = xf_end_paint; diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index e815a9f44..b5ac4ffd4 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -41,6 +41,7 @@ struct xf_info int height; Window window; Screen* screen; + XImage* image; Pixmap primary; Drawable drawing; Visual* visual;