sysparams.c: correctly convert twips to pixels.
Rein Klazes
wijn at wanadoo.nl
Wed May 25 04:24:35 CDT 2005
Hi,
Changelog:
dlls/user : sysparams.c
Use the screen resolution to convert from twips (1440 twips is one inch)
to pixels.
Rein.
-------------- next part --------------
--- wine/dlls/user/sysparams.c 2005-05-16 17:51:18.000000000 +0200
+++ mywine/dlls/user/sysparams.c 2005-05-25 11:00:42.000000000 +0200
@@ -533,16 +533,18 @@ static BOOL SYSPARAMS_Save( LPCWSTR lpRe
*
* Convert a dimension value that was obtained from the registry. These are
* quoted as being "twips" values if negative and pixels if positive.
+ * One inch is 1440 twips. So to convert, divide by 1440 to get inches and
+ * multiply that by the dots-per-inch to get the size in pixels.
* See for example
* MSDN Library - April 2001 -> Resource Kits ->
* Windows 2000 Resource Kit Reference ->
* Technical Reference to the Windows 2000 Registry ->
* HKEY_CURRENT_USER -> Control Panel -> Desktop -> WindowMetrics
*/
-inline static int SYSPARAMS_Twips2Pixels(int x)
+inline static int SYSPARAMS_Twips2Pixels(int x, int dpi)
{
if (x < 0)
- x = (-x+7)/15;
+ x = (-x*dpi+720)/1440;
return x;
}
@@ -555,7 +557,7 @@ inline static int SYSPARAMS_Twips2Pixels
* Of course this function belongs somewhere more usable but here will do
* for now.
*/
-static int SYSPARAMS_GetRegistryMetric( HKEY hkey, LPCWSTR lpValName, int default_value )
+static int SYSPARAMS_GetRegistryMetric( HKEY hkey, LPCWSTR lpValName, int default_value, int dpi)
{
int value = default_value;
if (hkey)
@@ -575,7 +577,7 @@ static int SYSPARAMS_GetRegistryMetric(
value = atoiW(buffer);
}
}
- return SYSPARAMS_Twips2Pixels(value);
+ return SYSPARAMS_Twips2Pixels(value, dpi);
}
@@ -603,22 +605,24 @@ void SYSPARAMS_Init(void)
WCHAR buf[10];
INT border;
CPINFO cpinfo;
+ int dpi;
display_dc = CreateICW( DISPLAY, NULL, NULL, NULL );
assert( display_dc );
+ dpi = GetDeviceCaps( display_dc, LOGPIXELSY);
if (RegOpenKeyExW (HKEY_CURRENT_USER, METRICS_REGKEY,
0, KEY_QUERY_VALUE, &hkey) != ERROR_SUCCESS) hkey = 0;
- sysMetrics[SM_CXVSCROLL] = SYSPARAMS_GetRegistryMetric( hkey, METRICS_SCROLLWIDTH_VALNAME, 16 );
+ sysMetrics[SM_CXVSCROLL] = SYSPARAMS_GetRegistryMetric( hkey, METRICS_SCROLLWIDTH_VALNAME, 16 , dpi);
sysMetrics[SM_CYHSCROLL] = sysMetrics[SM_CXVSCROLL];
/* The Win 2000 resource kit SAYS that this is governed by the ScrollHeight
* but on my computer that controls the CYV/CXH values. */
- sysMetrics[SM_CYCAPTION] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_CAPTIONHEIGHT_VALNAME, 18)
+ sysMetrics[SM_CYCAPTION] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_CAPTIONHEIGHT_VALNAME, 18, dpi)
+ 1; /* for the separator? */
- sysMetrics[SM_CYMENU] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_MENUHEIGHT_VALNAME, 18) + 1;
+ sysMetrics[SM_CYMENU] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_MENUHEIGHT_VALNAME, 18, dpi) + 1;
sysMetrics[SM_CXDLGFRAME] = 3;
@@ -637,12 +641,12 @@ void SYSPARAMS_Init(void)
sysMetrics[SM_CYVTHUMB] = sysMetrics[SM_CXVSCROLL];
sysMetrics[SM_CXHTHUMB] = sysMetrics[SM_CYVTHUMB];
- sysMetrics[SM_CXICON] = SYSPARAMS_GetRegistryMetric( hkey, METRICS_ICONSIZE_VALNAME, 32 );
+ sysMetrics[SM_CXICON] = SYSPARAMS_GetRegistryMetric( hkey, METRICS_ICONSIZE_VALNAME, 32 , dpi);
sysMetrics[SM_CYICON] = sysMetrics[SM_CXICON];
sysMetrics[SM_CYKANJIWINDOW] = 0;
sysMetrics[SM_MOUSEPRESENT] = 1;
- sysMetrics[SM_CYVSCROLL] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_SCROLLHEIGHT_VALNAME, sysMetrics[SM_CXVSCROLL]);
- sysMetrics[SM_CXHSCROLL] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_SCROLLHEIGHT_VALNAME, sysMetrics[SM_CYHSCROLL]);
+ sysMetrics[SM_CYVSCROLL] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_SCROLLHEIGHT_VALNAME, sysMetrics[SM_CXVSCROLL], dpi);
+ sysMetrics[SM_CXHSCROLL] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_SCROLLHEIGHT_VALNAME, sysMetrics[SM_CYHSCROLL], dpi);
sysMetrics[SM_DEBUG] = 0;
sysMetrics[SM_SWAPBUTTON] = 0;
@@ -659,7 +663,7 @@ void SYSPARAMS_Init(void)
sysMetrics[SM_CXMIN] = 112;
sysMetrics[SM_CYMIN] = 27;
- sysMetrics[SM_CXSIZE] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_CAPTIONWIDTH_VALNAME, sysMetrics[SM_CYCAPTION] - 1);
+ sysMetrics[SM_CXSIZE] = SYSPARAMS_GetRegistryMetric (hkey, METRICS_CAPTIONWIDTH_VALNAME, sysMetrics[SM_CYCAPTION] - 1, dpi);
sysMetrics[SM_CYSIZE] = sysMetrics[SM_CYCAPTION] - 1;
sysMetrics[SM_CXMINTRACK] = sysMetrics[SM_CXMIN];
sysMetrics[SM_CYMINTRACK] = sysMetrics[SM_CYMIN];
@@ -695,10 +699,10 @@ void SYSPARAMS_Init(void)
sysMetrics[SM_CYMINSPACING] = 24;
sysMetrics[SM_CXSMICON] = 16;
sysMetrics[SM_CYSMICON] = 16;
- sysMetrics[SM_CYSMCAPTION] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_SMCAPTIONHEIGHT_VALNAME, 15) + 1;
- sysMetrics[SM_CXSMSIZE] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_SMCAPTIONWIDTH_VALNAME, 13);
+ sysMetrics[SM_CYSMCAPTION] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_SMCAPTIONHEIGHT_VALNAME, 15, dpi) + 1;
+ sysMetrics[SM_CXSMSIZE] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_SMCAPTIONWIDTH_VALNAME, 13, dpi);
sysMetrics[SM_CYSMSIZE] = sysMetrics[SM_CYSMCAPTION] - 1;
- sysMetrics[SM_CXMENUSIZE] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_MENUWIDTH_VALNAME, sysMetrics[SM_CYMENU] - 1);
+ sysMetrics[SM_CXMENUSIZE] = SYSPARAMS_GetRegistryMetric(hkey, METRICS_MENUWIDTH_VALNAME, sysMetrics[SM_CYMENU] - 1, dpi);
sysMetrics[SM_CYMENUSIZE] = sysMetrics[SM_CYMENU] - 1;
/* FIXME: What do these mean? */
@@ -873,9 +877,10 @@ BOOL WINAPI SystemParametersInfoW( UINT
if (!spi_loaded[spi_idx])
{
WCHAR buf[10];
+ int dpi = GetDeviceCaps( display_dc, LOGPIXELSY);
if (SYSPARAMS_Load( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, buf, sizeof(buf) ))
- border = SYSPARAMS_Twips2Pixels( atoiW(buf) );
+ border = SYSPARAMS_Twips2Pixels( atoiW(buf) , dpi);
spi_loaded[spi_idx] = TRUE;
sysMetrics[SM_CXFRAME] = border + sysMetrics[SM_CXDLGFRAME];
@@ -956,11 +961,12 @@ BOOL WINAPI SystemParametersInfoW( UINT
{
WCHAR buf[10];
int val;
+ int dpi = GetDeviceCaps( display_dc, LOGPIXELSY);
if (SYSPARAMS_Load( SPI_ICONHORIZONTALSPACING_REGKEY,
SPI_ICONHORIZONTALSPACING_VALNAME, buf, sizeof(buf) ))
{
- val = SYSPARAMS_Twips2Pixels( atoiW(buf) );
+ val = SYSPARAMS_Twips2Pixels( atoiW(buf), dpi);
sysMetrics[SM_CXICONSPACING] = val;
}
spi_loaded[spi_idx] = TRUE;
@@ -1151,11 +1157,12 @@ BOOL WINAPI SystemParametersInfoW( UINT
{
WCHAR buf[10];
int val;
+ int dpi = GetDeviceCaps( display_dc, LOGPIXELSY);
if (SYSPARAMS_Load( SPI_ICONVERTICALSPACING_REGKEY,
SPI_ICONVERTICALSPACING_VALNAME, buf, sizeof(buf) ))
{
- val = SYSPARAMS_Twips2Pixels( atoiW(buf) );
+ val = SYSPARAMS_Twips2Pixels( atoiW(buf), dpi);
sysMetrics[SM_CYICONSPACING] = val;
}
spi_loaded[spi_idx] = TRUE;
More information about the wine-patches
mailing list