[PATCH v2 5/7] gdi32: Cleanup and use face_create consistently.

Rémi Bernon rbernon at codeweavers.com
Thu Sep 17 10:01:35 CDT 2020


Make it not depend on FreeType so we can also use it for face creation
from registry cache.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/gdi32/freetype.c | 120 +++++++++++++++++++++---------------------
 1 file changed, 60 insertions(+), 60 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 960c2dc745c..6ed4e52c70e 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1542,6 +1542,48 @@ static void release_family( Family *family )
     HeapFree( GetProcessHeap(), 0, family );
 }
 
+static Face *face_create( const char *unix_name, DWORD face_index, void *font_data_ptr,
+                          DWORD font_data_size, DWORD flags )
+{
+    struct stat st;
+    Face *face;
+    int fd;
+
+    TRACE( "unix_name %s, face_index %u, font_data_ptr %p, font_data_size %u, flags %#x\n",
+           unix_name, face_index, font_data_ptr, font_data_size, flags );
+
+    if (unix_name)
+    {
+        if ((fd = open( unix_name, O_RDONLY )) == -1) return NULL;
+        if (fstat( fd, &st )) return NULL;
+        close( fd );
+    }
+
+    if (!(face = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*face) ))) return NULL;
+    face->refcount = 1;
+
+    list_init( &face->entry );
+
+    if (unix_name)
+    {
+        face->file = towstr( CP_UNIXCP, unix_name );
+        face->dev = st.st_dev;
+        face->ino = st.st_ino;
+    }
+    else
+    {
+        face->font_data_ptr = font_data_ptr;
+        face->font_data_size = font_data_size;
+    }
+
+    face->face_index = face_index;
+
+    if (!HIWORD( flags )) flags |= ADDFONT_AA_FLAGS( default_aa_flags );
+    face->flags = flags;
+
+    return face;
+}
+
 static void release_face( Face *face )
 {
     if (--face->refcount) return;
@@ -1677,21 +1719,18 @@ static inline LONG reg_save_dword(HKEY hkey, const WCHAR *value, DWORD data)
 
 static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family, void *buffer, DWORD buffer_size)
 {
-    DWORD needed, strike_index = 0;
+    DWORD face_index, flags, needed, strike_index = 0;
     HKEY hkey_strike;
+    Face *face;
 
     /* If we have a File Name key then this is a real font, not just the parent
        key of a bunch of non-scalable strikes */
     needed = buffer_size;
-    if (RegQueryValueExW( hkey_face, face_unix_name_value, NULL, NULL, buffer, &needed ) == ERROR_SUCCESS)
+    if (RegQueryValueExW( hkey_face, face_unix_name_value, NULL, NULL, buffer, &needed ) == ERROR_SUCCESS &&
+        reg_load_dword( hkey_face, face_index_value, &face_index ) == ERROR_SUCCESS &&
+        reg_load_dword( hkey_face, face_flags_value, &flags ) == ERROR_SUCCESS &&
+        (face = face_create( buffer, face_index, NULL, 0, flags )))
     {
-        Face *face;
-        face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face));
-        face->cached_enum_data = NULL;
-        face->family = NULL;
-
-        face->refcount = 1;
-        face->file = towstr( CP_UNIXCP, buffer );
         face->style_name = strdupW( face_name );
 
         needed = buffer_size;
@@ -1704,22 +1743,16 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family, void *bu
         }
         face->full_name = strdupW( buffer );
 
-        reg_load_ftlong(hkey_face, face_index_value, &face->face_index);
         reg_load_dword(hkey_face, face_ntmflags_value, &face->ntmFlags);
         reg_load_ftlong(hkey_face, face_version_value, &face->font_version);
-        reg_load_dword(hkey_face, face_flags_value, &face->flags);
 
         needed = sizeof(face->fs);
         RegQueryValueExW(hkey_face, face_font_sig_value, NULL, NULL, (BYTE*)&face->fs, &needed);
 
         if(reg_load_ftshort(hkey_face, face_height_value, &face->size.height) != ERROR_SUCCESS)
