From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/clipping.c | 15 ++++++++++++++- dlls/winex11.drv/init.c | 25 +------------------------ include/ntgdi.h | 2 ++ 3 files changed, 17 insertions(+), 25 deletions(-)
diff --git a/dlls/win32u/clipping.c b/dlls/win32u/clipping.c index 11027824362..3681b542fc3 100644 --- a/dlls/win32u/clipping.c +++ b/dlls/win32u/clipping.c @@ -417,7 +417,7 @@ INT WINAPI NtGdiGetRandomRgn( HDC hDC, HRGN hRgn, INT iCode )
if (!dc) return -1;
- switch (iCode & ~NTGDI_RGN_MIRROR_RTL) + switch (iCode & ~(NTGDI_RGN_MIRROR_RTL | NTGDI_RGN_MONITOR_DPI)) { case 1: if (!dc->hClipRgn) ret = 0; @@ -459,6 +459,19 @@ INT WINAPI NtGdiGetRandomRgn( HDC hDC, HRGN hRgn, INT iCode ) mirror_region( hRgn, hRgn, dc->attr->vis_rect.right - dc->attr->vis_rect.left );
release_dc_ptr( dc ); + + if (ret > 0 && (iCode & NTGDI_RGN_MONITOR_DPI)) + { + HWND hwnd = NtUserWindowFromDC( hDC ); + UINT raw_dpi, monitor_dpi = get_win_monitor_dpi( hwnd, &raw_dpi ); + HRGN region; + + NtGdiOffsetRgn( hRgn, -dc->attr->vis_rect.left, -dc->attr->vis_rect.top ); + region = map_dpi_region( hRgn, get_dpi_for_window( hwnd ), monitor_dpi ); + NtGdiCombineRgn( hRgn, region, 0, RGN_COPY ); + NtGdiDeleteObjectApp( region ); + } + return ret; }
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 63b47e3769a..7963d9cbbc0 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -225,33 +225,10 @@ Drawable get_dc_drawable( HDC hdc, RECT *rect )
HRGN get_dc_monitor_region( HWND hwnd, HDC hdc ) { - RGNDATA *data; - UINT i, size; HRGN region; - POINT pt;
if (!(region = NtGdiCreateRectRgn( 0, 0, 0, 0 ))) return 0; - if (NtGdiGetRandomRgn( hdc, region, SYSRGN ) <= 0) goto failed; - if (!(size = NtGdiGetRegionData( region, 0, NULL ))) goto failed; - if (!(data = malloc( size ))) goto failed; - NtGdiGetRegionData( region, size, data ); - NtGdiDeleteObjectApp( region ); - - NtGdiGetDCPoint( hdc, NtGdiGetDCOrg, &pt ); - NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, &pt ); - for (i = 0; i < data->rdh.nCount; i++) - { - RECT *rect = (RECT *)data->Buffer + i; - NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, (POINT *)&rect->left ); - NtUserLogicalToPerMonitorDPIPhysicalPoint( hwnd, (POINT *)&rect->right ); - OffsetRect( rect, -pt.x, -pt.y ); - } - - region = NtGdiExtCreateRegion( NULL, size, data ); - free( data ); - return region; - -failed: + if (NtGdiGetRandomRgn( hdc, region, SYSRGN | NTGDI_RGN_MONITOR_DPI ) > 0) return region; NtGdiDeleteObjectApp( region ); return 0; } diff --git a/include/ntgdi.h b/include/ntgdi.h index 224d13c377e..2f7b284a679 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -218,6 +218,8 @@ struct font_enum_entry
/* flag for NtGdiGetRandomRgn to respect LAYOUT_RTL */ #define NTGDI_RGN_MIRROR_RTL 0x80000000 +/* internal flag to get region in monitor raw DPI */ +#define NTGDI_RGN_MONITOR_DPI 0x40000000
#endif /* __WINESRC__ */