Alexandre Julliard : gdi32: Move the creation of the child font list out of freetype.c.
Alexandre Julliard
julliard at winehq.org
Mon Nov 2 16:21:19 CST 2020
Module: wine
Branch: master
Commit: 8d4336c5fa8ac99365629d142dae50860468dc2f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=8d4336c5fa8ac99365629d142dae50860468dc2f
Author: Alexandre Julliard <julliard at winehq.org>
Date: Sat Oct 31 10:20:26 2020 +0100
gdi32: Move the creation of the child font list out of freetype.c.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/font.c | 78 +++++++++++++++++++++++++++++++++++++++++
dlls/gdi32/freetype.c | 91 ------------------------------------------------
dlls/gdi32/gdi_private.h | 1 +
3 files changed, 79 insertions(+), 91 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 4dabc332736..3f6e74fee1c 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -1446,6 +1446,84 @@ static UINT get_GSUB_vert_glyph( struct gdi_font *font, UINT glyph )
return GSUB_apply_feature( font->gsub_table, font->vert_feature, glyph );
}
+static void add_child_font( struct gdi_font *font, const WCHAR *family_name )
+{
+ struct gdi_font *child;
+ struct gdi_font_family *family;
+ struct gdi_font_face *child_face, *best_face = NULL;
+ UINT penalty = 0, new_penalty = 0;
+ BOOL bold, italic, bd, it;
+
+ italic = !!font->lf.lfItalic;
+ bold = font->lf.lfWeight > FW_MEDIUM;
+
+ if (!(family = find_family_from_name( family_name ))) return;
+
+ LIST_FOR_EACH_ENTRY( child_face, get_family_face_list(family), struct gdi_font_face, entry )
+ {
+ it = !!(child_face->ntmFlags & NTM_ITALIC);
+ bd = !!(child_face->ntmFlags & NTM_BOLD);
+ new_penalty = ( it ^ italic ) + ( bd ^ bold );
+ if (!best_face || new_penalty < penalty)
+ {
+ penalty = new_penalty;
+ best_face = child_face;
+ }
+ }
+ 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;
+ 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 );
+}
+
+void create_child_font_list( struct gdi_font *font )
+{
+ static const WCHAR szDefaultFallbackLink[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0};
+ struct gdi_font_link *font_link;
+ struct gdi_font_link_entry *entry;
+ const WCHAR* font_name;
+
+ if (!(font_name = get_gdi_font_subst( get_gdi_font_name(font), -1, NULL )))
+ font_name = get_gdi_font_name( font );
+
+ if ((font_link = find_gdi_font_link( font_name )))
+ {
+ TRACE("found entry in system list\n");
+ LIST_FOR_EACH_ENTRY( entry, &font_link->links, struct gdi_font_link_entry, entry )
+ add_child_font( font, entry->family_name );
+ }
+ /*
+ * if not SYMBOL or OEM then we also get all the fonts for Microsoft
+ * Sans Serif. This is how asian windows get default fallbacks for fonts
+ */
+ if (is_dbcs_ansi_cp(GetACP()) && font->charset != SYMBOL_CHARSET && font->charset != OEM_CHARSET &&
+ strcmpiW( font_name, szDefaultFallbackLink ) != 0)
+ {
+ if ((font_link = find_gdi_font_link( szDefaultFallbackLink )))
+ {
+ TRACE("found entry in default fallback list\n");
+ LIST_FOR_EACH_ENTRY( entry, &font_link->links, struct gdi_font_link_entry, entry )
+ add_child_font( font, entry->family_name );
+ }
+ }
+}
+
/* font cache */
static struct list gdi_font_list = LIST_INIT( gdi_font_list );
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index b4bfd902309..936e8539a8d 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -338,8 +338,6 @@ static BOOL antialias_fakes = TRUE;
static const WCHAR font_mutex_nameW[] = {'_','_','W','I','N','E','_','F','O','N','T','_','M','U','T','E','X','_','_','\0'};
-static const WCHAR szDefaultFallbackLink[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0};
-
static BOOL CDECL freetype_set_outline_text_metrics( struct gdi_font *font );
static BOOL CDECL freetype_set_bitmap_text_metrics( struct gdi_font *font );
static void remove_face_from_cache( Face *face );
@@ -2136,14 +2134,6 @@ static void delete_external_font_keys(void)
if(winnt_key) RegCloseKey(winnt_key);
}
-static inline BOOL is_dbcs_ansi_cp(UINT ansi_cp)
-{
- return ( ansi_cp == 932 /* CP932 for Japanese */
- || ansi_cp == 936 /* CP936 for Chinese Simplified */
- || ansi_cp == 949 /* CP949 for Korean */
- || ansi_cp == 950 ); /* CP950 for Chinese Traditional */
-}
-
static BOOL init_freetype(void)
{
ft_handle = dlopen(SONAME_LIBFREETYPE, RTLD_NOW);
@@ -2712,87 +2702,6 @@ static LONG load_VDMX(struct gdi_font *font, LONG height)
return ppem;
}
-/*************************************************************
- * add_child_font
- */
-static void add_child_font( struct gdi_font *font, const WCHAR *family_name )
-{
- struct gdi_font *child;
- Family *family;
- Face *child_face, *best_face = NULL;
- UINT penalty = 0, new_penalty = 0;
- BOOL bold, italic, bd, it;
-
- italic = !!font->lf.lfItalic;
- bold = font->lf.lfWeight > FW_MEDIUM;
-
- if (!(family = find_family_from_name( family_name ))) return;
-
- LIST_FOR_EACH_ENTRY( child_face, get_face_list_from_family( family ), Face, entry )
- {
- it = !!(child_face->ntmFlags & NTM_ITALIC);
- bd = !!(child_face->ntmFlags & NTM_BOLD);
- new_penalty = ( it ^ italic ) + ( bd ^ bold );
- if (!best_face || new_penalty < penalty)
- {
- penalty = new_penalty;
- best_face = child_face;
- }
- }
- 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;
- 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->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 );
-}
-
-/*************************************************************
- * create_child_font_list
- */
-static void create_child_font_list( struct gdi_font *font )
-{
- struct gdi_font_link *font_link;
- struct gdi_font_link_entry *entry;
- const WCHAR* font_name;
-
- if (!(font_name = get_gdi_font_subst( get_gdi_font_name(font), -1, NULL )))
- font_name = get_gdi_font_name( font );
- font_link = find_gdi_font_link(font_name);
- if (font_link != NULL)
- {
- TRACE("found entry in system list\n");
- LIST_FOR_EACH_ENTRY( entry, &font_link->links, struct gdi_font_link_entry, entry )
- add_child_font( font, entry->family_name );
- }
- /*
- * if not SYMBOL or OEM then we also get all the fonts for Microsoft
- * Sans Serif. This is how asian windows get default fallbacks for fonts
- */
- if (is_dbcs_ansi_cp(GetACP()) && font->charset != SYMBOL_CHARSET && font->charset != OEM_CHARSET &&
- strcmpiW(font_name,szDefaultFallbackLink) != 0)
- {
- font_link = find_gdi_font_link(szDefaultFallbackLink);
- if (font_link != NULL)
- {
- TRACE("found entry in default fallback list\n");
- LIST_FOR_EACH_ENTRY( entry, &font_link->links, struct gdi_font_link_entry, entry )
- add_child_font( font, entry->family_name );
- }
- }
-}
-
static BOOL select_charmap(FT_Face ft_face, FT_Encoding encoding)
{
FT_Error ft_err = FT_Err_Invalid_CharMap_Handle;
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index e73c4d3b417..fd3f434399e 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -472,6 +472,7 @@ extern struct gdi_font_face *create_face( const WCHAR *style, const WCHAR *fulln
extern struct gdi_font_link *find_gdi_font_link( const WCHAR *name ) DECLSPEC_HIDDEN;
extern struct gdi_font_family *find_family_from_font_links( const WCHAR *name, const WCHAR *subst,
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;
More information about the wine-cvs
mailing list