winex11: Directly use win32u for GDI functions in window.c.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Huw Davies <huw@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2022-04-12 13:09:33 +02:00 committed by Alexandre Julliard
parent c3ed3403ba
commit df4ddc30b3
1 changed files with 59 additions and 52 deletions

View File

@ -402,10 +402,10 @@ static void sync_window_region( struct x11drv_win_data *data, HRGN win_region )
if (hrgn == (HRGN)1) /* hack: win_region == 1 means retrieve region from server */ if (hrgn == (HRGN)1) /* hack: win_region == 1 means retrieve region from server */
{ {
if (!(hrgn = CreateRectRgn( 0, 0, 0, 0 ))) return; if (!(hrgn = NtGdiCreateRectRgn( 0, 0, 0, 0 ))) return;
if (GetWindowRgn( data->hwnd, hrgn ) == ERROR) if (GetWindowRgn( data->hwnd, hrgn ) == ERROR)
{ {
DeleteObject( hrgn ); NtGdiDeleteObjectApp( hrgn );
hrgn = 0; hrgn = 0;
} }
} }
@ -430,7 +430,7 @@ static void sync_window_region( struct x11drv_win_data *data, HRGN win_region )
data->shaped = TRUE; data->shaped = TRUE;
} }
} }
if (hrgn && hrgn != win_region) DeleteObject( hrgn ); if (hrgn && hrgn != win_region) NtGdiDeleteObjectApp( hrgn );
#endif /* HAVE_LIBXSHAPE */ #endif /* HAVE_LIBXSHAPE */
} }
@ -509,7 +509,7 @@ static unsigned long *get_bitmap_argb( HDC hdc, HBITMAP color, HBITMAP mask, uns
int i, j; int i, j;
BOOL has_alpha = FALSE; BOOL has_alpha = FALSE;
if (!GetObjectW( color, sizeof(bm), &bm )) return NULL; if (!NtGdiExtGetObjectW( color, sizeof(bm), &bm )) return NULL;
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info->bmiHeader.biWidth = bm.bmWidth; info->bmiHeader.biWidth = bm.bmWidth;
info->bmiHeader.biHeight = -bm.bmHeight; info->bmiHeader.biHeight = -bm.bmHeight;
@ -523,7 +523,8 @@ static unsigned long *get_bitmap_argb( HDC hdc, HBITMAP color, HBITMAP mask, uns
info->bmiHeader.biClrImportant = 0; info->bmiHeader.biClrImportant = 0;
*size = bm.bmWidth * bm.bmHeight + 2; *size = bm.bmWidth * bm.bmHeight + 2;
if (!(bits = HeapAlloc( GetProcessHeap(), 0, *size * sizeof(long) ))) goto failed; if (!(bits = HeapAlloc( GetProcessHeap(), 0, *size * sizeof(long) ))) goto failed;
if (!GetDIBits( hdc, color, 0, bm.bmHeight, bits + 2, info, DIB_RGB_COLORS )) goto failed; if (!NtGdiGetDIBitsInternal( hdc, color, 0, bm.bmHeight, bits + 2, info, DIB_RGB_COLORS, 0, 0 ))
goto failed;
bits[0] = bm.bmWidth; bits[0] = bm.bmWidth;
bits[1] = bm.bmHeight; bits[1] = bm.bmHeight;
@ -538,7 +539,8 @@ static unsigned long *get_bitmap_argb( HDC hdc, HBITMAP color, HBITMAP mask, uns
info->bmiHeader.biBitCount = 1; info->bmiHeader.biBitCount = 1;
info->bmiHeader.biSizeImage = width_bytes * bm.bmHeight; info->bmiHeader.biSizeImage = width_bytes * bm.bmHeight;
if (!(mask_bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed; if (!(mask_bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed;
if (!GetDIBits( hdc, mask, 0, bm.bmHeight, mask_bits, info, DIB_RGB_COLORS )) goto failed; if (!NtGdiGetDIBitsInternal( hdc, mask, 0, bm.bmHeight, mask_bits, info, DIB_RGB_COLORS, 0, 0 ))
goto failed;
ptr = bits + 2; ptr = bits + 2;
for (i = 0; i < bm.bmHeight; i++) for (i = 0; i < bm.bmHeight; i++)
for (j = 0; j < bm.bmWidth; j++, ptr++) for (j = 0; j < bm.bmWidth; j++, ptr++)
@ -578,9 +580,11 @@ static BOOL create_icon_pixmaps( HDC hdc, const ICONINFO *icon, Pixmap *icon_ret
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info->bmiHeader.biBitCount = 0; info->bmiHeader.biBitCount = 0;
if (!(lines = GetDIBits( hdc, icon->hbmColor, 0, 0, NULL, info, DIB_RGB_COLORS ))) goto failed; if (!(lines = NtGdiGetDIBitsInternal( hdc, icon->hbmColor, 0, 0, NULL, info, DIB_RGB_COLORS, 0, 0 )))
goto failed;
if (!(bits.ptr = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed; if (!(bits.ptr = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed;
if (!GetDIBits( hdc, icon->hbmColor, 0, lines, bits.ptr, info, DIB_RGB_COLORS )) goto failed; if (!NtGdiGetDIBitsInternal( hdc, icon->hbmColor, 0, lines, bits.ptr, info, DIB_RGB_COLORS, 0, 0 ))
goto failed;
color_pixmap = create_pixmap_from_image( hdc, &vis, info, &bits, DIB_RGB_COLORS ); color_pixmap = create_pixmap_from_image( hdc, &vis, info, &bits, DIB_RGB_COLORS );
HeapFree( GetProcessHeap(), 0, bits.ptr ); HeapFree( GetProcessHeap(), 0, bits.ptr );
@ -589,9 +593,11 @@ static BOOL create_icon_pixmaps( HDC hdc, const ICONINFO *icon, Pixmap *icon_ret
info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info->bmiHeader.biBitCount = 0; info->bmiHeader.biBitCount = 0;
if (!(lines = GetDIBits( hdc, icon->hbmMask, 0, 0, NULL, info, DIB_RGB_COLORS ))) goto failed; if (!(lines = NtGdiGetDIBitsInternal( hdc, icon->hbmMask, 0, 0, NULL, info, DIB_RGB_COLORS, 0, 0 )))
goto failed;
if (!(bits.ptr = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed; if (!(bits.ptr = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto failed;
if (!GetDIBits( hdc, icon->hbmMask, 0, lines, bits.ptr, info, DIB_RGB_COLORS )) goto failed; if (!NtGdiGetDIBitsInternal( hdc, icon->hbmMask, 0, lines, bits.ptr, info, DIB_RGB_COLORS, 0, 0 ))
goto failed;
/* invert the mask */ /* invert the mask */
for (i = 0; i < info->bmiHeader.biSizeImage / sizeof(DWORD); i++) ((DWORD *)bits.ptr)[i] ^= ~0u; for (i = 0; i < info->bmiHeader.biSizeImage / sizeof(DWORD); i++) ((DWORD *)bits.ptr)[i] ^= ~0u;
@ -639,7 +645,7 @@ static void fetch_icon_data( HWND hwnd, HICON icon_big, HICON icon_small )
if (!GetIconInfo(icon_big, &ii)) return; if (!GetIconInfo(icon_big, &ii)) return;
hDC = CreateCompatibleDC(0); hDC = NtGdiCreateCompatibleDC(0);
bits = get_bitmap_argb( hDC, ii.hbmColor, ii.hbmMask, &size ); bits = get_bitmap_argb( hDC, ii.hbmColor, ii.hbmMask, &size );
if (bits && GetIconInfo( icon_small, &ii_small )) if (bits && GetIconInfo( icon_small, &ii_small ))
{ {
@ -658,15 +664,15 @@ static void fetch_icon_data( HWND hwnd, HICON icon_big, HICON icon_small )
} }
} }
HeapFree( GetProcessHeap(), 0, bits_small ); HeapFree( GetProcessHeap(), 0, bits_small );
DeleteObject( ii_small.hbmColor ); NtGdiDeleteObjectApp( ii_small.hbmColor );
DeleteObject( ii_small.hbmMask ); NtGdiDeleteObjectApp( ii_small.hbmMask );
} }
if (!create_icon_pixmaps( hDC, &ii, &icon_pixmap, &mask_pixmap )) icon_pixmap = mask_pixmap = 0; if (!create_icon_pixmaps( hDC, &ii, &icon_pixmap, &mask_pixmap )) icon_pixmap = mask_pixmap = 0;
DeleteObject( ii.hbmColor ); NtGdiDeleteObjectApp( ii.hbmColor );
DeleteObject( ii.hbmMask ); NtGdiDeleteObjectApp( ii.hbmMask );
DeleteDC(hDC); NtGdiDeleteObjectApp( hDC );
if ((data = get_win_data( hwnd ))) if ((data = get_win_data( hwnd )))
{ {
@ -1401,9 +1407,9 @@ static void move_window_bits( HWND hwnd, Window window, const RECT *old_rect, co
hdc_src = hdc_dst = GetDCEx( hwnd, 0, DCX_CACHE ); hdc_src = hdc_dst = GetDCEx( hwnd, 0, DCX_CACHE );
} }
rgn = CreateRectRgnIndirect( &dst_rect ); rgn = NtGdiCreateRectRgn( dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom );
SelectClipRgn( hdc_dst, rgn ); NtGdiExtSelectClipRgn( hdc_dst, rgn, RGN_COPY );
DeleteObject( rgn ); NtGdiDeleteObjectApp( rgn );
/* WS_CLIPCHILDREN doesn't exclude children from the window update /* WS_CLIPCHILDREN doesn't exclude children from the window update
* region, and ExcludeUpdateRgn call may inappropriately clip valid * region, and ExcludeUpdateRgn call may inappropriately clip valid
* child window contents from the copied parent window bits, but we * child window contents from the copied parent window bits, but we
@ -1413,17 +1419,17 @@ static void move_window_bits( HWND hwnd, Window window, const RECT *old_rect, co
ExcludeUpdateRgn( hdc_dst, hwnd ); ExcludeUpdateRgn( hdc_dst, hwnd );
code = X11DRV_START_EXPOSURES; code = X11DRV_START_EXPOSURES;
ExtEscape( hdc_dst, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL ); NtGdiExtEscape( hdc_dst, NULL, 0, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
TRACE( "copying bits for win %p/%lx %s -> %s\n", TRACE( "copying bits for win %p/%lx %s -> %s\n",
hwnd, window, wine_dbgstr_rect(&src_rect), wine_dbgstr_rect(&dst_rect) ); hwnd, window, wine_dbgstr_rect(&src_rect), wine_dbgstr_rect(&dst_rect) );
BitBlt( hdc_dst, dst_rect.left, dst_rect.top, NtGdiBitBlt( hdc_dst, dst_rect.left, dst_rect.top,
dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top, dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top,
hdc_src, src_rect.left, src_rect.top, SRCCOPY ); hdc_src, src_rect.left, src_rect.top, SRCCOPY, 0, 0 );
rgn = 0; rgn = 0;
code = X11DRV_END_EXPOSURES; code = X11DRV_END_EXPOSURES;
ExtEscape( hdc_dst, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, sizeof(rgn), (LPSTR)&rgn ); NtGdiExtEscape( hdc_dst, NULL, 0, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, sizeof(rgn), (LPSTR)&rgn );
ReleaseDC( hwnd, hdc_dst ); ReleaseDC( hwnd, hdc_dst );
if (hdc_src != hdc_dst) ReleaseDC( parent, hdc_src ); if (hdc_src != hdc_dst) ReleaseDC( parent, hdc_src );
@ -1433,13 +1439,13 @@ static void move_window_bits( HWND hwnd, Window window, const RECT *old_rect, co
if (!window) if (!window)
{ {
/* map region to client rect since we are using DCX_WINDOW */ /* map region to client rect since we are using DCX_WINDOW */
OffsetRgn( rgn, new_window_rect->left - new_client_rect->left, NtGdiOffsetRgn( rgn, new_window_rect->left - new_client_rect->left,
new_window_rect->top - new_client_rect->top ); new_window_rect->top - new_client_rect->top );
RedrawWindow( hwnd, NULL, rgn, RedrawWindow( hwnd, NULL, rgn,
RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ALLCHILDREN ); RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ALLCHILDREN );
} }
else RedrawWindow( hwnd, NULL, rgn, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN ); else RedrawWindow( hwnd, NULL, rgn, RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN );
DeleteObject( rgn ); NtGdiDeleteObjectApp( rgn );
} }
} }
@ -1571,9 +1577,9 @@ static void create_whole_window( struct x11drv_win_data *data )
data->managed = TRUE; data->managed = TRUE;
} }
if ((win_rgn = CreateRectRgn( 0, 0, 0, 0 )) && GetWindowRgn( data->hwnd, win_rgn ) == ERROR) if ((win_rgn = NtGdiCreateRectRgn( 0, 0, 0, 0 )) && GetWindowRgn( data->hwnd, win_rgn ) == ERROR)
{ {
DeleteObject( win_rgn ); NtGdiDeleteObjectApp( win_rgn );
win_rgn = 0; win_rgn = 0;
} }
data->shaped = (win_rgn != 0); data->shaped = (win_rgn != 0);
@ -1616,7 +1622,7 @@ static void create_whole_window( struct x11drv_win_data *data )
sync_window_cursor( data->whole_window ); sync_window_cursor( data->whole_window );
done: done:
if (win_rgn) DeleteObject( win_rgn ); if (win_rgn) NtGdiDeleteObjectApp( win_rgn );
} }
@ -2185,7 +2191,7 @@ void X11DRV_GetDC( HDC hdc, HWND hwnd, HWND top, const RECT *win_rect,
else escape.drawable = X11DRV_get_whole_window( top ); else escape.drawable = X11DRV_get_whole_window( top );
} }
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
} }
@ -2201,7 +2207,7 @@ void X11DRV_ReleaseDC( HWND hwnd, HDC hdc )
escape.mode = IncludeInferiors; escape.mode = IncludeInferiors;
escape.dc_rect = get_virtual_screen_rect(); escape.dc_rect = get_virtual_screen_rect();
OffsetRect( &escape.dc_rect, -2 * escape.dc_rect.left, -2 * escape.dc_rect.top ); OffsetRect( &escape.dc_rect, -2 * escape.dc_rect.left, -2 * escape.dc_rect.top );
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL ); NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(escape), (LPSTR)&escape, 0, NULL );
} }
@ -2214,27 +2220,27 @@ BOOL X11DRV_ScrollDC( HDC hdc, INT dx, INT dy, HRGN update )
BOOL ret; BOOL ret;
HRGN expose_rgn = 0; HRGN expose_rgn = 0;
GetClipBox( hdc, &rect ); NtGdiGetAppClipBox( hdc, &rect );
if (update) if (update)
{ {
INT code = X11DRV_START_EXPOSURES; INT code = X11DRV_START_EXPOSURES;
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL ); NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, 0, NULL );
ret = BitBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, ret = NtGdiBitBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
hdc, rect.left - dx, rect.top - dy, SRCCOPY ); hdc, rect.left - dx, rect.top - dy, SRCCOPY, 0, 0 );
code = X11DRV_END_EXPOSURES; code = X11DRV_END_EXPOSURES;
ExtEscape( hdc, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code, NtGdiExtEscape( hdc, NULL, 0, X11DRV_ESCAPE, sizeof(code), (LPSTR)&code,
sizeof(expose_rgn), (LPSTR)&expose_rgn ); sizeof(expose_rgn), (LPSTR)&expose_rgn );
if (expose_rgn) if (expose_rgn)
{ {
CombineRgn( update, update, expose_rgn, RGN_OR ); NtGdiCombineRgn( update, update, expose_rgn, RGN_OR );
DeleteObject( expose_rgn ); NtGdiDeleteObjectApp( expose_rgn );
} }
} }
else ret = BitBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, else ret = NtGdiBitBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
hdc, rect.left - dx, rect.top - dy, SRCCOPY ); hdc, rect.left - dx, rect.top - dy, SRCCOPY, 0, 0 );
return ret; return ret;
} }
@ -2758,10 +2764,11 @@ BOOL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info,
dst_bits = surface->funcs->get_info( surface, bmi ); dst_bits = surface->funcs->get_info( surface, bmi );
if (!(dib = CreateDIBSection( info->hdcDst, bmi, DIB_RGB_COLORS, &src_bits, NULL, 0 ))) goto done; if (!(dib = NtGdiCreateDIBSection( info->hdcDst, NULL, 0, bmi, DIB_RGB_COLORS, 0, 0, 0, &src_bits )))
if (!(hdc = CreateCompatibleDC( 0 ))) goto done; goto done;
if (!(hdc = NtGdiCreateCompatibleDC( 0 ))) goto done;
SelectObject( hdc, dib ); NtGdiSelectBitmap( hdc, dib );
surface->funcs->lock( surface ); surface->funcs->lock( surface );
@ -2769,16 +2776,16 @@ BOOL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info,
{ {
IntersectRect( &rect, &rect, info->prcDirty ); IntersectRect( &rect, &rect, info->prcDirty );
memcpy( src_bits, dst_bits, bmi->bmiHeader.biSizeImage ); memcpy( src_bits, dst_bits, bmi->bmiHeader.biSizeImage );
PatBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, BLACKNESS ); NtGdiPatBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, BLACKNESS );
} }
src_rect = rect; src_rect = rect;
if (info->pptSrc) OffsetRect( &src_rect, info->pptSrc->x, info->pptSrc->y ); if (info->pptSrc) OffsetRect( &src_rect, info->pptSrc->x, info->pptSrc->y );
DPtoLP( info->hdcSrc, (POINT *)&src_rect, 2 ); NtGdiTransformPoints( info->hdcSrc, (POINT *)&src_rect, (POINT *)&src_rect, 2, NtGdiDPtoLP );
ret = GdiAlphaBlend( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, ret = NtGdiAlphaBlend( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
info->hdcSrc, src_rect.left, src_rect.top, info->hdcSrc, src_rect.left, src_rect.top,
src_rect.right - src_rect.left, src_rect.bottom - src_rect.top, src_rect.right - src_rect.left, src_rect.bottom - src_rect.top,
(info->dwFlags & ULW_ALPHA) ? *info->pblend : blend ); (info->dwFlags & ULW_ALPHA) ? *info->pblend : blend, 0 );
if (ret) if (ret)
{ {
memcpy( dst_bits, src_bits, bmi->bmiHeader.biSizeImage ); memcpy( dst_bits, src_bits, bmi->bmiHeader.biSizeImage );
@ -2790,8 +2797,8 @@ BOOL X11DRV_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info,
done: done:
window_surface_release( surface ); window_surface_release( surface );
if (hdc) DeleteDC( hdc ); if (hdc) NtGdiDeleteObjectApp( hdc );
if (dib) DeleteObject( dib ); if (dib) NtGdiDeleteObjectApp( dib );
return ret; return ret;
} }