Module: wine Branch: master Commit: 9ca7966aed4318599cd600564382d7b43b616289 URL: https://source.winehq.org/git/wine.git/?a=commit;h=9ca7966aed4318599cd600564...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Sep 24 12:56:00 2021 +0200
gdi32: Don't use MulDiv in ntgdi functions.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/clipping.c | 4 ++-- dlls/gdi32/driver.c | 4 ++-- dlls/gdi32/font.c | 4 ++-- dlls/gdi32/gdiobj.c | 2 +- dlls/gdi32/mapping.c | 36 ++++++++++++++++++++++++++++++------ dlls/gdi32/ntgdi_private.h | 1 + 6 files changed, 38 insertions(+), 13 deletions(-)
diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c index 4fefa834b58..115de908cf6 100644 --- a/dlls/gdi32/clipping.c +++ b/dlls/gdi32/clipping.c @@ -237,8 +237,8 @@ INT WINAPI NtGdiOffsetClipRgn( HDC hdc, INT x, INT y )
if (dc->hClipRgn) { - x = MulDiv( x, dc->attr->vport_ext.cx, dc->attr->wnd_ext.cx ); - y = MulDiv( y, dc->attr->vport_ext.cy, dc->attr->wnd_ext.cy ); + x = muldiv( x, dc->attr->vport_ext.cx, dc->attr->wnd_ext.cx ); + y = muldiv( y, dc->attr->vport_ext.cy, dc->attr->wnd_ext.cy ); if (dc->attr->layout & LAYOUT_RTL) x = -x; ret = NtGdiOffsetRgn( dc->hClipRgn, x, y ); update_dc_clipping( dc ); diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c index 09e369bf27f..712dce06af6 100644 --- a/dlls/gdi32/driver.c +++ b/dlls/gdi32/driver.c @@ -382,9 +382,9 @@ static INT CDECL nulldrv_GetDeviceCaps( PHYSDEV dev, INT cap ) { case DRIVERVERSION: return 0x4000; case TECHNOLOGY: return DT_RASDISPLAY; - case HORZSIZE: return MulDiv( NtGdiGetDeviceCaps( dev->hdc, HORZRES ), 254, + case HORZSIZE: return muldiv( NtGdiGetDeviceCaps( dev->hdc, HORZRES ), 254, NtGdiGetDeviceCaps( dev->hdc, LOGPIXELSX ) * 10 ); - case VERTSIZE: return MulDiv( NtGdiGetDeviceCaps( dev->hdc, VERTRES ), 254, + case VERTSIZE: return muldiv( NtGdiGetDeviceCaps( dev->hdc, VERTRES ), 254, NtGdiGetDeviceCaps( dev->hdc, LOGPIXELSY ) * 10 ); case HORZRES: { diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index 6011f258499..805fbe7abcc 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -2874,9 +2874,9 @@ static BOOL get_face_enum_data( struct gdi_font_face *face, ENUMLOGFONTEXW *elf, UINT cell_height;
#define TM font->otm.otmTextMetrics -#define SCALE_NTM(value) (MulDiv( ntm->ntmTm.tmHeight, (value), TM.tmHeight )) +#define SCALE_NTM(value) (muldiv( ntm->ntmTm.tmHeight, (value), TM.tmHeight )) cell_height = TM.tmHeight / ( -lf.lfHeight / font->otm.otmEMSquare ); - ntm->ntmTm.tmHeight = MulDiv( ntm_ppem, cell_height, font->otm.otmEMSquare ); + ntm->ntmTm.tmHeight = muldiv( ntm_ppem, cell_height, font->otm.otmEMSquare ); ntm->ntmTm.tmAscent = SCALE_NTM( TM.tmAscent ); ntm->ntmTm.tmDescent = ntm->ntmTm.tmHeight - ntm->ntmTm.tmAscent; ntm->ntmTm.tmInternalLeading = SCALE_NTM( TM.tmInternalLeading ); diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c index 2a245b4596f..cf8fbb8ebb4 100644 --- a/dlls/gdi32/gdiobj.c +++ b/dlls/gdi32/gdiobj.c @@ -592,7 +592,7 @@ static HFONT create_scaled_font( const LOGFONTW *deffont ) }
lf = *deffont; - lf.lfHeight = MulDiv( lf.lfHeight, dpi, 96 ); + lf.lfHeight = muldiv( lf.lfHeight, dpi, 96 ); return create_font( &lf ); }
diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c index c9a20602e13..6156a64a825 100644 --- a/dlls/gdi32/mapping.c +++ b/dlls/gdi32/mapping.c @@ -29,6 +29,30 @@ WINE_DEFAULT_DEBUG_CHANNEL(dc);
+/* copied from kernelbase */ +int muldiv( int a, int b, int c ) +{ + LONGLONG ret; + + if (!c) return -1; + + /* We want to deal with a positive divisor to simplify the logic. */ + if (c < 0) + { + a = -a; + c = -c; + } + + /* If the result is positive, we "add" to round. else, we subtract to round. */ + if ((a < 0 && b < 0) || (a >= 0 && b >= 0)) + ret = (((LONGLONG)a * b) + (c / 2)) / c; + else + ret = (((LONGLONG)a * b) - (c / 2)) / c; + + if (ret > 2147483647 || ret < -2147483647) return -1; + return ret; +} + static SIZE get_dc_virtual_size( DC *dc ) { SIZE ret = dc->attr->virtual_size; @@ -113,20 +137,20 @@ BOOL set_map_mode( DC *dc, int mode ) dc->attr->vport_ext.cy = -virtual_res.cy; break; case MM_LOENGLISH: - dc->attr->wnd_ext.cx = MulDiv(1000, virtual_size.cx, 254); - dc->attr->wnd_ext.cy = MulDiv(1000, virtual_size.cy, 254); + dc->attr->wnd_ext.cx = muldiv(1000, virtual_size.cx, 254); + dc->attr->wnd_ext.cy = muldiv(1000, virtual_size.cy, 254); dc->attr->vport_ext.cx = virtual_res.cx; dc->attr->vport_ext.cy = -virtual_res.cy; break; case MM_HIENGLISH: - dc->attr->wnd_ext.cx = MulDiv(10000, virtual_size.cx, 254); - dc->attr->wnd_ext.cy = MulDiv(10000, virtual_size.cy, 254); + dc->attr->wnd_ext.cx = muldiv(10000, virtual_size.cx, 254); + dc->attr->wnd_ext.cy = muldiv(10000, virtual_size.cy, 254); dc->attr->vport_ext.cx = virtual_res.cx; dc->attr->vport_ext.cy = -virtual_res.cy; break; case MM_TWIPS: - dc->attr->wnd_ext.cx = MulDiv(14400, virtual_size.cx, 254); - dc->attr->wnd_ext.cy = MulDiv(14400, virtual_size.cy, 254); + dc->attr->wnd_ext.cx = muldiv(14400, virtual_size.cx, 254); + dc->attr->wnd_ext.cy = muldiv(14400, virtual_size.cy, 254); dc->attr->vport_ext.cx = virtual_res.cx; dc->attr->vport_ext.cy = -virtual_res.cy; break; diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h index afdbad24f4a..595387e0aef 100644 --- a/dlls/gdi32/ntgdi_private.h +++ b/dlls/gdi32/ntgdi_private.h @@ -391,6 +391,7 @@ extern void lp_to_dp( DC *dc, POINT *points, INT count ) DECLSPEC_HIDDEN; extern BOOL set_map_mode( DC *dc, int mode ) DECLSPEC_HIDDEN; extern void combine_transform( XFORM *result, const XFORM *xform1, const XFORM *xform2 ) DECLSPEC_HIDDEN; +extern int muldiv( int a, int b, int c ) DECLSPEC_HIDDEN;
/* driver.c */ extern BOOL is_display_device( LPCWSTR name ) DECLSPEC_HIDDEN;