[3/4] gdi32: Add partial support for private fonts.

Dmitry Timoshkov dmitry at codeweavers.com
Sun Nov 14 04:41:51 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 de3c3b0..3d7117f 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