From 047bf2522304c8b5772902404f7683d4b746fe08 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Mon, 26 Oct 2020 12:04:36 +0100
Subject: [PATCH] gdi32: Move the Add/RemoveFontResource() implementation out
 of freetype.c.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
---
 dlls/gdi32/font.c        | 110 ++++++++++++++++++++++++++++++++-------
 dlls/gdi32/freetype.c    |  86 ++++++------------------------
 dlls/gdi32/gdi_private.h |  11 +++-
 3 files changed, 114 insertions(+), 93 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 2331c7cf784..2e926fa52fc 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -5293,21 +5293,99 @@ fail:
     return name;
 }
 
+static int add_system_font_resource( const WCHAR *file, DWORD flags )
+{
+    WCHAR path[MAX_PATH];
+    int ret;
+
+    /* try in %WINDIR%/fonts, needed for Fotobuch Designer */
+    get_fonts_win_dir_path( file, path );
+    EnterCriticalSection( &font_cs );
+    ret = font_funcs->add_font( path, flags );
+    LeaveCriticalSection( &font_cs );
+    /* try in datadir/fonts (or builddir/fonts), needed for Magic the Gathering Online */
+    if (!ret)
+    {
+        get_fonts_data_dir_path( file, path );
+        EnterCriticalSection( &font_cs );
+        ret = font_funcs->add_font( path, flags );
+        LeaveCriticalSection( &font_cs );
+    }
+    return ret;
+}
+
+static BOOL remove_system_font_resource( LPCWSTR file, DWORD flags )
+{
+    WCHAR path[MAX_PATH];
+    int ret;
+
+    get_fonts_win_dir_path( file, path );
+    EnterCriticalSection( &font_cs );
+    ret = font_funcs->remove_font( path, flags );
+    LeaveCriticalSection( &font_cs );
+    if (!ret)
+    {
+        get_fonts_data_dir_path( file, path );
+        EnterCriticalSection( &font_cs );
+        ret = font_funcs->remove_font( path, flags );
+        LeaveCriticalSection( &font_cs );
+    }
+    return ret;
+}
+
+static int add_font_resource( LPCWSTR file, DWORD flags )
+{
+    WCHAR path[MAX_PATH];
+    int ret = 0;
+
+    if (GetFullPathNameW( file, MAX_PATH, path, NULL ))
+    {
+        DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE;
+
+        if (!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE;
+        EnterCriticalSection( &font_cs );
+        ret = font_funcs->add_font( path, addfont_flags );
+        LeaveCriticalSection( &font_cs );
+    }
+
+    if (!ret && !strchrW( file, '\\' ))
+        ret = add_system_font_resource( file, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
+
+    return ret;
+}
+
+static BOOL remove_font_resource( LPCWSTR file, DWORD flags )
+{
+    WCHAR path[MAX_PATH];
+    BOOL ret = FALSE;
+
+    if (GetFullPathNameW( file, MAX_PATH, path, NULL ))
+    {
+        DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE;
+
+        if (!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE;
+        EnterCriticalSection( &font_cs );
+        ret = font_funcs->remove_font( path, addfont_flags );
+        LeaveCriticalSection( &font_cs );
+    }
+
+    if (!ret && !strchrW( file, '\\' ))
+        ret = remove_system_font_resource( file, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
+
+    return ret;
+}
+
 /***********************************************************************
  *           AddFontResourceExW    (GDI32.@)
  */
-INT WINAPI AddFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv )
+INT WINAPI AddFontResourceExW( LPCWSTR str, DWORD flags, PVOID pdv )
 {
     int ret;
     WCHAR *filename;
     BOOL hidden;
 
     if (!font_funcs) return 1;
-    EnterCriticalSection( &font_cs );
-    ret = font_funcs->pAddFontResourceEx( str, fl, pdv );
-    LeaveCriticalSection( &font_cs );
-
-    if (!ret)
+    if (!(ret = add_font_resource( str, flags )))
     {
         /* FreeType <2.3.5 has problems reading resources wrapped in PE files. */
         HMODULE hModule = LoadLibraryExW(str, NULL, LOAD_LIBRARY_AS_DATAFILE);
@@ -5324,10 +5402,8 @@ INT WINAPI AddFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv )
         }
         else if ((filename = get_scalable_filename( str, &hidden )) != NULL)
         {
-            if (hidden) fl |= FR_PRIVATE | FR_NOT_ENUM;
-            EnterCriticalSection( &font_cs );
-            ret = font_funcs->pAddFontResourceEx( filename, fl, pdv );
-            LeaveCriticalSection( &font_cs );
+            if (hidden) flags |= FR_PRIVATE | FR_NOT_ENUM;
+            ret = add_font_resource( filename, flags );
             HeapFree( GetProcessHeap(), 0, filename );
         }
     }
@@ -5411,7 +5487,7 @@ BOOL WINAPI RemoveFontResourceExA( LPCSTR str, DWORD fl, PVOID pdv )
 /***********************************************************************
  *           RemoveFontResourceExW    (GDI32.@)
  */
-BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv )
+BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD flags, PVOID pdv )
 {
     int ret;
     WCHAR *filename;
@@ -5419,11 +5495,7 @@ BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv )
 
     if (!font_funcs) return TRUE;
 
