Module: wine Branch: master Commit: 012f61067591c53a5d2508d8721223ae9a835383 URL: https://gitlab.winehq.org/wine/wine/-/commit/012f61067591c53a5d2508d8721223a...
Author: Bartosz Kosiorek gang65@poczta.onet.pl Date: Tue Oct 24 22:12:21 2023 +0200
gdiplus: Improve performance of units_to_pixels by not using division.
Single float division (divss) is at least four time slower, than multiplication (mulss). More information: https://www.agner.org/optimize/instruction_tables.pdf
The units_to_pixels was optimized to use only multiplication (mulss), and avoid using divisions (divss).
---
dlls/gdiplus/gdiplus.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/dlls/gdiplus/gdiplus.c b/dlls/gdiplus/gdiplus.c index a3c85986ffc..3c4ecdeab5f 100644 --- a/dlls/gdiplus/gdiplus.c +++ b/dlls/gdiplus/gdiplus.c @@ -36,7 +36,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
static const REAL mm_per_inch = 25.4; +static const REAL inch_per_mm = 1.0 / 25.4; static const REAL point_per_inch = 72.0; +static const REAL inch_per_point = 1.0 / 72.0;
static Status WINAPI NotificationHook(ULONG_PTR *token) { @@ -333,17 +335,17 @@ REAL units_to_pixels(REAL units, GpUnit unit, REAL dpi, BOOL printer_display) return units; case UnitDisplay: if (printer_display) - return units * dpi / 100.0; + return units * dpi * 0.01f; else return units; case UnitPoint: - return units * dpi / point_per_inch; + return units * dpi * inch_per_point; case UnitInch: return units * dpi; case UnitDocument: - return units * dpi / 300.0; /* Per MSDN */ + return units * dpi * (1.0f / 300.0f); /* Per MSDN */ case UnitMillimeter: - return units * dpi / mm_per_inch; + return units * dpi * inch_per_mm; default: FIXME("Unhandled unit type: %d\n", unit); return 0;