Dmitry Timoshkov : gdi32: Scale default GUI fonts to match screen resolution changes.

Alexandre Julliard julliard at winehq.org
Mon Jun 17 14:07:47 CDT 2013


Module: wine
Branch: master
Commit: 705a0f023846fc113413a30d097b80860bd3d40b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=705a0f023846fc113413a30d097b80860bd3d40b

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Mon Jun 17 19:02:25 2013 +0900

gdi32: Scale default GUI fonts to match screen resolution changes.

---

 dlls/gdi32/gdiobj.c     |   49 ++++++++++++++++++++++++++++++++++++++++++++--
 dlls/gdi32/tests/font.c |    7 +++++-
 2 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 5375049..de64474 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -597,6 +597,49 @@ BOOL GDI_dec_ref_count( HGDIOBJ handle )
     return entry != NULL;
 }
 
+/******************************************************************************
+ *      get_dpi   (internal)
+ *
+ * get the dpi from the registry
+ */
+static int get_dpi( void )
+{
+    static const WCHAR dpi_key_name[] = {'S','o','f','t','w','a','r','e','\\','F','o','n','t','s','\0'};
+    static const WCHAR dpi_value_name[] = {'L','o','g','P','i','x','e','l','s','\0'};
+    static int dpi = -1;
+    HKEY hkey;
+
+    if (dpi != -1) return dpi;
+
+    if (RegOpenKeyW(HKEY_CURRENT_CONFIG, dpi_key_name, &hkey) == ERROR_SUCCESS)
+    {
+        DWORD type, size;
+        int new_dpi;
+
+        size = sizeof(new_dpi);
+        if (RegQueryValueExW(hkey, dpi_value_name, NULL, &type, (void *)&new_dpi, &size) == ERROR_SUCCESS)
+        {
+            if (type == REG_DWORD && new_dpi != 0)
+                dpi = new_dpi;
+        }
+        RegCloseKey(hkey);
+    }
+    if (dpi <= 0) dpi = 96;
+    return dpi;
+}
+
+
+static HFONT create_scaled_font( const LOGFONTW *deffont )
+{
+    LOGFONTW lf;
+    LONG height;
+
+    lf = *deffont;
+    height = abs(lf.lfHeight) * get_dpi() / 96;
+    lf.lfHeight = deffont->lfHeight < 0 ? -height : height;
+
+    return CreateFontIndirectW( &lf );
+}
 
 /***********************************************************************
  *           DllMain
@@ -636,10 +679,10 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
 
     /* language-dependent stock fonts */
     deffonts = get_default_fonts(get_default_charset());
-    stock_objects[SYSTEM_FONT]         = CreateFontIndirectW( &deffonts->SystemFont );
-    stock_objects[DEVICE_DEFAULT_FONT] = CreateFontIndirectW( &deffonts->DeviceDefaultFont );
+    stock_objects[SYSTEM_FONT]         = create_scaled_font( &deffonts->SystemFont );
+    stock_objects[DEVICE_DEFAULT_FONT] = create_scaled_font( &deffonts->DeviceDefaultFont );
     stock_objects[SYSTEM_FIXED_FONT]   = CreateFontIndirectW( &deffonts->SystemFixedFont );
-    stock_objects[DEFAULT_GUI_FONT]    = CreateFontIndirectW( &deffonts->DefaultGuiFont );
+    stock_objects[DEFAULT_GUI_FONT]    = create_scaled_font( &deffonts->DefaultGuiFont );
 
     stock_objects[DC_BRUSH]     = CreateBrushIndirect( &DCBrush );
     stock_objects[DC_PEN]       = CreatePenIndirect( &DCPen );
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 2802f0e..9563da9 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -5012,7 +5012,12 @@ static void test_stock_fonts(void)
             }
 
             /* FIXME: Remove once Wine is fixed */
-            if (td[i][j].dpi != 96) todo_wine
+            if (td[i][j].dpi != 96 &&
+                /* MS Sans Serif for 120 dpi and higher should include 12 pixel bitmap set */
+                ((!strcmp(td[i][j].face_name, "MS Sans Serif") && td[i][j].height == 12) ||
+                /* System for 120 dpi and higher should include 20 pixel bitmap set */
+                (!strcmp(td[i][j].face_name, "System") && td[i][j].height > 16)))
+            todo_wine
             ok(height == td[i][j].height_pixels, "%d(%d): expected height %d, got %d\n", i, j, td[i][j].height_pixels, height);
             else
             ok(height == td[i][j].height_pixels, "%d(%d): expected height %d, got %d\n", i, j, td[i][j].height_pixels, height);




More information about the wine-cvs mailing list