-    EnterCriticalSection( &font_cs );
-    ret = font_funcs->pRemoveFontResourceEx( str, fl, pdv );
-    LeaveCriticalSection( &font_cs );
-
-    if (!ret)
+    if (!(ret = remove_font_resource( str, flags )))
     {
         /* FreeType <2.3.5 has problems reading resources wrapped in PE files. */
         HMODULE hModule = LoadLibraryExW(str, NULL, LOAD_LIBRARY_AS_DATAFILE);
@@ -5434,10 +5506,8 @@ BOOL WINAPI RemoveFontResourceExW( LPCWSTR str, DWORD fl, PVOID pdv )
         }
         else if ((filename = get_scalable_filename( str, &hidden )) != NULL)
         {
-            if (hidden) fl |= FR_PRIVATE | FR_NOT_ENUM;
-            EnterCriticalSection( &font_cs );
-            ret = font_funcs->pRemoveFontResourceEx( filename, fl, pdv );
-            LeaveCriticalSection( &font_cs );
+            if (hidden) flags |= FR_PRIVATE | FR_NOT_ENUM;
+            ret = remove_font_resource( filename, flags );
             HeapFree( GetProcessHeap(), 0, filename );
         }
     }
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 7129acfeb5c..286af040355 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -272,13 +272,6 @@ typedef struct tagFace {
 
 #define FS_DBCS_MASK (FS_JISJAPAN|FS_CHINESESIMP|FS_WANSUNG|FS_CHINESETRAD|FS_JOHAB)
 
-#define ADDFONT_EXTERNAL_FONT 0x01
-#define ADDFONT_ALLOW_BITMAP  0x02
-#define ADDFONT_ADD_TO_CACHE  0x04
-#define ADDFONT_ADD_RESOURCE  0x08  /* added through AddFontResource */
-#define ADDFONT_VERTICAL_FONT 0x10
-#define ADDFONT_AA_FLAGS(flags) ((flags) << 16)
-
 typedef struct tagFamily {
     struct list entry;
     unsigned int refcount;
@@ -2098,7 +2091,10 @@ static INT AddFontToList(const WCHAR *dos_name, const char *unix_name, void *fon
     return ret;
 }
 
-static int add_font_resource( const WCHAR *file, DWORD flags )
+/*************************************************************
+ * freetype_add_font
+ */
+static INT CDECL freetype_add_font( const WCHAR *file, DWORD flags )
 {
     int ret = 0;
     char *unixname = wine_get_unix_file_name( file );
@@ -2111,7 +2107,10 @@ static int add_font_resource( const WCHAR *file, DWORD flags )
     return ret;
 }
 
-static int remove_font_resource( const WCHAR *file, DWORD flags )
+/*************************************************************
+ * freetype_remove_font
+ */
+static INT CDECL freetype_remove_font( const WCHAR *file, DWORD flags )
 {
     Family *family, *family_next;
     Face *face, *face_next;
@@ -2867,10 +2866,10 @@ static void load_system_fonts(void)
             if(RegQueryValueExW(hkey, *value, 0, &type, (void*)data, &dlen) == ERROR_SUCCESS &&
                type == REG_SZ) {
                 get_fonts_win_dir_path( data, pathW );
-                if (!add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ))
+                if (!freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ))
                 {
                     get_fonts_data_dir_path( data, pathW );
-                    add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
+                    freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
                 }
             }
         }
@@ -3050,34 +3049,6 @@ static void delete_external_font_keys(void)
     if(winnt_key) RegCloseKey(winnt_key);
 }
 
