Jacek Caban : gdi32: Read screen DPI config in init_font_options.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 15:21:45 CDT 2021


Module: wine
Branch: master
Commit: 8e40e56b79c39356a981bbc25100daa9635b29f3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8e40e56b79c39356a981bbc25100daa9635b29f3

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 27 13:05:38 2021 +0200

gdi32: Read screen DPI config in init_font_options.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/font.c          | 39 ++++++++++++++++++----------
 dlls/gdi32/gdiobj.c        | 65 +++++++---------------------------------------
 dlls/gdi32/ntgdi_private.h |  3 +--
 3 files changed, 36 insertions(+), 71 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index b85f11b14a6..189405c2ba1 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2682,7 +2682,7 @@ static void update_font_system_link_info(UINT current_ansi_codepage)
     }
 }
 
-static void update_codepage(void)
+static void update_codepage( UINT screen_dpi )
 {
     char value_buffer[FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[40 * sizeof(WCHAR)])];
     KEY_VALUE_PARTIAL_INFORMATION *info = (void *)value_buffer;
@@ -2691,14 +2691,11 @@ static void update_codepage(void)
     HKEY hkey;
     DWORD size;
     UINT i, ansi_cp, oem_cp;
-    DWORD screen_dpi, font_dpi = 0;
+    DWORD font_dpi = 0;
     BOOL done = FALSE, cp_match = FALSE;
 
     static const WCHAR log_pixelsW[] = {'L','o','g','P','i','x','e','l','s',0};
 
-    screen_dpi = get_dpi();
-    if (!screen_dpi) screen_dpi = 96;
-
     size = query_reg_value( wine_fonts_key, log_pixelsW, info, sizeof(value_buffer) );
     if (size == sizeof(DWORD) && info->Type == REG_DWORD)
         font_dpi = *(DWORD *)info->Data;
@@ -4177,12 +4174,13 @@ static BOOL get_key_value( HKEY key, const char *name, DWORD *value )
     return !!count;
 }
 
-static void init_font_options( HKEY hkcu )
+static UINT init_font_options( HKEY hkcu )
 {
     char value_buffer[FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[20 * sizeof(WCHAR)])];
     KEY_VALUE_PARTIAL_INFORMATION *info = (void *)value_buffer;
     HKEY key;
     DWORD i, val, gamma = 1400;
+    UINT dpi = 0;
 
     static const WCHAR desktop_keyW[] =
         { 'C','o','n','t','r','o','l',' ','P','a','n','e','l','\\','D','e','s','k','t','o','p' };
@@ -4220,6 +4218,7 @@ static void init_font_options( HKEY hkcu )
         {
             gamma = min( max( val, 1000 ), 2200 );
         }
+        if (get_key_value( key, "LogPixels", &val )) dpi = val;
         NtClose( key );
     }
 
@@ -4235,8 +4234,17 @@ static void init_font_options( HKEY hkcu )
             font_gamma_ramp.decode[i] = pow( i / 255., gamma / 1000. ) * 255. + .5;
         }
     }
+
+    if (!dpi && (key = reg_open_key( NULL, fonts_config_keyW, sizeof(fonts_config_keyW) )))
+    {
+        if (get_key_value( key, "LogPixels", &val )) dpi = val;
+        NtClose( key );
+    }
+    if (!dpi) dpi = 96;
+
     font_gamma_ramp.gamma = gamma;
-    TRACE("gamma %d\n", font_gamma_ramp.gamma);
+    TRACE( "gamma %d screen dpi %u\n", font_gamma_ramp.gamma, dpi );
+    return dpi;
 }
 
 
@@ -6123,12 +6131,13 @@ static const struct font_callback_funcs callback_funcs = { add_gdi_face };
 /***********************************************************************
  *              font_init
  */
