From d57865a032990a43f4f06f003a923e1792df9bb2 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 5 Aug 2021 11:25:32 +0200 Subject: [PATCH] gdi32: Use NtGdiTransformPoints for DPtoLP. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/gdidc.c | 8 ++++++++ dlls/gdi32/mapping.c | 33 ++++++++++++++++++++++++++++----- include/ntgdi.h | 9 ++++++++- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index 45314781b37..79d5133b30c 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -1147,6 +1147,14 @@ INT WINAPI SetMetaRgn( HDC hdc ) return NtGdiSetMetaRgn( hdc ); } +/*********************************************************************** + * DPtoLP (GDI32.@) + */ +BOOL WINAPI DPtoLP( HDC hdc, POINT *points, INT count ) +{ + return NtGdiTransformPoints( hdc, points, points, count, NtGdiDPtoLP ); +} + /*********************************************************************** * GdiSetPixelFormat (GDI32.@) */ diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c index 6eafc4a362c..8ab0b3b3ef3 100644 --- a/dlls/gdi32/mapping.c +++ b/dlls/gdi32/mapping.c @@ -332,16 +332,39 @@ BOOL dp_to_lp( DC *dc, POINT *points, INT count ) } /*********************************************************************** - * DPtoLP (GDI32.@) + * NtGdiTransformPoints (win32u.@) */ -BOOL WINAPI DPtoLP( HDC hdc, POINT *points, INT count ) +BOOL WINAPI NtGdiTransformPoints( HDC hdc, const POINT *points_in, POINT *points_out, + INT count, UINT mode ) { - DC * dc = get_dc_ptr( hdc ); - BOOL ret; + DC *dc = get_dc_ptr( hdc ); + int i = 0; + BOOL ret = FALSE; if (!dc) return FALSE; - ret = dp_to_lp( dc, points, count ); + switch (mode) + { + case NtGdiDPtoLP: + if (!dc->vport2WorldValid) break; + for (i = 0; i < count; i++) + { + double x = points_in[i].x; + double y = points_in[i].y; + points_out[i].x = floor( x * dc->xformVport2World.eM11 + + y * dc->xformVport2World.eM21 + + dc->xformVport2World.eDx + 0.5 ); + points_out[i].y = floor( x * dc->xformVport2World.eM12 + + y * dc->xformVport2World.eM22 + + dc->xformVport2World.eDy + 0.5 ); + } + ret = TRUE; + break; + + default: + WARN( "invalid mode %x\n", mode ); + break; + } release_dc_ptr( dc ); return ret; diff --git a/include/ntgdi.h b/include/ntgdi.h index c2f61fca6df..9be37414dce 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -93,6 +93,12 @@ enum NtGdiPolyPolygonRgn, }; +enum +{ + NtGdiLPtoDP, + NtGdiDPtoLP, +}; + /* structs not compatible with native Windows */ #ifdef __WINESRC__ @@ -251,7 +257,8 @@ INT WINAPI NtGdiStartDoc( HDC hdc, const DOCINFOW *doc ); INT WINAPI NtGdiStartPage( HDC hdc ); BOOL WINAPI NtGdiStrokePath( HDC hdc ); BOOL WINAPI NtGdiStrokeAndFillPath( HDC hdc ); -BOOL WINAPI NtGdiTransformPoints( HDC hdc, POINT *points, INT count, UINT mode ); +BOOL WINAPI NtGdiTransformPoints( HDC hdc, const POINT *points_in, POINT *points_out, + INT count, UINT mode ); BOOL WINAPI NtGdiUnrealizeObject( HGDIOBJ obj ); BOOL WINAPI NtGdiWidenPath( HDC hdc );