From ae27ea7329561c939058579f45154e7905042478 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Tue, 24 Jan 2017 12:37:46 +0100 Subject: winex11: Fix alpha blending in X11DRV_UpdateLayeredWindow. Based on a patch by Dmitry Timoshkov. --- dlls/winex11.drv/window.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index eaf6dcfa3ed..5dec74acae7 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -410,14 +410,11 @@ static void sync_window_region( struct x11drv_win_data *data, HRGN win_region ) /*********************************************************************** - * sync_window_opacity + * set_window_opacity */ -static void sync_window_opacity( Display *display, Window win, - COLORREF key, BYTE alpha, DWORD flags ) +static void set_window_opacity( Display *display, Window win, BYTE alpha ) { - unsigned long opacity = 0xffffffff; - - if (flags & LWA_ALPHA) opacity = (0xffffffff / 0xff) * alpha; + unsigned long opacity = (0xffffffff / 0xff) * alpha; if (opacity == 0xffffffff) XDeleteProperty( display, win, x11drv_atom(_NET_WM_WINDOW_OPACITY) ); @@ -1527,7 +1524,7 @@ static void create_whole_window( struct x11drv_win_data *data ) /* set the window opacity */ if (!GetLayeredWindowAttributes( data->hwnd, &key, &alpha, &layered_flags )) layered_flags = 0; - sync_window_opacity( data->display, data->whole_window, key, alpha, layered_flags ); + set_window_opacity( data->display, data->whole_window, (layered_flags & LWA_ALPHA) ? alpha : 0xff ); XFlush( data->display ); /* make sure the window exists before we start painting to it */ @@ -1647,7 +1644,7 @@ void CDECL X11DRV_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ) { data->layered = FALSE; set_window_visual( data, &default_visual ); - sync_window_opacity( data->display, data->whole_window, 0, 0, 0 ); + set_window_opacity( data->display, data->whole_window, 0xff ); if (data->surface) set_surface_color_key( data->surface, CLR_INVALID ); } done: @@ -2538,7 +2535,7 @@ void CDECL X11DRV_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alph set_window_visual( data, &default_visual ); if (data->whole_window) - sync_window_opacity( data->display, data->whole_window, key, alpha, flags ); + set_window_opacity( data->display, data->whole_window, (flags & LWA_ALPHA) ? alpha : 0xff ); if (data->surface) set_surface_color_key( data->surface, (flags & LWA_COLORKEY) ? key : CLR_INVALID ); @@ -2562,7 +2559,7 @@ void CDECL X11DRV_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alph Window win = X11DRV_get_whole_window( hwnd ); if (win) { - sync_window_opacity( gdi_display, win, key, alpha, flags ); + set_window_opacity( gdi_display, win, (flags & LWA_ALPHA) ? alpha : 0xff ); if (flags & LWA_COLORKEY) FIXME( "LWA_COLORKEY not supported on foreign process window %p\n", hwnd ); } @@ -2578,7 +2575,6 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO { struct window_surface *surface; struct x11drv_win_data *data; - BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, 0 }; COLORREF color_key = (info->dwFlags & ULW_COLORKEY) ? info->crKey : CLR_INVALID; char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; BITMAPINFO *bmi = (BITMAPINFO *)buffer; @@ -2606,6 +2602,10 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO } else set_surface_color_key( surface, color_key ); + if (data->whole_window) + set_window_opacity( data->display, data->whole_window, + (info->dwFlags & ULW_ALPHA) ? info->pblend->SourceConstantAlpha : 0xff ); + if (surface) window_surface_add_ref( surface ); release_win_data( data ); @@ -2629,16 +2629,15 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO { IntersectRect( &rect, &rect, info->prcDirty ); memcpy( src_bits, dst_bits, bmi->bmiHeader.biSizeImage ); - PatBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, BLACKNESS ); } src_rect = rect; if (info->pptSrc) OffsetRect( &src_rect, info->pptSrc->x, info->pptSrc->y ); DPtoLP( info->hdcSrc, (POINT *)&src_rect, 2 ); - ret = GdiAlphaBlend( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, - info->hdcSrc, src_rect.left, src_rect.top, - src_rect.right - src_rect.left, src_rect.bottom - src_rect.top, - (info->dwFlags & ULW_ALPHA) ? *info->pblend : blend ); + ret = StretchBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, + info->hdcSrc, src_rect.left, src_rect.top, + src_rect.right - src_rect.left, src_rect.bottom - src_rect.top, + SRCCOPY ); if (ret) { memcpy( dst_bits, src_bits, bmi->bmiHeader.biSizeImage ); -- 2.13.1