Alexandre Julliard : gdi32: Move the font file information out of freetype.c.

Alexandre Julliard julliard at winehq.org
Wed Oct 21 15:15:13 CDT 2020


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Oct 21 11:02:48 2020 +0200

gdi32: Move the font file information out of freetype.c.

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

---

 dlls/gdi32/font.c        | 39 ++++++++++++++++++++++++++++++++++++--
 dlls/gdi32/freetype.c    | 49 +-----------------------------------------------
 dlls/gdi32/gdi_private.h | 12 ++----------
 3 files changed, 40 insertions(+), 60 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 5c472636035..44f159c03ef 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -422,9 +422,37 @@ void free_gdi_font( struct gdi_font *font )
 {
     if (font->private) font_funcs->destroy_font( font );
     free_font_handle( font->handle );
+    HeapFree( GetProcessHeap(), 0, font->fileinfo );
     HeapFree( GetProcessHeap(), 0, font );
 }
 
+/* Undocumented structure filled in by GetFontFileInfo */
+struct font_fileinfo
+{
+    FILETIME writetime;
+    LARGE_INTEGER size;
+    WCHAR path[1];
+};
+
+void set_gdi_font_file_info( struct gdi_font *font, const WCHAR *file, SIZE_T data_size )
+{
+    WIN32_FILE_ATTRIBUTE_DATA info;
+    int len = 0;
+
+    if (file) len = strlenW( file );
+    if (!(font->fileinfo = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+                                      offsetof( struct font_fileinfo, path[len + 1] ))))
+        return;
+
+    if (file && GetFileAttributesExW( file, GetFileExInfoStandard, &info ))
+    {
+        font->fileinfo->writetime = info.ftLastWriteTime;
+        font->fileinfo->size.QuadPart = (LONGLONG)info.nFileSizeHigh << 32 | info.nFileSizeLow;
+        strcpyW( font->fileinfo->path, file );
+    }
+    else font->fileinfo->size.QuadPart = data_size;
+}
+
 /* font cache */
 
 static struct list gdi_font_list = LIST_INIT( gdi_font_list );
@@ -5179,12 +5207,19 @@ BOOL WINAPI GetFontFileInfo( DWORD instance_id, DWORD unknown, struct font_filei
 
     if (!needed) needed = &required_size;
 
-    if (!font_funcs || !font)
+    if (!font)
     {
         *needed = 0;
         return FALSE;
     }
-    return font_funcs->pGetFontFileInfo( font, unknown, info, size, needed );
+    *needed = sizeof(*info) + strlenW( font->fileinfo->path ) * sizeof(WCHAR);
+    if (*needed > size)
+    {
+        SetLastError( ERROR_INSUFFICIENT_BUFFER );
+        return FALSE;
+    }
+    memcpy( info, font->fileinfo, *needed );
+    return TRUE;
 }
 
 struct realization_info
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 4fa88b960d0..1484260fa07 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -350,7 +350,6 @@ struct tagGdiFont {
     VOID *GSUB_Table;
     const VOID *vert_feature;
     ULONG ttc_item_offset; /* 0 if font is not a part of TrueType collection */
-    struct font_fileinfo *fileinfo;
 };
 
 static inline GdiFont *get_font_ptr( struct gdi_font *font ) { return font->private; }
@@ -4112,7 +4111,6 @@ static void CDECL freetype_destroy_font( struct gdi_font *gdi_font )
         HeapFree(GetProcessHeap(), 0, child);
     }
 
-    HeapFree(GetProcessHeap(), 0, font->fileinfo);
     if (font->ft_face) pFT_Done_Face(font->ft_face);
     if (font->mapping) unmap_font_file( font->mapping );
     HeapFree(GetProcessHeap(), 0, font->kern_pairs);
@@ -4767,30 +4765,6 @@ static const VOID * get_GSUB_vert_feature(const GdiFont *font)
     return feature;
 }
 
