From: "Rémi Bernon" Subject: [PATCH v3 4/4] gdi32: Split create_face to a separate function. Message-Id: <20200917173045.1315058-4-rbernon@codeweavers.com> Date: Thu, 17 Sep 2020 19:30:45 +0200 In-Reply-To: <20200917173045.1315058-1-rbernon@codeweavers.com> References: <20200917173045.1315058-1-rbernon@codeweavers.com> Make it not depend on FreeType so we can also use it before creating FT_Face. We also open and fstat the file first, checking for its existence and in preparation for mmaping it to parse the font info later. Signed-off-by: Rémi Bernon --- dlls/gdi32/freetype.c | 99 +++++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 45 deletions(-) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 3298b31ab74..8f4b0d075d7 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 *create_face( 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 ) == -1) 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; @@ -2112,57 +2154,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 *create_face_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 = create_face( 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], @@ -2178,9 +2186,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 = create_face_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) @@ -3524,7 +3533,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 = create_face_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