-/*************************************************************
- * freetype_AddFontResourceEx
- *
- */
-static INT CDECL freetype_AddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
-{
-    WCHAR path[MAX_PATH];
-    INT ret = 0;
-    DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE;
-
-    if (!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE;
-    if (GetFullPathNameW( file, MAX_PATH, path, NULL ))
-        ret = add_font_resource( path, addfont_flags );
-
-    if (!ret && !strchrW(file, '\\')) {
-        /* Try in %WINDIR%/fonts, needed for Fotobuch Designer */
-        get_fonts_win_dir_path( file, path );
-        ret = add_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
-        /* Try in datadir/fonts (or builddir/fonts), needed for Magic the Gathering Online */
-        if (!ret)
-        {
-            get_fonts_data_dir_path( file, path );
-            ret = add_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
-        }
-    }
-    return ret;
-}
-
 /*************************************************************
  * freetype_AddFontMemResourceEx
  *
@@ -3103,33 +3074,6 @@ static HANDLE CDECL freetype_AddFontMemResourceEx(PVOID pbFont, DWORD cbFont, PV
     return (HANDLE)(((INT_PTR)pFontCopy)^0x87654321);
 }
 
-/*************************************************************
- * freetype_RemoveFontResourceEx
- *
- */
-static BOOL CDECL freetype_RemoveFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
-{
-    WCHAR path[MAX_PATH];
-    INT ret = 0;
-    DWORD addfont_flags = ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE;
-
-    if(!(flags & FR_PRIVATE)) addfont_flags |= ADDFONT_ADD_TO_CACHE;
-    if (GetFullPathNameW( file, MAX_PATH, path, NULL ))
-        ret = remove_font_resource( path, addfont_flags );
-
-    if (!ret && !strchrW(file, '\\'))
-    {
-        get_fonts_win_dir_path( file, path );
-        ret = remove_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
-        if (!ret)
-        {
-            get_fonts_data_dir_path( file, path );
-            ret = remove_font_resource( path, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
-        }
-    }
-    return ret;
-}
-
 static WCHAR *get_ttf_file_name( LPCWSTR font_file, LPCWSTR font_path )
 {
     WCHAR *fullname;
@@ -3565,17 +3509,17 @@ static void init_font_list(void)
             {
                 if(data[0] && (data[1] == ':'))
                 {
-                    add_font_resource( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
+                    freetype_add_font( data, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE);
                 }
                 else if(dlen / 2 >= 6 && !strcmpiW(data + dlen / 2 - 5, dot_fonW))
                 {
                     WCHAR pathW[MAX_PATH];
 
                     get_fonts_win_dir_path( data, pathW );
-                    if (!add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ))
+                    if (!freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE ))
                     {
                         get_fonts_data_dir_path( data, pathW );
-                        add_font_resource( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
+                        freetype_add_font( pathW, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_TO_CACHE );
                     }
                 }
                 /* reset dlen and vlen */
@@ -7533,10 +7477,10 @@ static const struct font_backend_funcs font_funcs =
     freetype_GetCharWidthInfo,
     freetype_GetFontUnicodeRanges,
     freetype_SelectFont,
-    freetype_AddFontResourceEx,
-    freetype_RemoveFontResourceEx,
     freetype_AddFontMemResourceEx,
     freetype_CreateScalableFontResource,
+    freetype_add_font,
+    freetype_remove_font,
     freetype_alloc_font,
     freetype_get_font_data,
     freetype_get_glyph_index,
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index d7680464b6a..4fd59cfd9bc 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -355,6 +355,13 @@ struct gdi_font
 #define MS_TTCF_TAG MS_MAKE_TAG('t', 't', 'c', 'f')
 #define MS_VDMX_TAG MS_MAKE_TAG('V', 'D', 'M', 'X')
 
+#define ADDFONT_EXTERNAL_FONT 0x01
+#define ADDFONT_ALLOW_BITMAP  0x02
+#define ADDFONT_ADD_TO_CACHE  0x04
+#define ADDFONT_ADD_RESOURCE  0x08  /* added through AddFontResource */
+#define ADDFONT_VERTICAL_FONT 0x10
+#define ADDFONT_AA_FLAGS(flags) ((flags) << 16)
+
 struct font_backend_funcs
 {
     BOOL  (CDECL *pEnumFonts)( LOGFONTW *lf, FONTENUMPROCW proc, LPARAM lparam );
@@ -363,11 +370,11 @@ struct font_backend_funcs
     DWORD (CDECL *pGetFontUnicodeRanges)( struct gdi_font *font, GLYPHSET *glyphset );
     struct gdi_font * (CDECL *pSelectFont)( DC *dc, HFONT hfont, UINT *aa_flags, UINT default_aa_flags );
 
-    INT   (CDECL *pAddFontResourceEx)( LPCWSTR file, DWORD flags, PVOID pdv );
-    INT   (CDECL *pRemoveFontResourceEx)( LPCWSTR file, DWORD flags, PVOID pdv );
     HANDLE (CDECL *pAddFontMemResourceEx)( void *font, DWORD size, PVOID pdv, DWORD *count );
     BOOL  (CDECL *pCreateScalableFontResource)( DWORD hidden, LPCWSTR resource,
                                                 LPCWSTR font_file, LPCWSTR font_path );
+    INT   (CDECL *add_font)( const WCHAR *file, DWORD flags );
+    BOOL  (CDECL *remove_font)( const WCHAR *file, DWORD flags );
 
     BOOL  (CDECL *alloc_font)( struct gdi_font *font );
     DWORD (CDECL *get_font_data)( struct gdi_font *gdi_font, DWORD table, DWORD offset,
-- 
GitLab