Rémi Bernon : gdi32: Rewrite find_face_from_filename using the rbtree.
Alexandre Julliard
julliard at winehq.org
Fri Nov 13 15:57:52 CST 2020
Module: wine
Branch: master
Commit: ec646de3aa64ae6320a13d95a5d73efea7b366fb
URL: https://source.winehq.org/git/wine.git/?a=commit;h=ec646de3aa64ae6320a13d95a5d73efea7b366fb
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Fri Nov 13 09:05:56 2020 +0000
gdi32: Rewrite find_face_from_filename using the rbtree.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/gdi32/font.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index a095bcdd27b..450d31ca82a 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -618,29 +618,39 @@ static const struct list *get_family_face_list( const struct gdi_font_family *fa
return family->replacement ? &family->replacement->faces : &family->faces;
}
+static struct gdi_font_face *family_find_face_from_filename( struct gdi_font_family *family, const WCHAR *file_name )
+{
+ struct gdi_font_face *face;
+ const WCHAR *file;
+ LIST_FOR_EACH_ENTRY( face, get_family_face_list(family), struct gdi_font_face, entry )
+ {
+ if (!face->file) continue;
+ file = wcsrchr(face->file, '\\');
+ if (!file) file = face->file;
+ else file++;
+ if (wcsicmp( file, file_name )) continue;
+ face->refcount++;
+ return face;
+ }
+ return NULL;
+}
+
static struct gdi_font_face *find_face_from_filename( const WCHAR *file_name, const WCHAR *family_name )
{
struct gdi_font_family *family;
struct gdi_font_face *face;
- const WCHAR *file;
TRACE( "looking for file %s name %s\n", debugstr_w(file_name), debugstr_w(family_name) );
- WINE_RB_FOR_EACH_ENTRY( family, &family_name_tree, struct gdi_font_family, name_entry )
+ if (!family_name)
{
- if (family_name && wcsnicmp( family_name, family->family_name, LF_FACESIZE - 1 )) continue;
- LIST_FOR_EACH_ENTRY( face, get_family_face_list(family), struct gdi_font_face, entry )
- {
- if (!face->file) continue;
- file = wcsrchr(face->file, '\\');
- if (!file) file = face->file;
- else file++;
- if (wcsicmp( file, file_name )) continue;
- face->refcount++;
- return face;
- }
+ WINE_RB_FOR_EACH_ENTRY( family, &family_name_tree, struct gdi_font_family, name_entry )
+ if ((face = family_find_face_from_filename( family, file_name ))) return face;
+ return NULL;
}
- return NULL;
+
+ if (!(family = find_family_from_name( family_name ))) return NULL;
+ return family_find_face_from_filename( family, file_name );
}
static BOOL add_family_replacement( const WCHAR *new_name, const WCHAR *replace )
More information about the wine-cvs
mailing list