From 35c84cddccdc81c56711494834eefa2191763c6f Mon Sep 17 00:00:00 2001 From: Kusanagi Kouichi Date: Fri, 30 Mar 2012 17:52:02 +0900 Subject: [PATCH] gdi32: Use helper functions when loading font from cache. --- dlls/gdi32/freetype.c | 221 ++++++++++++++++++++---------------------- 1 file changed, 105 insertions(+), 116 deletions(-) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index d61605eab03..fd362abc740 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -1190,6 +1190,109 @@ static WCHAR *get_face_name(FT_Face ft_face, FT_UShort name_id, FT_UShort langua return ret; } +static inline BOOL faces_equal( const Face *f1, const Face *f2 ) +{ + if (strcmpiW( f1->StyleName, f2->StyleName )) return FALSE; + if (f1->scalable) return TRUE; + if (f2->size.y_ppem != f2->size.y_ppem) return FALSE; + return !memcmp( &f1->fs, &f2->fs, sizeof(f1->fs) ); +} + +static inline void free_face( Face *face ) +{ + HeapFree( GetProcessHeap(), 0, face->file ); + HeapFree( GetProcessHeap(), 0, face->StyleName ); + HeapFree( GetProcessHeap(), 0, face->FullName ); + HeapFree( GetProcessHeap(), 0, face->cached_enum_data ); + HeapFree( GetProcessHeap(), 0, face ); +} + +static inline void free_family( Family *family ) +{ + Face *face, *cursor2; + + LIST_FOR_EACH_ENTRY_SAFE( face, cursor2, &family->faces, Face, entry ) + { + list_remove( &face->entry ); + free_face( face ); + } + HeapFree( GetProcessHeap(), 0, family->FamilyName ); + HeapFree( GetProcessHeap(), 0, family->EnglishName ); + HeapFree( GetProcessHeap(), 0, family ); +} + +static inline int style_order(const Face *face) +{ + switch (face->ntmFlags & (NTM_REGULAR | NTM_BOLD | NTM_ITALIC)) + { + case NTM_REGULAR: + return 0; + case NTM_BOLD: + return 1; + case NTM_ITALIC: + return 2; + case NTM_BOLD | NTM_ITALIC: + return 3; + default: + WARN("Don't know how to order font %s %s with flags 0x%08x\n", + debugstr_w(face->family->FamilyName), + debugstr_w(face->StyleName), + face->ntmFlags); + return 9999; + } +} + +static BOOL insert_face_in_family_list( Face *face, Family *family ) +{ + Face *cursor; + + LIST_FOR_EACH_ENTRY( cursor, &family->faces, Face, entry ) + { + if (faces_equal( face, cursor )) + { + TRACE("Already loaded font %s %s original version is %lx, this version is %lx\n", + debugstr_w(family->FamilyName), debugstr_w(face->StyleName), + cursor->font_version, face->font_version); + + if (face->font_version <= cursor->font_version) + { + TRACE("Original font is newer so skipping this one\n"); + return FALSE; + } + else + { + TRACE("Replacing original with this one\n"); + list_add_before( &cursor->entry, &face->entry ); + face->family = family; + list_remove( &cursor->entry); + free_face( cursor ); + return TRUE; + } + } + + if (style_order( face ) < style_order( cursor )) break; + } + + list_add_before( &cursor->entry, &face->entry ); + face->family = family; + return TRUE; +} + +/**************************************************************** + * NB This function stores the ptrs to the strings to save copying. + * Don't free them after calling. + */ +static Family *create_family( WCHAR *name, WCHAR *english_name ) +{ + Family * const family = HeapAlloc( GetProcessHeap(), 0, sizeof(*family) ); + family->FamilyName = name; + family->EnglishName = english_name; + list_init( &family->faces ); + family->replacement = &family->faces; + + return family; +} + static LONG reg_load_dword(HKEY hkey, const WCHAR *value, DWORD *data) { DWORD type, needed; @@ -1222,7 +1325,6 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family) RegQueryValueExA(hkey_face, "File Name", NULL, NULL, (BYTE*)face->file, &needed); face->StyleName = strdupW(face_name); - face->family = family; face->vertical = (family->FamilyName[0] == '@'); if(RegQueryValueExW(hkey_face, face_full_name_value, NULL, NULL, NULL, &needed) == ERROR_SUCCESS) @@ -1272,10 +1374,7 @@ static void load_face(HKEY hkey_face, WCHAR *face_name, Family *family) face->fs.fsUsb[0], face->fs.fsUsb[1], face->fs.fsUsb[2], face->fs.fsUsb[3]); - if(!italic && !bold) - list_add_head(&family->faces, &face->entry); - else - list_add_tail(&family->faces, &face->entry); + insert_face_in_family_list(face, family); TRACE("Added font %s %s\n", debugstr_w(family->FamilyName), debugstr_w(face->StyleName)); } @@ -1330,11 +1429,7 @@ static void load_font_list_from_cache(HKEY hkey_font_cache) RegQueryValueExW(hkey_family, english_name_value, NULL, NULL, (BYTE*)english_family, &size); } - family = HeapAlloc(GetProcessHeap(), 0, sizeof(*family)); - family->FamilyName = strdupW(family_name); - family->EnglishName = english_family; - list_init(&family->faces); - family->replacement = &family->faces; + family = create_family(strdupW(family_name), english_family); list_add_tail(&font_list, &family->entry); if(english_family) @@ -1443,30 +1538,6 @@ static void add_face_to_cache(Face *face) RegCloseKey(hkey_font_cache); } -static inline int TestStyles(DWORD flags, DWORD styles) -{ - return (flags & styles) == styles; -} - -static inline int style_order(Face *face) -{ - if (TestStyles(face->ntmFlags, NTM_BOLD | NTM_ITALIC)) - return 3; - if (TestStyles(face->ntmFlags, NTM_ITALIC)) - return 2; - if (TestStyles(face->ntmFlags, NTM_BOLD)) - return 1; - if (TestStyles(face->ntmFlags, NTM_REGULAR)) - return 0; - - WARN("Don't know how to order font %s %s with flags 0x%08x\n", - debugstr_w(face->family->FamilyName), - debugstr_w(face->StyleName), - face->ntmFlags); - - return 9999; -} - static WCHAR *prepend_at(WCHAR *family) { WCHAR *str; @@ -1505,21 +1576,6 @@ static void get_family_names( FT_Face ft_face, WCHAR **name, WCHAR **english, BO } } -/**************************************************************** - * NB This function stores the ptrs to the strings to save copying. - * Don't free them after calling. - */ -static Family *create_family( WCHAR *name, WCHAR *english_name ) -{ - Family *family = HeapAlloc( GetProcessHeap(), 0, sizeof(*family) ); - family->FamilyName = name; - family->EnglishName = english_name; - list_init( &family->faces ); - family->replacement = &family->faces; - - return family; -} - static Family *get_family( FT_Face ft_face, BOOL vertical ) { Family *family; @@ -1653,29 +1709,6 @@ static inline void get_fontsig( FT_Face ft_face, FONTSIGNATURE *fs ) } } -static inline void free_face( Face *face ) -{ - HeapFree( GetProcessHeap(), 0, face->file ); - HeapFree( GetProcessHeap(), 0, face->StyleName ); - HeapFree( GetProcessHeap(), 0, face->FullName ); - HeapFree( GetProcessHeap(), 0, face->cached_enum_data ); - HeapFree( GetProcessHeap(), 0, face ); -} - -static inline void free_family( Family *family ) -{ - Face *face, *cursor2; - - LIST_FOR_EACH_ENTRY_SAFE( face, cursor2, &family->faces, Face, entry ) - { - list_remove( &face->entry ); - free_face( face ); - } - HeapFree( GetProcessHeap(), 0, family->FamilyName ); - HeapFree( GetProcessHeap(), 0, family->EnglishName ); - HeapFree( GetProcessHeap(), 0, family ); -} - #define ADDFONT_EXTERNAL_FONT 0x01 #define ADDFONT_FORCE_BITMAP 0x02 #define ADDFONT_ADD_TO_CACHE 0x04 @@ -1738,50 +1771,6 @@ static Face *create_face( FT_Face ft_face, FT_Long face_index, const char *file, return face; } -static inline BOOL faces_equal( Face *f1, Face *f2 ) -{ - if (strcmpiW( f1->StyleName, f2->StyleName )) return FALSE; - if (f1->scalable) return TRUE; - if (f2->size.y_ppem != f2->size.y_ppem) return FALSE; - return !memcmp( &f1->fs, &f2->fs, sizeof(f1->fs) ); -} - -static BOOL insert_face_in_family_list( Face *face, Family *family ) -{ - Face *cursor; - - LIST_FOR_EACH_ENTRY( cursor, &family->faces, Face, entry ) - { - if (faces_equal( face, cursor )) - { - TRACE("Already loaded font %s %s original version is %lx, this version is %lx\n", - debugstr_w(family->FamilyName), debugstr_w(face->StyleName), - cursor->font_version, face->font_version); - - if (face->font_version <= cursor->font_version) - { - TRACE("Original font is newer so skipping this one\n"); - return FALSE; - } - else - { - TRACE("Replacing original with this one\n"); - list_add_before( &cursor->entry, &face->entry ); - face->family = family; - list_remove( &cursor->entry); - free_face( cursor ); - return TRUE; - } - } - - if (style_order( face ) < style_order( cursor )) break; - } - - list_add_before( &cursor->entry, &face->entry ); - face->family = family; - return TRUE; -} - static void AddFaceToList(FT_Face ft_face, const char *file, void *font_data_ptr, DWORD font_data_size, FT_Long face_index, DWORD flags, BOOL vertical) {