[4/5] gdi32: Add partial support for private fonts.
Dmitry Timoshkov
dmitry at codeweavers.com
Sun Nov 14 05:06:02 CST 2010
---
dlls/gdi32/freetype.c | 79 +++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 66 insertions(+), 13 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index fdefadc..01067ce 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -270,9 +270,10 @@ typedef struct tagFace {
FONTSIGNATURE fs_links;
DWORD ntmFlags;
FT_Fixed font_version;
- BOOL scalable;
+ DWORD scalable : 1;
+ DWORD hidden : 1;
+ DWORD external : 1; /* TRUE if we should manually add this font to the registry */
Bitmap_Size size; /* set if face is a bitmap */
- BOOL external; /* TRUE if we should manually add this font to the registry */
struct tagFamily *family;
/* Cached data for Enum */
struct enum_data *cached_enum_data;
@@ -368,6 +369,8 @@ typedef struct {
#define NE_SEGFLAGS_MOVEABLE 0x0010
#define NE_SEGFLAGS_PRELOAD 0x0040
+#define FD_HIDDEN 0x80 /* Wine specific, used to recognize hidden fonts */
+
static const struct dos
{
WORD e_magic; /* 00: MZ Header signature */
@@ -908,7 +911,7 @@ static inline BOOL is_win9x(void)
return GetVersion() & 0x80000000;
}
-static char *get_scalable_resource_name(const char *file, void *font_data_ptr, DWORD font_data_size)
+static char *get_scalable_resource_name(const char *file, void *font_data_ptr, DWORD font_data_size, WORD *df_type)
{
struct dos dos;
IMAGE_OS2_HEADER os2;
@@ -988,6 +991,8 @@ static char *get_scalable_resource_name(const char *file, void *font_data_ptr, D
if (!ReadFile(hfile, &fd, fontdir_len, NULL, NULL))
goto errexit;
+ *df_type = fd.dfType;
+
if (SetFilePointer(hfile, fontpath_off, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
goto errexit;
@@ -1010,7 +1015,7 @@ errexit:
HeapFree(GetProcessHeap(), 0, fot_path);
HeapFree(GetProcessHeap(), 0, wide_path);
- TRACE("-> %s\n", ret);
+ TRACE("-> %#x, %s\n", *df_type, ret);
return ret;
}
@@ -1053,6 +1058,13 @@ static Face *find_face_from_filename(const WCHAR *file_name, const WCHAR *face_n
{
if (!face->file)
continue;
+
+ if(!strcasecmp(face->file, file_nameA))
+ {
+ HeapFree(GetProcessHeap(), 0, file_nameA);
+ return face;
+ }
+
file = strrchr(face->file, '/');
if(!file)
file = face->file;
@@ -1512,6 +1524,7 @@ static int add_font_to_global_list(const struct list *font_list,
#define ADDFONT_EXTERNAL_FONT 0x01
#define ADDFONT_FORCE_BITMAP 0x02
+#define ADDFONT_HIDDEN 0x04
static int load_font(const char *file, void *font_data_ptr, DWORD font_data_size,
struct list *font_list, DWORD flags)
@@ -1568,12 +1581,16 @@ static int load_font(const char *file, void *font_data_ptr, DWORD font_data_size
if (err != 0)
{
+ WORD type = 0;
char *scalable_rsrc_name;
- scalable_rsrc_name = get_scalable_resource_name(file, font_data_ptr, font_data_size);
+ scalable_rsrc_name = get_scalable_resource_name(file, font_data_ptr, font_data_size, &type);
if (scalable_rsrc_name)
{
- int ret = load_font(scalable_rsrc_name, NULL, 0, font_list, flags);
+ int ret;
+
+ if (type & FD_HIDDEN) flags |= ADDFONT_HIDDEN;
+ ret = load_font(scalable_rsrc_name, NULL, 0, font_list, flags);
HeapFree(GetProcessHeap(), 0, scalable_rsrc_name);
return ret;
}
@@ -1731,6 +1748,7 @@ static int load_font(const char *file, void *font_data_ptr, DWORD font_data_size
face->font_version = pHeader ? pHeader->Font_Revision : 0;
face->family = family;
face->external = (flags & ADDFONT_EXTERNAL_FONT) ? TRUE : FALSE;
+ face->hidden = (flags & ADDFONT_HIDDEN) ? TRUE : FALSE;
face->fs = fs;
memset(&face->fs_links, 0, sizeof(face->fs_links));
@@ -2407,14 +2425,14 @@ INT WineEngAddFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
if (ft_handle) /* do it only if we have freetype up and running */
{
char *unixname;
+ DWORD add_flags = ADDFONT_FORCE_BITMAP;
- if(flags)
- FIXME("Ignoring flags %x\n", flags);
+ if (flags & FR_PRIVATE) add_flags |= ADDFONT_HIDDEN;
if((unixname = wine_get_unix_file_name(file)))
{
EnterCriticalSection( &freetype_cs );
- ret = AddFontFileToList(unixname, NULL, NULL, ADDFONT_FORCE_BITMAP);
+ ret = AddFontFileToList(unixname, NULL, NULL, add_flags);
LeaveCriticalSection( &freetype_cs );
HeapFree(GetProcessHeap(), 0, unixname);
}
@@ -2474,9 +2492,42 @@ HANDLE WineEngAddFontMemResourceEx(PVOID pbFont, DWORD cbFont, PVOID pdv, DWORD
*/
BOOL WineEngRemoveFontResourceEx(LPCWSTR file, DWORD flags, PVOID pdv)
{
+ char *unix_name;
+ WCHAR *unix_nameW;
+ DWORD len;
+ Face *face;
+ BOOL ret = FALSE;
+
GDI_CheckNotLock();
- FIXME("(%s, %x, %p): stub\n", debugstr_w(file), flags, pdv);
- return TRUE;
+
+ TRACE("%s, %#x, %p\n", debugstr_w(file), flags, pdv);
+
+ unix_name = wine_get_unix_file_name(file);
+ if (!unix_name)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ len = MultiByteToWideChar(CP_UNIXCP, 0, unix_name, -1, NULL, 0);
+ unix_nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_UNIXCP, 0, unix_name, -1, unix_nameW, len);
+
+ face = find_face_from_filename(unix_nameW, NULL);
+ if (face)
+ {
+ BOOL hidden = (flags & FR_PRIVATE) ? TRUE : FALSE;
+
+ if (face->hidden == hidden)
+ {
+ FIXME("%s, %#x, %p: stub\n", debugstr_w(file), flags, pdv);
+ ret = TRUE;
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, unix_name);
+ HeapFree(GetProcessHeap(), 0, unix_nameW);
+ return ret;
}
static const struct nls_update_font_list
@@ -4405,6 +4456,7 @@ DWORD WineEngEnumFonts(LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lparam)
if(!strcmpiW(plf->lfFaceName, family->FamilyName)) {
LIST_FOR_EACH(face_elem_ptr, &family->faces) {
face = LIST_ENTRY(face_elem_ptr, Face, entry);
+ if (face->hidden) continue;
GetEnumStructs(face, &elf, &ntm, &type);
for(i = 0; i < 32; i++) {
if(!face->scalable && face->fs.fsCsb[0] == 0) { /* OEM bitmap */
@@ -4448,6 +4500,7 @@ DWORD WineEngEnumFonts(LPLOGFONTW plf, FONTENUMPROCW proc, LPARAM lparam)
family = LIST_ENTRY(family_elem_ptr, Family, entry);
face_elem_ptr = list_head(&family->faces);
face = LIST_ENTRY(face_elem_ptr, Face, entry);
+ if (face->hidden) continue;
GetEnumStructs(face, &elf, &ntm, &type);
for(i = 0; i < 32; i++) {
if(!face->scalable && face->fs.fsCsb[0] == 0) { /* OEM bitmap */
@@ -6881,7 +6934,7 @@ static void ntm_to_fontdir(const Face *face, const NEWTEXTMETRICW *ntm, struct f
fd->dfSize = 0; /* will be calculated later */
memset(fd->dfCopyright, 0, sizeof(fd->dfCopyright));
strcpy(fd->dfCopyright, "This is a TrueType font resource");
- fd->dfType = 0;
+ fd->dfType = face->hidden ? FD_HIDDEN : 0;
fd->dfPoints = ntm->ntmSizeEM;
fd->dfVertRes = 72;
fd->dfHorizRes = 72;
@@ -7090,7 +7143,7 @@ DWORD WineEngCreateScalableFontResource(DWORD flags, LPCWSTR resource, LPCWSTR f
list_init(&font_list);
- if (!load_font(unix_name, NULL, 0, &font_list, 0))
+ if (!load_font(unix_name, NULL, 0, &font_list, flags ? ADDFONT_HIDDEN : 0))
{
SetLastError(ERROR_INVALID_PARAMETER);
goto fail;
--
1.7.0.6
More information about the wine-patches
mailing list