Alexandre Julliard : gdi32: Move the AddFontMemResourceEx() implementation out of freetype.c.

Alexandre Julliard julliard at winehq.org
Mon Oct 26 16:59:42 CDT 2020


Module: wine
Branch: master
Commit: f6d9908e4864efd59e26c41129aeef6880c53b22
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f6d9908e4864efd59e26c41129aeef6880c53b22

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Oct 26 12:05:19 2020 +0100

gdi32: Move the AddFontMemResourceEx() implementation out of freetype.c.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/font.c        | 44 +++++++++++++++++++++++++++++---------------
 dlls/gdi32/freetype.c    | 35 +++++++++--------------------------
 dlls/gdi32/gdi_private.h |  2 +-
 3 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 2e926fa52fc..af87c66498f 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -5429,34 +5429,48 @@ BOOL WINAPI RemoveFontResourceW( LPCWSTR str )
 /***********************************************************************
  *           AddFontMemResourceEx    (GDI32.@)
  */
-HANDLE WINAPI AddFontMemResourceEx( PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts)
+HANDLE WINAPI AddFontMemResourceEx( PVOID ptr, DWORD size, PVOID pdv, DWORD *pcFonts )
 {
     HANDLE ret;
     DWORD num_fonts;
+    void *copy;
 
-    if (!pbFont || !cbFont || !pcFonts)
+    if (!ptr || !size || !pcFonts)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
         return NULL;
     }
     if (!font_funcs) return NULL;
+    if (!(copy = HeapAlloc( GetProcessHeap(), 0, size ))) return NULL;
+    memcpy( copy, ptr, size );
+
     EnterCriticalSection( &font_cs );
-    ret = font_funcs->pAddFontMemResourceEx( pbFont, cbFont, pdv, &num_fonts );
+    num_fonts = font_funcs->add_mem_font( copy, size, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE );
     LeaveCriticalSection( &font_cs );
-    if (ret)
+
+    if (!num_fonts)
     {
-        __TRY
-        {
-            *pcFonts = num_fonts;
-        }
-        __EXCEPT_PAGE_FAULT
-        {
-            WARN("page fault while writing to *pcFonts (%p)\n", pcFonts);
-            RemoveFontMemResourceEx(ret);
-            ret = 0;
-        }
-        __ENDTRY
+        HeapFree( GetProcessHeap(), 0, copy );
+        return NULL;
+    }
+
+    /* FIXME: is the handle only for use in RemoveFontMemResourceEx or should it be a true handle?
+     * For now return something unique but quite random
+     */
+    ret = (HANDLE)((INT_PTR)copy ^ 0x87654321);
+
+    __TRY
+    {
+        *pcFonts = num_fonts;
+    }
+    __EXCEPT_PAGE_FAULT
+    {
+        WARN("page fault while writing to *pcFonts (%p)\n", pcFonts);
+        RemoveFontMemResourceEx( ret );
+        ret = 0;
     }
+    __ENDTRY
+    TRACE( "Returning handle %p\n", ret );
     return ret;
 }
 
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 286af040355..9ed6077443f 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -2107,6 +2107,14 @@ static INT CDECL freetype_add_font( const WCHAR *file, DWORD flags )
     return ret;
 }
 
+/*************************************************************
+ * freetype_add_mem_font
+ */
+static INT CDECL freetype_add_mem_font( void *ptr, SIZE_T size, DWORD flags )
+{
+    return AddFontToList( NULL, NULL, ptr, size, flags );
+}
+
 /*************************************************************
  * freetype_remove_font
  */
@@ -3049,31 +3057,6 @@ static void delete_external_font_keys(void)
     if(winnt_key) RegCloseKey(winnt_key);
 }
 
-/*************************************************************
- * freetype_AddFontMemResourceEx
- *
- */
-static HANDLE CDECL freetype_AddFontMemResourceEx(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD *pcFonts)
-{
-    PVOID pFontCopy = HeapAlloc(GetProcessHeap(), 0, cbFont);
-
-    TRACE("Copying %d bytes of data from %p to %p\n", cbFont, pbFont, pFontCopy);
-    memcpy(pFontCopy, pbFont, cbFont);
-
-    *pcFonts = AddFontToList(NULL, NULL, pFontCopy, cbFont, ADDFONT_ALLOW_BITMAP | ADDFONT_ADD_RESOURCE);
-    if (*pcFonts == 0)
-    {
-        TRACE("AddFontToList failed\n");
-        HeapFree(GetProcessHeap(), 0, pFontCopy);
-        return 0;
-    }
-    /* FIXME: is the handle only for use in RemoveFontMemResourceEx or should it be a true handle?
-     * For now return something unique but quite random
-     */
-    TRACE("Returning handle %lx\n", ((INT_PTR)pFontCopy)^0x87654321);
-    return (HANDLE)(((INT_PTR)pFontCopy)^0x87654321);
-}
-
 static WCHAR *get_ttf_file_name( LPCWSTR font_file, LPCWSTR font_path )
 {
     WCHAR *fullname;
@@ -7477,9 +7460,9 @@ static const struct font_backend_funcs font_funcs =
     freetype_GetCharWidthInfo,
     freetype_GetFontUnicodeRanges,
     freetype_SelectFont,
-    freetype_AddFontMemResourceEx,
     freetype_CreateScalableFontResource,
     freetype_add_font,
+    freetype_add_mem_font,
     freetype_remove_font,
     freetype_alloc_font,
     freetype_get_font_data,
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 4fd59cfd9bc..32cdace5c7d 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -370,10 +370,10 @@ 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 );
 
-    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 );
+    INT   (CDECL *add_mem_font)( void *ptr, SIZE_T size, DWORD flags );
     BOOL  (CDECL *remove_font)( const WCHAR *file, DWORD flags );
 
     BOOL  (CDECL *alloc_font)( struct gdi_font *font );




More information about the wine-cvs mailing list