-        {
             face->scalable = TRUE;
-            memset(&face->size, 0, sizeof(face->size));
-        }
         else
         {
-            face->scalable = FALSE;
             reg_load_ftshort(hkey_face, face_width_value, &face->size.width);
             reg_load_ftlong(hkey_face, face_size_value, &face->size.size);
             reg_load_ftlong(hkey_face, face_x_ppem_value, &face->size.x_ppem);
@@ -2115,57 +2148,23 @@ static inline void get_fontsig( FT_Face ft_face, FONTSIGNATURE *fs )
     }
 }
 
-static Face *create_face( FT_Face ft_face, FT_Long face_index, const char *file, void *font_data_ptr, DWORD font_data_size,
-                          DWORD flags )
+static Face *face_create_from_ft_face( FT_Face ft_face, FT_Long face_index, const char *file,
+                                       void *font_data_ptr, DWORD font_data_size, DWORD flags )
 {
-    struct stat st;
-    Face *face = HeapAlloc( GetProcessHeap(), 0, sizeof(*face) );
+    Face *face;
+
+    if (!(face = face_create( file, face_index, font_data_ptr, font_data_size, flags )))
+        return NULL;
 
-    face->refcount = 1;
     face->style_name = ft_face_get_style_name( ft_face, GetSystemDefaultLangID() );
     face->full_name = ft_face_get_full_name( ft_face, GetSystemDefaultLangID() );
-    if (flags & ADDFONT_VERTICAL_FONT) face->full_name = get_vertical_name( face->full_name );
+    if (face->flags & ADDFONT_VERTICAL_FONT) face->full_name = get_vertical_name( face->full_name );
 
-    face->dev = 0;
-    face->ino = 0;
-    if (file)
-    {
-        face->file = towstr( CP_UNIXCP, file );
-        face->font_data_ptr = NULL;
-        face->font_data_size = 0;
-        if (!stat( file, &st ))
-        {
-            face->dev = st.st_dev;
-            face->ino = st.st_ino;
-        }
-    }
-    else
-    {
-        face->file = NULL;
-        face->font_data_ptr = font_data_ptr;
-        face->font_data_size = font_data_size;
-    }
-
-    face->face_index = face_index;
     get_fontsig( ft_face, &face->fs );
     face->ntmFlags = get_ntm_flags( ft_face );
     face->font_version = get_font_version( ft_face );
 
-    if (FT_IS_SCALABLE( ft_face ))
-    {
-        memset( &face->size, 0, sizeof(face->size) );
-        face->scalable = TRUE;
-    }
-    else
-    {
-        get_bitmap_size( ft_face, &face->size );
-        face->scalable = FALSE;
-    }
-
-    if (!HIWORD( flags )) flags |= ADDFONT_AA_FLAGS( default_aa_flags );
-    face->flags  = flags;
-    face->family = NULL;
-    face->cached_enum_data = NULL;
+    if (!(face->scalable = FT_IS_SCALABLE( ft_face ))) get_bitmap_size( ft_face, &face->size );
 
     TRACE("fsCsb = %08x %08x/%08x %08x %08x %08x\n",
           face->fs.fsCsb[0], face->fs.fsCsb[1],
@@ -2181,9 +2180,10 @@ static void AddFaceToList(FT_Face ft_face, const char *file, void *font_data_ptr
     Face *face;
     Family *family;
 
-    face = create_face( ft_face, face_index, file, font_data_ptr, font_data_size, flags );
-    family = get_family( ft_face, flags & ADDFONT_VERTICAL_FONT );
+    if (!(face = face_create_from_ft_face( ft_face, face_index, file, font_data_ptr, font_data_size, flags )))
+        return;
 
+    family = get_family( ft_face, flags & ADDFONT_VERTICAL_FONT );
     if (insert_face_in_family_list( face, family ))
     {
         if (flags & ADDFONT_ADD_TO_CACHE)
@@ -3527,7 +3527,7 @@ static BOOL get_fontdir( const char *unix_name, struct fontdir *fd )
     DWORD type;
 
     if (!ft_face) return FALSE;
-    face = create_face( ft_face, 0, unix_name, NULL, 0, 0 );
+    face = face_create_from_ft_face( ft_face, 0, unix_name, NULL, 0, 0 );
     family_name = ft_face_get_family_name( ft_face, GetSystemDefaultLCID() );
     pFT_Done_Face( ft_face );
 
-- 
2.28.0




More information about the wine-devel mailing list