add caching in windows/sysparams.c
Kurt Mahan
kmahan at xmission.com
Sun Nov 30 19:34:19 CST 2003
Hi,
This patch drastically improves the performance of repeated calls
to SystemParametersInfoA() with SPI_GETICONTITLELOGFONT[31] and
SPI_GETNONCLIENTMETRICS[41]. In tracking down why Idag.exe (IDA)
had such performance problems when starting up and during other
operations I noticed that these two calls are being called repeatedly.
And each call caused windows.ini to be opened. A lot of work to retrieve
the same values over and over again. The performance on my machine went
from ~2 minute delays to ~5 second delays while running Idag.exe.
Please email me with comments/flames as I'm not on the mailing lists.
If this isn't a proper fix I'd like to discuss what the correct way
to do it would be.
Changelog:
Kurt Mahan <kmahan_at_xmission.com>
Cache data for SystemParametersInfoA(SPI_GETICONTITLELOGFONT) and
SystemParametersInfoA(SPI_GETNONCLIENTMETRICS).
--- windows/sysparams.c 31 Oct 2003 04:18:55 -0000 1.56
+++ windows/sysparams.c 1 Dec 2003 01:12:44 -0000
@@ -149,6 +149,17 @@
static BOOL screen_reader = FALSE;
static BOOL screensaver_running = FALSE;
+// caching for #31 - SPI_GETICONTITLELOGFONT
+static int cache31_seen = 0;
+static int cache31_height = 0;
+static BYTE cache31_charset = 0;
+static char cache31_name[LF_FACESIZE];
+
+// caching for #41 - SPI_GETNONCLIENTMETRICS
+static int cache41_seen = 0;
+static int cache41_height = 0;
+static char cache41_name[LF_FACESIZE];
+
/***********************************************************************
* GetTimerResolution (USER.14)
*/
@@ -1092,24 +1103,39 @@
if (!pvParam) return FALSE;
- /*
- * The 'default GDI fonts' seems to be returned.
- * If a returned font is not a correct font in your environment,
- * please try to fix objects/gdiobj.c at first.
- */
- SYSPARAMS_GetGUIFont( &lfDefault );
-
- GetProfileStringA( "Desktop", "IconTitleFaceName",
- lfDefault.lfFaceName,
- lpLogFont->lfFaceName, LF_FACESIZE );
- lpLogFont->lfHeight = -GetProfileIntA( "Desktop", "IconTitleSize", 11 );
+ if ( cache31_seen )
+ {
+ // use cached values
+ lpLogFont->lfHeight = cache31_height;
+ memcpy( lpLogFont->lfFaceName, cache31_name, LF_FACESIZE );
+ lpLogFont->lfCharSet = cache31_charset;
+ }
+ else
+ {
+ /*
+ * The 'default GDI fonts' seems to be returned.
+ * If a returned font is not a correct font in your environment,
+ * please try to fix objects/gdiobj.c at first.
+ */
+ SYSPARAMS_GetGUIFont( &lfDefault );
+ GetProfileStringA( "Desktop", "IconTitleFaceName",
+ lfDefault.lfFaceName,
+ lpLogFont->lfFaceName, LF_FACESIZE );
+ lpLogFont->lfHeight = -GetProfileIntA( "Desktop", "IconTitleSize", 11 );
+ lpLogFont->lfCharSet = lfDefault.lfCharSet; /* at least 'charset' should not be hard-coded */
+ // setup cache
+ cache31_seen = 1;
+ cache31_height = lpLogFont->lfHeight;
+ cache31_charset = lpLogFont->lfCharSet;
+ memcpy( cache31_name, lpLogFont->lfFaceName, LF_FACESIZE );
+ }
+
lpLogFont->lfWidth = 0;
lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0;
lpLogFont->lfWeight = FW_NORMAL;
lpLogFont->lfItalic = FALSE;
lpLogFont->lfStrikeOut = FALSE;
lpLogFont->lfUnderline = FALSE;
- lpLogFont->lfCharSet = lfDefault.lfCharSet; /* at least 'charset' should not be hard-coded */
lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
lpLogFont->lfPitchAndFamily = DEFAULT_PITCH;
@@ -1246,10 +1272,25 @@
/* menu font metrics */
SystemParametersInfoA( SPI_GETICONTITLELOGFONT, 0, (LPVOID)&(lpnm->lfMenuFont), 0 );
- GetProfileStringA( "Desktop", "MenuFont",
- (TWEAK_WineLook > WIN31_LOOK) ? lpnm->lfCaptionFont.lfFaceName : "System",
- lpnm->lfMenuFont.lfFaceName, LF_FACESIZE );
- lpnm->lfMenuFont.lfHeight = -GetProfileIntA( "Desktop", "MenuFontSize", 11 );
+
+ if ( cache41_seen )
+ {
+ memcpy( lpnm->lfMenuFont.lfFaceName, cache41_name, LF_FACESIZE );
+ lpnm->lfMenuFont.lfHeight = cache41_height;
+ }
+ else
+ {
+ GetProfileStringA( "Desktop", "MenuFont",
+ (TWEAK_WineLook > WIN31_LOOK) ? lpnm->lfCaptionFont.lfFaceName : "System",
+ lpnm->lfMenuFont.lfFaceName, LF_FACESIZE );
+ lpnm->lfMenuFont.lfHeight = -GetProfileIntA( "Desktop", "MenuFontSize", 11 );
+
+ // setup cache
+ cache41_seen = 1;
+ cache41_height = lpnm->lfMenuFont.lfHeight;
+ memcpy( cache41_name, lpnm->lfMenuFont.lfFaceName, LF_FACESIZE );
+ }
+
lpnm->lfMenuFont.lfWeight = (TWEAK_WineLook > WIN31_LOOK) ? FW_NORMAL : FW_BOLD;
/* status bar font metrics */
More information about the wine-patches
mailing list