[3/3] gdi32: Make AddFontToList return a pointer to first loaded face.

Dmitry Timoshkov dmitry at codeweavers.com
Wed Oct 27 06:34:15 CDT 2010


---
 dlls/gdi32/freetype.c |   35 ++++++++++++++++++++---------------
 1 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index c68854e..5f23536 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1209,14 +1209,14 @@ static void AddFaceToFamily(Face *face, Family *family)
 #define ADDFONT_FORCE_BITMAP  0x02
 #define ADDFONT_HIDDEN        0x04
 static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_size,
-                         char *fake_family, const WCHAR *target_family, DWORD flags)
+                         char *fake_family, const WCHAR *target_family, DWORD flags, Face **face_to_return)
 {
     FT_Face ft_face;
     TT_OS2 *pOS2;
     TT_Header *pHeader = NULL;
     WCHAR *english_family, *localised_family, *StyleW;
     Family *family = NULL;
-    Face *face;
+    Face *face, *first_face = NULL;
     struct list *family_elem_ptr, *face_elem_ptr;
     FT_Error err;
     FT_Long face_index = 0, num_faces;
@@ -1240,7 +1240,7 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
             for(cursor = mac_list; *cursor; cursor++)
             {
                 had_one = TRUE;
-                AddFontToList(*cursor, NULL, 0, NULL, NULL, flags);
+                AddFontToList(*cursor, NULL, 0, NULL, NULL, flags, face_to_return);
                 HeapFree(GetProcessHeap(), 0, *cursor);
             }
             HeapFree(GetProcessHeap(), 0, mac_list);
@@ -1546,6 +1546,8 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
 
                 AddFaceToFamily(face, family);
             }
+
+            if (!first_face) first_face = face;
         } while(!FT_IS_SCALABLE(ft_face) && ++bitmap_num < ft_face->num_fixed_sizes);
 
 	num_faces = ft_face->num_faces;
@@ -1553,12 +1555,15 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
 	TRACE("Added font %s %s\n", debugstr_w(family->FamilyName),
 	      debugstr_w(StyleW));
     } while(num_faces > ++face_index);
+
+    if (face_to_return) *face_to_return = first_face;
+
     return num_faces;
 }
 
-static INT AddFontFileToList(const char *file, char *fake_family, const WCHAR *target_family, DWORD flags)
+static INT AddFontFileToList(const char *file, char *fake_family, const WCHAR *target_family, DWORD flags, Face **face_to_return)
 {
-    return AddFontToList(file, NULL, 0, fake_family, target_family, flags);
+    return AddFontToList(file, NULL, 0, fake_family, target_family, flags, face_to_return);
 }
 
 static void DumpFontList(void)
@@ -1632,7 +1637,7 @@ static void LoadReplaceList(void)
                         TRACE("mapping %s %s to %s\n", debugstr_w(family->FamilyName),
                               debugstr_w(face->StyleName), familyA);
                         /* Now add a new entry with the new family name */
-                        AddFontToList(face->file, face->font_data_ptr, face->font_data_size, familyA, family->FamilyName, ADDFONT_FORCE_BITMAP | (face->external ? ADDFONT_EXTERNAL_FONT : 0));
+                        AddFontToList(face->file, face->font_data_ptr, face->font_data_size, familyA, family->FamilyName, ADDFONT_FORCE_BITMAP | (face->external ? ADDFONT_EXTERNAL_FONT : 0), NULL);
                     }
                     break;
                 }
@@ -1808,7 +1813,7 @@ static BOOL ReadFontDir(const char *dirname, BOOL external_fonts)
 	if(S_ISDIR(statbuf.st_mode))
 	    ReadFontDir(path, external_fonts);
 	else
-	    AddFontFileToList(path, NULL, NULL, external_fonts ? ADDFONT_EXTERNAL_FONT : 0);
+	    AddFontFileToList(path, NULL, NULL, external_fonts ? ADDFONT_EXTERNAL_FONT : 0, NULL);
     }
     closedir(dir);
     return TRUE;