-static void fill_fileinfo_from_face( GdiFont *font, Face *face )
-{
-    WIN32_FILE_ATTRIBUTE_DATA info;
-    int len;
-
-    if (!face->file)
-    {
-        font->fileinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*font->fileinfo));
-        font->fileinfo->size.QuadPart = face->font_data_size;
-        return;
-    }
-
-    len = strlenW(face->file);
-    font->fileinfo = HeapAlloc(GetProcessHeap(), 0, sizeof(*font->fileinfo) + len * sizeof(WCHAR));
-    if (GetFileAttributesExW(face->file, GetFileExInfoStandard, &info))
-    {
-        font->fileinfo->writetime = info.ftLastWriteTime;
-        font->fileinfo->size.QuadPart = (LONGLONG)info.nFileSizeHigh << 32 | info.nFileSizeLow;
-        strcpyW(font->fileinfo->path, face->file);
-    }
-    else
-        memset(font->fileinfo, 0, sizeof(*font->fileinfo) + len * sizeof(WCHAR));
-}
-
 /*************************************************************
  * freetype_SelectFont
  */
@@ -5183,7 +5157,7 @@ found_face:
         goto done;
     }
 
-    fill_fileinfo_from_face( ret, face );
+    set_gdi_font_file_info( gdi_font, face->file, face->font_data_size );
     ret->ntmFlags = face->ntmFlags;
 
     pick_charmap( ret->ft_face, ret->charset );
@@ -7968,26 +7942,6 @@ static BOOL CDECL freetype_GetFontFileData( struct gdi_font *gdi_font, DWORD unk
     return get_font_data( font, tag, offset, buff, buff_size ) != 0;
 }
 
-/*************************************************************************
- * freetype_GetFontFileInfo
- */
-static BOOL CDECL freetype_GetFontFileInfo( struct gdi_font *gdi_font, DWORD unknown,
-                                            struct font_fileinfo *info, SIZE_T size, SIZE_T *needed )
-{
-    const GdiFont *font = get_font_ptr( gdi_font );
-
-    *needed = sizeof(*info) + strlenW(font->fileinfo->path) * sizeof(WCHAR);
-    if (*needed > size)
-    {
-        SetLastError(ERROR_INSUFFICIENT_BUFFER);
-        return FALSE;
-    }
-
-    /* path is included too */
-    memcpy(info, font->fileinfo, *needed);
-    return TRUE;
-}
-
 /*************************************************************************
  * Kerning support for TrueType fonts
  */
@@ -8261,7 +8215,6 @@ static const struct font_backend_funcs font_funcs =
     freetype_AddFontMemResourceEx,
     freetype_CreateScalableFontResource,
     freetype_GetFontFileData,
-    freetype_GetFontFileInfo,
     freetype_alloc_font,
     freetype_destroy_font
 };
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 7d15904fd51..09526eed499 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -301,14 +301,6 @@ struct char_width_info
     INT unk;   /* unknown */
 };
 
-/* Undocumented structure filled in by GetFontFileInfo */
-struct font_fileinfo
-{
-    FILETIME writetime;
-    LARGE_INTEGER size;
-    WCHAR path[1];
-};
-
 typedef struct { FLOAT eM11, eM12, eM21, eM22; } FMAT2;
 
 struct gdi_font
@@ -324,6 +316,7 @@ struct gdi_font
     LOGFONTW               lf;
     FMAT2                  matrix;
     BOOL                   can_use_bitmap;
+    struct font_fileinfo  *fileinfo;
 };
 
 struct font_backend_funcs
@@ -356,8 +349,6 @@ struct font_backend_funcs
                                                 LPCWSTR font_file, LPCWSTR font_path );
     BOOL  (CDECL *pGetFontFileData)( struct gdi_font *font, DWORD unknown, UINT64 offset,
                                      void *buff, DWORD buff_size );
-    BOOL  (CDECL *pGetFontFileInfo)( struct gdi_font *font, DWORD unknown,
-                                     struct font_fileinfo *info, SIZE_T size, SIZE_T *needed );
 
     BOOL  (CDECL *alloc_font)( struct gdi_font *font );
     void  (CDECL *destroy_font)( struct gdi_font *font );
@@ -368,6 +359,7 @@ extern void free_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
 extern void cache_gdi_font( struct gdi_font *font ) DECLSPEC_HIDDEN;
 extern struct gdi_font *find_cached_gdi_font( const LOGFONTW *lf, const FMAT2 *matrix,
                                               BOOL can_use_bitmap ) DECLSPEC_HIDDEN;
+extern void set_gdi_font_file_info( struct gdi_font *font, const WCHAR *file, SIZE_T data_size ) DECLSPEC_HIDDEN;
 extern void font_init(void) DECLSPEC_HIDDEN;
 
 /* freetype.c */




More information about the wine-cvs mailing list