[1/2] gdi32: Use helper functions when loading font from cache. (try 2)

Kusanagi Kouichi slash at ac.auone-net.jp
Fri Mar 30 03:52:02 CDT 2012


Signed-off-by: Kusanagi Kouichi <slash at ac.auone-net.jp>
---
 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 d61605e..fd362ab 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)
 {
-- 
1.7.9.5




More information about the wine-patches mailing list