From: Paul Gofman pgofman@codeweavers.com
--- dlls/winex11.drv/opengl.c | 1 + dlls/winex11.drv/window.c | 2 ++ dlls/winex11.drv/x11drv.h | 1 + dlls/winex11.drv/xrender.c | 20 +++++++++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index 74f78482b41..78b00677099 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -2310,6 +2310,7 @@ static HDC X11DRV_wglGetPbufferDCARB( struct wgl_pbuffer *object ) escape.drawable = object->gl->drawable; escape.mode = IncludeInferiors; SetRect( &escape.dc_rect, 0, 0, object->width, object->height ); + escape.visual = default_visual; NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
TRACE( "(%p)->(%p)\n", object, hdc ); diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 470f202a84f..b033960fc26 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2709,6 +2709,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, if ((data = get_win_data( top ))) { escape.drawable = data->whole_window; + escape.visual = data->vis; /* special case: when repainting the root window, clip out top-level windows */ if (top == hwnd && data->whole_window == root_window) escape.mode = ClipByChildren; release_win_data( data ); @@ -2716,6 +2717,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect, else { escape.drawable = X11DRV_get_whole_window( top ); + escape.visual = default_visual; /* FIXME: use the right visual for other process window */ }
if (!escape.drawable) return; /* don't create a GC for foreign windows */ diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index ee5bbe07dd4..8e383ae4c48 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -344,6 +344,7 @@ struct x11drv_escape_set_drawable Drawable drawable; /* X drawable */ int mode; /* ClipByChildren or IncludeInferiors */ RECT dc_rect; /* DC rectangle relative to drawable */ + XVisualInfo visual; /* X visual used by drawable, may be unspecified if no change is needed */ };
struct x11drv_escape_get_drawable diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c index 48e2fea4280..66c3a337263 100644 --- a/dlls/winex11.drv/xrender.c +++ b/dlls/winex11.drv/xrender.c @@ -256,6 +256,7 @@ static BOOL is_wxrformat_compatible_with_visual( const WineXRenderFormatTemplate if ((fmt->redMask << fmt->red) != visual->red_mask) return FALSE; if ((fmt->greenMask << fmt->green) != visual->green_mask) return FALSE; if ((fmt->blueMask << fmt->blue) != visual->blue_mask) return FALSE; + if (fmt->alphaMask && visual->class != TrueColor) return FALSE; return TRUE; }
@@ -983,8 +984,25 @@ static INT xrenderdrv_ExtEscape( PHYSDEV dev, INT escape, INT in_count, LPCVOID BOOL ret = dev->funcs->pExtEscape( dev, escape, in_count, in_data, out_count, out_data ); if (ret) { + const struct x11drv_escape_set_drawable *set = in_data; + enum wxr_format format = physdev->format; + unsigned int i; + + if (set->visual.visual) + { + for (i = 0; i < WXR_NB_FORMATS; ++i) + { + if (!pict_formats[i]) continue; + if (is_wxrformat_compatible_with_visual( &wxr_formats_template[i], &set->visual )) + { + format = i; + break; + } + } + if (i == WXR_NB_FORMATS) WARN( "Format not found for drawable visual.\n" ); + } free_xrender_picture( physdev ); - set_physdev_format( physdev, default_format ); + set_physdev_format( physdev, format ); } return ret; }