[PATCH v3 4/4] gdi32: Split create_face to a separate function.
Rémi Bernon
rbernon at codeweavers.com
Thu Sep 17 12:30:45 CDT 2020
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 <rbernon at codeweavers.com>
---
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
More information about the wine-devel
mailing list