Load system fonts from $(datadir)/wine/fonts

Dmitry Timoshkov dmitry at codeweavers.com
Thu Mar 9 01:13:08 CST 2006


Hello,

Changelog:
    Load system fonts from $(datadir)/wine/fonts if loading from
    %windir%\fonts has failed.

--- cvs/hq/wine/dlls/gdi/freetype.c	2006-02-28 13:01:25.000000000 +0800
+++ wine/dlls/gdi/freetype.c	2006-03-09 15:03:35.000000000 +0800
@@ -1123,6 +1123,30 @@ LOAD_FUNCPTR(FcPatternGet);
     return;
 }
 
+static BOOL load_font_from_data_dir(LPCWSTR file)
+{
+    BOOL ret = FALSE;
+    const char *data_dir = wine_get_data_dir();
+
+    if (data_dir)
+    {
+        INT len;
+        char *unix_name;
+
+        len = WideCharToMultiByte(CP_UNIXCP, 0, file, -1, NULL, 0, NULL, NULL);
+
+        unix_name = HeapAlloc(GetProcessHeap(), 0, strlen(data_dir) + len + sizeof("/fonts/"));
+
+        strcpy(unix_name, data_dir);
+        strcat(unix_name, "/fonts/");
+
+        WideCharToMultiByte(CP_UNIXCP, 0, file, -1, unix_name + strlen(unix_name), len, NULL, NULL);
+
+        ret = AddFontFileToList(unix_name, NULL, ADDFONT_FORCE_BITMAP);
+        HeapFree(GetProcessHeap(), 0, unix_name);
+    }
+    return ret;
+}
 
 static void load_system_fonts(void)
 {
@@ -1140,11 +1164,15 @@ static void load_system_fonts(void)
             dlen = sizeof(data);
             if(RegQueryValueExW(hkey, *value, 0, &type, (void*)data, &dlen) == ERROR_SUCCESS &&
                type == REG_SZ) {
+                BOOL added = FALSE;
+
                 sprintfW(pathW, fmtW, windowsdir, data);
                 if((unixname = wine_get_unix_file_name(pathW))) {
-                    AddFontFileToList(unixname, NULL, ADDFONT_FORCE_BITMAP);
+                    added = AddFontFileToList(unixname, NULL, ADDFONT_FORCE_BITMAP);
                     HeapFree(GetProcessHeap(), 0, unixname);
                 }
+                if (!added)
+                    load_font_from_data_dir(data);
             }
         }
         RegCloseKey(hkey);
@@ -1592,12 +1620,16 @@ BOOL WineEngInit(void)
                 {
                     WCHAR pathW[MAX_PATH];
                     static const WCHAR fmtW[] = {'%','s','\\','%','s','\0'};
+                    BOOL added = FALSE;
+
                     sprintfW(pathW, fmtW, windowsdir, data);
                     if((unixname = wine_get_unix_file_name(pathW)))
                     {
-                        AddFontFileToList(unixname, NULL, ADDFONT_FORCE_BITMAP);
+                        added = AddFontFileToList(unixname, NULL, ADDFONT_FORCE_BITMAP);
                         HeapFree(GetProcessHeap(), 0, unixname);
                     }
+                    if (!added)
+                        load_font_from_data_dir(data);
                 }
                 /* reset dlen and vlen */
                 dlen = datalen;





More information about the wine-patches mailing list