Module: wine Branch: master Commit: d26462b52a1042b1bfaaf10bd8e0cb18ddd12cbf URL: https://source.winehq.org/git/wine.git/?a=commit;h=d26462b52a1042b1bfaaf10bd...
Author: Alexandre Julliard julliard@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@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 */