Module: wine
Branch: master
Commit: 012f61067591c53a5d2508d8721223ae9a835383
URL: https://gitlab.winehq.org/wine/wine/-/commit/012f61067591c53a5d2508d8721223…
Author: Bartosz Kosiorek <gang65(a)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;