-void font_init(void)
+UINT font_init(void)
 {
     OBJECT_ATTRIBUTES attr = { sizeof(attr) };
     UNICODE_STRING name;
     HANDLE mutex, hkcu;
     DWORD disposition;
+    UINT dpi = 0;
 
     static WCHAR wine_font_mutexW[] =
         {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s',
@@ -6137,14 +6146,15 @@ void font_init(void)
         {'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\','F','o','n','t','s'};
     static const WCHAR cacheW[] = {'C','a','c','h','e'};
 
-    if (RtlOpenCurrentUser( MAXIMUM_ALLOWED, &hkcu )) return;
+    if (RtlOpenCurrentUser( MAXIMUM_ALLOWED, &hkcu )) return 0;
     wine_fonts_key = reg_create_key( hkcu, wine_fonts_keyW, sizeof(wine_fonts_keyW), 0, NULL );
-    if (wine_fonts_key) init_font_options( hkcu );
+    if (wine_fonts_key) dpi = init_font_options( hkcu );
     NtClose( hkcu );
-    if (!wine_fonts_key) return;
-    update_codepage();
+    if (!dpi) return 96;
+    update_codepage( dpi );
 
-    if (__wine_init_unix_lib( gdi32_module, DLL_PROCESS_ATTACH, &callback_funcs, &font_funcs )) return;
+    if (__wine_init_unix_lib( gdi32_module, DLL_PROCESS_ATTACH, &callback_funcs, &font_funcs ))
+        return dpi;
 
     load_system_bitmap_fonts();
     load_file_system_fonts();
@@ -6155,7 +6165,7 @@ void font_init(void)
     name.Buffer = wine_font_mutexW;
     name.Length = name.MaximumLength = sizeof(wine_font_mutexW);
 
-    if (NtCreateMutant( &mutex, MUTEX_ALL_ACCESS, &attr, FALSE ) < 0) return;
+    if (NtCreateMutant( &mutex, MUTEX_ALL_ACCESS, &attr, FALSE ) < 0) return dpi;
     NtWaitForSingleObject( mutex, FALSE, NULL );
 
     wine_fonts_cache_key = reg_create_key( wine_fonts_key, cacheW, sizeof(cacheW),
@@ -6181,6 +6191,7 @@ void font_init(void)
     load_system_links();
     dump_gdi_font_list();
     dump_gdi_font_subst();
+    return dpi;
 }
 
 /***********************************************************************
diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 9c62e9e62d1..14cada9ee88 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -514,46 +514,6 @@ BOOL GDI_dec_ref_count( HGDIOBJ handle )
 }
 
 
-/******************************************************************************
- *              get_reg_dword
- *
- * Read a DWORD value from the registry
- */
-static BOOL get_reg_dword(HKEY base, const WCHAR *key_name, const WCHAR *value_name, DWORD *value)
-{
-    HKEY key;
-    DWORD type, data, size = sizeof(data);
-    BOOL ret = FALSE;
-
-    if (RegOpenKeyW(base, key_name, &key) == ERROR_SUCCESS)
-    {
-        if (RegQueryValueExW(key, value_name, NULL, &type, (void *)&data, &size) == ERROR_SUCCESS &&
-            type == REG_DWORD)
-        {
-            *value = data;
-            ret = TRUE;
-        }
-        RegCloseKey(key);
-    }
-    return ret;
-}
-
-/******************************************************************************
- *              get_dpi
- *
- * get the dpi from the registry
- */
-DWORD get_dpi(void)
-{
-    DWORD dpi;
-
-    if (get_reg_dword(HKEY_CURRENT_USER, L"Control Panel\\Desktop", L"LogPixels", &dpi))
-        return dpi;
-    if (get_reg_dword(HKEY_CURRENT_CONFIG, L"Software\\Fonts", L"LogPixels", &dpi))
-        return dpi;
-    return 0;
-}
-
 /******************************************************************************
  *              get_system_dpi
  *
@@ -580,16 +540,9 @@ static HFONT create_font( const LOGFONTW *deffont )
     return NtGdiHfontCreate( &lf, sizeof(lf), 0, 0, NULL );
 }
 
-static HFONT create_scaled_font( const LOGFONTW *deffont )
+static HFONT create_scaled_font( const LOGFONTW *deffont, unsigned int dpi )
 {
     LOGFONTW lf;
-    static DWORD dpi;
-
-    if (!dpi)
-    {
-        dpi = get_dpi();
-        if (!dpi) dpi = 96;
-    }
 
     lf = *deffont;
     lf.lfHeight = muldiv( lf.lfHeight, dpi, 96 );
@@ -634,7 +587,7 @@ HGDIOBJ get_stock_object( INT obj )
     return entry_to_handle( handle_entry( ULongToHandle( obj + FIRST_GDI_HANDLE )));
 }
 
-static void init_stock_objects(void)
+static void init_stock_objects( unsigned int dpi )
 {
     const struct DefaultFontInfo *deffonts;
     unsigned int i;
@@ -655,7 +608,7 @@ static void init_stock_objects(void)
     create_pen( PS_NULL,  0, RGB(0,0,0) );
 
     /* slot 9 is not used for non-scaled stock objects */
-    create_scaled_font( &OEMFixedFont );
+    create_scaled_font( &OEMFixedFont, dpi );
 
     /* language-independent stock fonts */
     create_font( &OEMFixedFont );
@@ -679,9 +632,9 @@ static void init_stock_objects(void)
 
     assert( (HandleToULong( obj ) & 0xffff) == FIRST_GDI_HANDLE + DEFAULT_BITMAP );
 
-    create_scaled_font( &deffonts->SystemFont );
-    create_scaled_font( &deffonts->SystemFixedFont );
-    create_scaled_font( &deffonts->DefaultGuiFont );
+    create_scaled_font( &deffonts->SystemFont, dpi );
+    create_scaled_font( &deffonts->SystemFixedFont, dpi );
+    create_scaled_font( &deffonts->DefaultGuiFont, dpi );
 
     /* clear the NOSYSTEM bit on all stock objects*/
     for (i = 0; i < STOCK_LAST + 5; i++)
@@ -699,14 +652,16 @@ static void init_stock_objects(void)
  */
 BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
 {
+    unsigned int dpi;
+
     if (reason != DLL_PROCESS_ATTACH) return TRUE;
 
     gdi32_module = inst;
     DisableThreadLibraryCalls( inst );
     NtQuerySystemInformation( SystemBasicInformation, &system_info, sizeof(system_info), NULL );
     set_gdi_shared();
-    font_init();
-    init_stock_objects();
+    dpi = font_init();
+    init_stock_objects( dpi );
     return TRUE;
 }
 
diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h
index 595387e0aef..9f0f1d44240 100644
--- a/dlls/gdi32/ntgdi_private.h
+++ b/dlls/gdi32/ntgdi_private.h
@@ -338,7 +338,7 @@ struct font_callback_funcs
                                const struct bitmap_font_size *size );
 };
 
-extern void font_init(void) DECLSPEC_HIDDEN;
+extern UINT font_init(void) DECLSPEC_HIDDEN;
 
 /* opentype.c */
 
@@ -380,7 +380,6 @@ extern void GDI_CheckNotLock(void) DECLSPEC_HIDDEN;
 extern UINT GDI_get_ref_count( HGDIOBJ handle ) DECLSPEC_HIDDEN;
 extern HGDIOBJ GDI_inc_ref_count( HGDIOBJ handle ) DECLSPEC_HIDDEN;
 extern BOOL GDI_dec_ref_count( HGDIOBJ handle ) DECLSPEC_HIDDEN;
-extern DWORD get_dpi(void) DECLSPEC_HIDDEN;
 extern DWORD get_system_dpi(void) DECLSPEC_HIDDEN;
 extern HGDIOBJ get_stock_object( INT obj ) DECLSPEC_HIDDEN;
 extern DWORD get_gdi_object_type( HGDIOBJ obj ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list