winex11: Hold a reference to the surface in UpdateLayeredWindow.

oldstable
Alexandre Julliard 2012-10-04 10:34:41 +02:00
parent e41a482890
commit 2500e21a90
1 changed files with 8 additions and 2 deletions

View File

@ -2386,11 +2386,15 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
}
else set_surface_color_key( surface, color_key );
if (surface) window_surface_add_ref( surface );
release_win_data( data );
if (!surface) return FALSE;
if (!info->hdcSrc) return TRUE;
if (info->prcDirty && !IntersectRect( &rect, &rect, info->prcDirty )) return TRUE;
if (!info->hdcSrc)
{
window_surface_release( surface );
return TRUE;
}
dst_bits = surface->funcs->get_info( surface, bmi );
@ -2403,6 +2407,7 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
if (info->prcDirty)
{
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 );
}
@ -2422,6 +2427,7 @@ BOOL CDECL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO
surface->funcs->flush( surface );
done:
window_surface_release( surface );
if (hdc) DeleteDC( hdc );
if (dib) DeleteObject( dib );
return ret;