Alexandre Julliard : gdi32: Add a helper function to create a font from a face.

Alexandre Julliard julliard at winehq.org
Mon Nov 2 16:21:19 CST 2020


Module: wine
Branch: master
Commit: c9b21a57075d01297b320def739b85dd2c6ef100
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c9b21a57075d01297b320def739b85dd2c6ef100

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat Oct 31 15:58:54 2020 +0100

gdi32: Add a helper function to create a font from a face.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/font.c        | 31 +++++++++++++++++++++----------
 dlls/gdi32/freetype.c    | 19 +++----------------
 dlls/gdi32/gdi_private.h |  3 ++-
 3 files changed, 26 insertions(+), 27 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 5cca897fd40..abc202afcc3 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -1016,7 +1016,7 @@ static void free_font_handle( DWORD handle )
     }
 }
 
-struct gdi_font *alloc_gdi_font( const WCHAR *file, void *data_ptr, SIZE_T data_size )
+static struct gdi_font *alloc_gdi_font( const WCHAR *file, void *data_ptr, SIZE_T data_size )
 {
     UINT len = file ? strlenW(file) : 0;
     struct gdi_font *font = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
@@ -1083,6 +1083,25 @@ void set_gdi_font_names( struct gdi_font *font, const WCHAR *family_name, const
     font->otm.otmpFaceName = (char *)strdupW( full_name );
 }
 
+struct gdi_font *create_gdi_font( const struct gdi_font_face *face, const WCHAR *family_name,
+                                  const LOGFONTW *lf )
+{
+    struct gdi_font *font;
+
+    if (!(font = alloc_gdi_font( face->file, face->data_ptr, face->data_size ))) return NULL;
+    font->fs = face->fs;
+    font->lf = *lf;
+    font->fake_italic = (lf->lfItalic && !(face->ntmFlags & NTM_ITALIC));
+    font->fake_bold = (lf->lfWeight > 550 && !(face->ntmFlags & NTM_BOLD));
+    font->scalable = face->scalable;
+    font->face_index = face->face_index;
+    font->ntmFlags = face->ntmFlags;
+    font->aa_flags = HIWORD( face->flags );
+    if (!family_name) family_name = face->family->family_name;
+    set_gdi_font_names( font, family_name, face->style_name, face->full_name );
+    return font;
+}
+
 struct glyph_metrics
 {
     GLYPHMETRICS gm;
@@ -1490,22 +1509,14 @@ static void add_child_font( struct gdi_font *font, const WCHAR *family_name )
     }
     if (!best_face) return;
 
-    child = alloc_gdi_font( best_face->file, best_face->data_ptr, best_face->data_size );
-    child->fake_italic = italic && !(best_face->ntmFlags & NTM_ITALIC);
-    child->fake_bold = bold && !(best_face->ntmFlags & NTM_BOLD);
-    child->lf = font->lf;
+    if (!(child = create_gdi_font( best_face, family_name, &font->lf ))) return;
     child->matrix = font->matrix;
     child->can_use_bitmap = font->can_use_bitmap;
-    child->face_index = best_face->face_index;
-    child->ntmFlags = best_face->ntmFlags;
-    child->aa_flags = HIWORD( best_face->flags );
     child->scale_y = font->scale_y;
     child->aveWidth = font->aveWidth;
     child->charset = font->charset;
     child->codepage = font->codepage;
     child->base_font = font;
-    set_gdi_font_names( child, family_name, best_face->style_name, best_face->full_name );
-
     list_add_tail( &font->child_fonts, &child->entry );
     TRACE( "created child font %p for base %p\n", child, font );
 }
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 59095d4e6d8..ff57a971976 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -3274,20 +3274,10 @@ found_face:
     height = lf.lfHeight;
 
     TRACE("not in cache\n");
-    font = alloc_gdi_font( face->file, face->data_ptr, face->data_size );
+    font = create_gdi_font( face, orig_name, &lf );
 
     font->matrix = dcmat;
-    font->lf = lf;
     font->can_use_bitmap = can_use_bitmap;
-    font->fake_italic = (it && !(face->ntmFlags & NTM_ITALIC));
-    font->fake_bold = (bd && !(face->ntmFlags & NTM_BOLD));
-    font->fs = face->fs;
-    font->face_index = face->face_index;
-    font->ntmFlags = face->ntmFlags;
-    font->aa_flags = HIWORD( face->flags );
-    set_gdi_font_names( font, orig_name ? orig_name : family->family_name,
-                        face->style_name, face->full_name );
-
     if(csi.fs.fsCsb[0]) {
         font->charset = lf.lfCharSet;
         font->codepage = csi.ciACP;
@@ -3506,6 +3496,7 @@ static void GetEnumStructs(Face *face, const WCHAR *family_name, LPENUMLOGFONTEX
                            NEWTEXTMETRICEXW *pntm)
 {
     struct gdi_font *font;
+    LOGFONTW lf = { .lfHeight = 100 };
 
     if (face->cached_enum_data)
     {
@@ -3515,11 +3506,7 @@ static void GetEnumStructs(Face *face, const WCHAR *family_name, LPENUMLOGFONTEX
         return;
     }
 
-    font = alloc_gdi_font( face->file, face->data_ptr, face->data_size );
-    font->lf.lfHeight = 100;
-    font->face_index = face->face_index;
-    font->ntmFlags = face->ntmFlags;
-    set_gdi_font_names( font, family_name, face->style_name, face->full_name );
+    if (!(font = create_gdi_font( face, family_name, &lf ))) return;
 
     if (!freetype_load_font( font ))
     {
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index fd3f434399e..6f5266c0053 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -474,7 +474,6 @@ extern struct gdi_font_family *find_family_from_font_links( const WCHAR *name, c
                                                             FONTSIGNATURE fs ) DECLSPEC_HIDDEN;
 extern void create_child_font_list( struct gdi_font *font ) DECLSPEC_HIDDEN;
 
-extern struct gdi_font *alloc_gdi_font( const WCHAR *file, void *data_ptr, SIZE_T data_size ) DECLSPEC_HIDDEN;
 extern void free_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
 extern void cache_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
 extern struct gdi_font *find_cached_gdi_font( const LOGFONTW *lf, const FMAT2 *matrix,
@@ -482,6 +481,8 @@ extern struct gdi_font *find_cached_gdi_font( const LOGFONTW *lf, const FMAT2 *m
 static inline const WCHAR *get_gdi_font_name( struct gdi_font *font ) { return (WCHAR *)font->otm.otmpFamilyName; }
 extern void set_gdi_font_names( struct gdi_font *font, const WCHAR *family_name, const WCHAR *style_name,
                                 const WCHAR *full_name ) DECLSPEC_HIDDEN;
+extern struct gdi_font *create_gdi_font( const struct gdi_font_face *face, const WCHAR *family_name,
+                                         const LOGFONTW *lf ) DECLSPEC_HIDDEN;
 extern void *get_GSUB_vert_feature( struct gdi_font *font ) DECLSPEC_HIDDEN;
 extern void font_init(void) DECLSPEC_HIDDEN;
 extern CRITICAL_SECTION font_cs DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list