@@ -1876,7 +1881,7 @@ LOAD_FUNCPTR(FcPatternGetString);
         if(len < 4) continue;
         ext = &file[ len - 3 ];
         if(strcasecmp(ext, "pfa") && strcasecmp(ext, "pfb"))
-            AddFontFileToList(file, NULL, NULL,  ADDFONT_EXTERNAL_FONT);
+            AddFontFileToList(file, NULL, NULL,  ADDFONT_EXTERNAL_FONT, NULL);
     }
     pFcFontSetDestroy(fontset);
     pFcObjectSetDestroy(os);
@@ -1908,7 +1913,7 @@ static BOOL load_font_from_data_dir(LPCWSTR file, DWORD flags)
         WideCharToMultiByte(CP_UNIXCP, 0, file, -1, unix_name + strlen(unix_name), len, NULL, NULL);
 
         EnterCriticalSection( &freetype_cs );
-        ret = AddFontFileToList(unix_name, NULL, NULL, flags);
+        ret = AddFontFileToList(unix_name, NULL, NULL, flags, NULL);
         LeaveCriticalSection( &freetype_cs );
         HeapFree(GetProcessHeap(), 0, unix_name);
     }
@@ -1928,7 +1933,7 @@ static BOOL load_font_from_winfonts_dir(LPCWSTR file, DWORD flags)
     strcatW(windowsdir, file);
     if ((unixname = wine_get_unix_file_name(windowsdir))) {
         EnterCriticalSection( &freetype_cs );
-        ret = AddFontFileToList(unixname, NULL, NULL, flags);
+        ret = AddFontFileToList(unixname, NULL, NULL, flags, NULL);
         LeaveCriticalSection( &freetype_cs );
         HeapFree(GetProcessHeap(), 0, unixname);
     }
@@ -1955,7 +1960,7 @@ static void load_system_fonts(void)
 
                 sprintfW(pathW, fmtW, windowsdir, data);
                 if((unixname = wine_get_unix_file_name(pathW))) {
-                    added = AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP);
+                    added = AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP, NULL);
                     HeapFree(GetProcessHeap(), 0, unixname);
                 }
                 if (!added)
@@ -2128,7 +2133,7 @@ INT WineEngAddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
         if((unixname = wine_get_unix_file_name(file)))
         {
             EnterCriticalSection( &freetype_cs );
-            ret = AddFontFileToList(unixname, NULL, NULL, add_font_flags);
+            ret = AddFontFileToList(unixname, NULL, NULL, add_font_flags, NULL);
             LeaveCriticalSection( &freetype_cs );
             HeapFree(GetProcessHeap(), 0, unixname);
         }
@@ -2162,7 +2167,7 @@ HANDLE WineEngAddFontMemResourceEx(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD
         memcpy(pFontCopy, pbFont, cbFont);
 
         EnterCriticalSection( &freetype_cs );
-        *pcFonts = AddFontToList(NULL, pFontCopy, cbFont, NULL, NULL, ADDFONT_FORCE_BITMAP);
+        *pcFonts = AddFontToList(NULL, pFontCopy, cbFont, NULL, NULL, ADDFONT_FORCE_BITMAP, NULL);
         LeaveCriticalSection( &freetype_cs );
 
         if (*pcFonts == 0)
@@ -2824,7 +2829,7 @@ BOOL WineEngInit(void)
                 {
                     if((unixname = wine_get_unix_file_name(data)))
                     {
-                        AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP);
+                        AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP, NULL);
                         HeapFree(GetProcessHeap(), 0, unixname);
                     }
                 }
@@ -2837,7 +2842,7 @@ BOOL WineEngInit(void)
                     sprintfW(pathW, fmtW, windowsdir, data);
                     if((unixname = wine_get_unix_file_name(pathW)))
                     {
-                        added = AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP);
+                        added = AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP, NULL);
                         HeapFree(GetProcessHeap(), 0, unixname);
                     }
                     if (!added)
-- 
1.7.0.6




More information about the wine-patches mailing list