[4/6] gdi32: Add vertical fonts to font list. (try 3)

Kusanagi Kouichi slash at ac.auone-net.jp
Thu Dec 8 08:17:37 CST 2011


Signed-off-by: Kusanagi Kouichi <slash at ac.auone-net.jp>
---
 dlls/gdi32/freetype.c   |  476 +++++++++++++++++++++++++----------------------
 dlls/gdi32/tests/font.c |    4 -
 2 files changed, 255 insertions(+), 225 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 229517a..44e2565 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1446,21 +1446,250 @@ static void AddFaceToFamily(Face *face, Family *family)
 #define ADDFONT_FORCE_BITMAP  0x02
 #define ADDFONT_ADD_TO_CACHE  0x04
 
-static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_size, char *fake_family, const WCHAR *target_family, DWORD flags)
+static WCHAR *prepend_at(WCHAR *family)
 {
-    FT_Face ft_face;
-    TT_OS2 *pOS2;
-    TT_Header *pHeader = NULL;
-    WCHAR *english_family, *localised_family, *StyleW;
-    DWORD len;
+    WCHAR *str;
+
+    if (!family)
+        return NULL;
+
+    str = HeapAlloc(GetProcessHeap(), 0, sizeof (WCHAR) * (strlenW(family) + 2));
+    str[0] = L'@';
+    strcpyW(str + 1, family);
+    HeapFree(GetProcessHeap(), 0, family);
+    return str;
+}
+
+static void AddFaceToList(FT_Face ft_face, const char *fake_family, const char *file, void *font_data_ptr, DWORD font_data_size, FT_Long face_index, DWORD flags, BOOL vertical)
+{
+    int bitmap_num = 0;
     Family *family;
-    Face *face;
-    struct list *family_elem_ptr, *face_elem_ptr;
-    FT_Error err;
+    WCHAR *StyleW;
+
+    do {
+        TT_OS2 *pOS2;
+        TT_Header *pHeader = NULL;
+        WCHAR *english_family, *localised_family;
+        DWORD len;
+        Face *face;
+        struct list *face_elem_ptr;
+        FT_WinFNT_HeaderRec winfnt_header;
+        int internal_leading;
+        FONTSIGNATURE fs;
+        My_FT_Bitmap_Size *size = NULL;
+        FT_ULong tmp_size;
+
+        if(!FT_IS_SCALABLE(ft_face))
+            size = (My_FT_Bitmap_Size *)ft_face->available_sizes + bitmap_num;
+
+        if (fake_family)
+        {
+            len = MultiByteToWideChar(CP_ACP, 0, fake_family, -1, NULL, 0);
+            english_family = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+            MultiByteToWideChar(CP_ACP, 0, fake_family, -1, english_family, len);
+
+            localised_family = NULL;
+        }
+        else
+        {
+            english_family = get_face_name(ft_face, TT_NAME_ID_FONT_FAMILY, TT_MS_LANGID_ENGLISH_UNITED_STATES);
+            if (!english_family)
+            {
+                len = MultiByteToWideChar(CP_ACP, 0, ft_face->family_name, -1, NULL, 0);
+                english_family = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+                MultiByteToWideChar(CP_ACP, 0, ft_face->family_name, -1, english_family, len);
+            }
+
+            localised_family = get_face_name(ft_face, TT_NAME_ID_FONT_FAMILY, GetUserDefaultLCID());
+            if (localised_family && !strcmpiW(localised_family, english_family))
+            {
+                HeapFree(GetProcessHeap(), 0, localised_family);
+                localised_family = NULL;
+            }
+        }
+
+        if (vertical)
+        {
+            english_family = prepend_at(english_family);
+            localised_family = prepend_at(localised_family);
+        }
+
+        family = find_family_from_name(localised_family ? localised_family : english_family);
+        if(!family) {
+            family = HeapAlloc(GetProcessHeap(), 0, sizeof(*family));
+            family->FamilyName = strdupW(localised_family ? localised_family : english_family);
+            family->EnglishName = localised_family ? strdupW(english_family) : NULL;
+            list_init(&family->faces);
+            list_add_tail(&font_list, &family->entry);
+
+            if(localised_family) {
+                FontSubst *subst = HeapAlloc(GetProcessHeap(), 0, sizeof(*subst));
+                subst->from.name = strdupW(english_family);
+                subst->from.charset = -1;
+                subst->to.name = strdupW(localised_family);
+                subst->to.charset = -1;
+                add_font_subst(&font_subst_list, subst, 0);
+            }
+        }
+        HeapFree(GetProcessHeap(), 0, localised_family);
+        HeapFree(GetProcessHeap(), 0, english_family);
+
+        len = MultiByteToWideChar(CP_ACP, 0, ft_face->style_name, -1, NULL, 0);
+        StyleW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+        MultiByteToWideChar(CP_ACP, 0, ft_face->style_name, -1, StyleW, len);
+
+        internal_leading = 0;
+        memset(&fs, 0, sizeof(fs));
+
+        pOS2 = pFT_Get_Sfnt_Table(ft_face, ft_sfnt_os2);
+        if(pOS2) {
+            fs.fsCsb[0] = pOS2->ulCodePageRange1;
+            fs.fsCsb[1] = pOS2->ulCodePageRange2;
+            fs.fsUsb[0] = pOS2->ulUnicodeRange1;
+            fs.fsUsb[1] = pOS2->ulUnicodeRange2;
+            fs.fsUsb[2] = pOS2->ulUnicodeRange3;
+            fs.fsUsb[3] = pOS2->ulUnicodeRange4;
+            if(pOS2->version == 0) {
+                FT_UInt dummy;
+
+                if(pFT_Get_First_Char( ft_face, &dummy ) < 0x100)
+                    fs.fsCsb[0] |= FS_LATIN1;
+                else
+                    fs.fsCsb[0] |= FS_SYMBOL;
+            }
+        }
+        else if(!pFT_Get_WinFNT_Header(ft_face, &winfnt_header)) {
+            CHARSETINFO csi;
+            TRACE("pix_h %d charset %d dpi %dx%d pt %d\n", winfnt_header.pixel_height, winfnt_header.charset,
+                  winfnt_header.vertical_resolution,winfnt_header.horizontal_resolution, winfnt_header.nominal_point_size);
+            if(TranslateCharsetInfo((DWORD*)(UINT_PTR)winfnt_header.charset, &csi, TCI_SRCCHARSET))
+                fs = csi.fs;
+            internal_leading = winfnt_header.internal_leading;
+        }
+
+        pHeader = pFT_Get_Sfnt_Table(ft_face, ft_sfnt_head);
+        LIST_FOR_EACH(face_elem_ptr, &family->faces) {
+            face = LIST_ENTRY(face_elem_ptr, Face, entry);
+            if(!strcmpiW(face->StyleName, StyleW) &&
+               (FT_IS_SCALABLE(ft_face) || ((size->y_ppem == face->size.y_ppem) && !memcmp(&fs, &face->fs, sizeof(fs)) ))) {
+                TRACE("Already loaded font %s %s original version is %lx, this version is %lx\n",
+                      debugstr_w(family->FamilyName), debugstr_w(StyleW),
+                      face->font_version,  pHeader ? pHeader->Font_Revision : 0);
+
+                if(fake_family) {
+                    TRACE("This font is a replacement but the original really exists, so we'll skip the replacement\n");
+                    HeapFree(GetProcessHeap(), 0, StyleW);
+                    return;
+                }
+                if(!pHeader || pHeader->Font_Revision <= face->font_version) {
+                    TRACE("Original font is newer so skipping this one\n");
+                    HeapFree(GetProcessHeap(), 0, StyleW);
+                    return;
+                } else {
+                    TRACE("Replacing original with this one\n");
+                    list_remove(&face->entry);
+                    HeapFree(GetProcessHeap(), 0, face->file);
+                    HeapFree(GetProcessHeap(), 0, face->StyleName);
+                    HeapFree(GetProcessHeap(), 0, face->FullName);
+                    HeapFree(GetProcessHeap(), 0, face);
+                    break;
+                }
+            }
+        }
+        face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face));
+        face->cached_enum_data = NULL;
+        face->StyleName = StyleW;
+        face->FullName = get_face_name(ft_face, TT_NAME_ID_FULL_NAME, TT_MS_LANGID_ENGLISH_UNITED_STATES);
+        if (file)
+        {
+            face->file = strdupA(file);
+            face->font_data_ptr = NULL;
+            face->font_data_size = 0;
+        }
+        else
+        {
+            face->file = NULL;
+            face->font_data_ptr = font_data_ptr;
+            face->font_data_size = font_data_size;
+        }
+        face->face_index = face_index;
+        face->ntmFlags = 0;
+        if (ft_face->style_flags & FT_STYLE_FLAG_ITALIC)
+            face->ntmFlags |= NTM_ITALIC;
+        if (ft_face->style_flags & FT_STYLE_FLAG_BOLD)
+            face->ntmFlags |= NTM_BOLD;
+        if (face->ntmFlags == 0) face->ntmFlags = NTM_REGULAR;
+        face->font_version = pHeader ? pHeader->Font_Revision : 0;
+        face->family = family;
+        face->external = (flags & ADDFONT_EXTERNAL_FONT) ? TRUE : FALSE;
+        face->fs = fs;
+        memset(&face->fs_links, 0, sizeof(face->fs_links));
+
+        if(FT_IS_SCALABLE(ft_face)) {
+            memset(&face->size, 0, sizeof(face->size));
+            face->scalable = TRUE;
+        } else {
+            TRACE("Adding bitmap size h %d w %d size %ld x_ppem %ld y_ppem %ld\n",
+                  size->height, size->width, size->size >> 6,
+                  size->x_ppem >> 6, size->y_ppem >> 6);
+            face->size.height = size->height;
+            face->size.width = size->width;
+            face->size.size = size->size;
+            face->size.x_ppem = size->x_ppem;
+            face->size.y_ppem = size->y_ppem;
+            face->size.internal_leading = internal_leading;
+            face->scalable = FALSE;
+        }
+
+        /* check for the presence of the 'CFF ' table to check if the font is Type1 */
+        tmp_size = 0;
+        if (!pFT_Load_Sfnt_Table(ft_face, FT_MAKE_TAG('C','F','F',' '), 0, NULL, &tmp_size))
+        {
+            TRACE("Font %s/%p is OTF Type1\n", wine_dbgstr_a(file), font_data_ptr);
+            face->ntmFlags |= NTM_PS_OPENTYPE;
+        }
+
+        TRACE("fsCsb = %08x %08x/%08x %08x %08x %08x\n",
+              face->fs.fsCsb[0], face->fs.fsCsb[1],
+              face->fs.fsUsb[0], face->fs.fsUsb[1],
+              face->fs.fsUsb[2], face->fs.fsUsb[3]);
+
+
+        if(face->fs.fsCsb[0] == 0)
+        {
+            int i;
+
+            /* let's see if we can find any interesting cmaps */
+            for(i = 0; i < ft_face->num_charmaps; i++) {
+                switch(ft_face->charmaps[i]->encoding) {
+                case FT_ENCODING_UNICODE:
+                case FT_ENCODING_APPLE_ROMAN:
+			face->fs.fsCsb[0] |= FS_LATIN1;
+                    break;
+                case FT_ENCODING_MS_SYMBOL:
+                    face->fs.fsCsb[0] |= FS_SYMBOL;
+                    break;
+                default:
+                    break;
+                }
+            }
+        }
+
+        if(flags & ADDFONT_ADD_TO_CACHE)
+            add_face_to_cache(face);
+
+        AddFaceToFamily(face, family);
+
+    } while(!FT_IS_SCALABLE(ft_face) && ++bitmap_num < ft_face->num_fixed_sizes);
+
+    TRACE("Added font %s %s\n", debugstr_w(family->FamilyName),
+          debugstr_w(StyleW));
+}
+
+static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_size, const char *fake_family, const WCHAR *target_family, DWORD flags)
+{
     FT_Long face_index = 0, num_faces;
-    FT_WinFNT_HeaderRec winfnt_header;
-    int i, bitmap_num, internal_leading;
-    FONTSIGNATURE fs;
+    INT ret = 0;
 
     /* we always load external fonts from files - otherwise we would get a crash in update_reg_entries */
     assert(file || !(flags & ADDFONT_EXTERNAL_FONT));
@@ -1487,6 +1716,11 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
 #endif /* HAVE_CARBON_CARBON_H */
 
     do {
+        FT_Error err;
+        FT_Face ft_face;
+        TT_OS2 *pOS2;
+        TT_Header *pHeader = NULL;
+
         if (file)
         {
             TRACE("Loading font file %s index %ld\n", debugstr_a(file), face_index);
@@ -1557,7 +1791,7 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
 
         if (target_family)
         {
-            localised_family = get_face_name(ft_face, TT_NAME_ID_FONT_FAMILY, GetUserDefaultLCID());
+            WCHAR * const localised_family = get_face_name(ft_face, TT_NAME_ID_FONT_FAMILY, GetUserDefaultLCID());
             if (localised_family && strcmpiW(localised_family,target_family)!=0)
             {
                 TRACE("Skipping Index %i: Incorrect Family name for replacement\n",(INT)face_index);
@@ -1569,219 +1803,19 @@ static INT AddFontToList(const char *file, void *font_data_ptr, DWORD font_data_
             HeapFree(GetProcessHeap(), 0, localised_family);
         }
 
-        bitmap_num = 0;
-        do {
-            My_FT_Bitmap_Size *size = NULL;
-            FT_ULong tmp_size;
-
-            if(!FT_IS_SCALABLE(ft_face))
-                size = (My_FT_Bitmap_Size *)ft_face->available_sizes + bitmap_num;
-
-            if(fake_family)
-            {
-                len = MultiByteToWideChar(CP_ACP, 0, fake_family, -1, NULL, 0);
-                english_family = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-                MultiByteToWideChar(CP_ACP, 0, fake_family, -1, english_family, len);
-            }
-            else
-            {
-                english_family = get_face_name(ft_face, TT_NAME_ID_FONT_FAMILY, TT_MS_LANGID_ENGLISH_UNITED_STATES);
-                if(!english_family)
-                {
-                    len = MultiByteToWideChar(CP_ACP, 0, ft_face->family_name, -1, NULL, 0);
-                    english_family = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-                    MultiByteToWideChar(CP_ACP, 0, ft_face->family_name, -1, english_family, len);
-                }
-            }
-
-            localised_family = NULL;
-            if(!fake_family) {
-                localised_family = get_face_name(ft_face, TT_NAME_ID_FONT_FAMILY, GetUserDefaultLCID());
-                if(localised_family && !strcmpiW(localised_family, english_family)) {
-                    HeapFree(GetProcessHeap(), 0, localised_family);
-                    localised_family = NULL;
-                }
-            }
-
-            family = NULL;
-            LIST_FOR_EACH(family_elem_ptr, &font_list) {
-                family = LIST_ENTRY(family_elem_ptr, Family, entry);
-                if(!strcmpiW(family->FamilyName, localised_family ? localised_family : english_family))
-                    break;
-                family = NULL;
-            }
-            if(!family) {
-                family = HeapAlloc(GetProcessHeap(), 0, sizeof(*family));
-                family->FamilyName = strdupW(localised_family ? localised_family : english_family);
-                family->EnglishName = localised_family ? strdupW(english_family) : NULL;
-                list_init(&family->faces);
-                list_add_tail(&font_list, &family->entry);
-
-                if(localised_family) {
-                    FontSubst *subst = HeapAlloc(GetProcessHeap(), 0, sizeof(*subst));
-                    subst->from.name = strdupW(english_family);
-                    subst->from.charset = -1;
-                    subst->to.name = strdupW(localised_family);
-                    subst->to.charset = -1;
-                    add_font_subst(&font_subst_list, subst, 0);
-                }
-            }
-            HeapFree(GetProcessHeap(), 0, localised_family);
-            HeapFree(GetProcessHeap(), 0, english_family);
-
-            len = MultiByteToWideChar(CP_ACP, 0, ft_face->style_name, -1, NULL, 0);
-            StyleW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-            MultiByteToWideChar(CP_ACP, 0, ft_face->style_name, -1, StyleW, len);
+        AddFaceToList(ft_face, fake_family, file, font_data_ptr, font_data_size, face_index, flags, FALSE);
+        ++ret;
 
-            internal_leading = 0;
-            memset(&fs, 0, sizeof(fs));
-
-            pOS2 = pFT_Get_Sfnt_Table(ft_face, ft_sfnt_os2);
-            if(pOS2) {
-                fs.fsCsb[0] = pOS2->ulCodePageRange1;
-                fs.fsCsb[1] = pOS2->ulCodePageRange2;
-                fs.fsUsb[0] = pOS2->ulUnicodeRange1;
-                fs.fsUsb[1] = pOS2->ulUnicodeRange2;
-                fs.fsUsb[2] = pOS2->ulUnicodeRange3;
-                fs.fsUsb[3] = pOS2->ulUnicodeRange4;
-                if(pOS2->version == 0) {
-                    FT_UInt dummy;
-
-                    if(pFT_Get_First_Char( ft_face, &dummy ) < 0x100)
-                        fs.fsCsb[0] |= FS_LATIN1;
-                    else
-                        fs.fsCsb[0] |= FS_SYMBOL;
-                }
-            }
-            else if(!pFT_Get_WinFNT_Header(ft_face, &winfnt_header)) {
-                CHARSETINFO csi;
-                TRACE("pix_h %d charset %d dpi %dx%d pt %d\n", winfnt_header.pixel_height, winfnt_header.charset,
-                      winfnt_header.vertical_resolution,winfnt_header.horizontal_resolution, winfnt_header.nominal_point_size);
-                if(TranslateCharsetInfo((DWORD*)(UINT_PTR)winfnt_header.charset, &csi, TCI_SRCCHARSET))
-                    fs = csi.fs;
-                internal_leading = winfnt_header.internal_leading;
-            }
-
-            face_elem_ptr = list_head(&family->faces);
-            while(face_elem_ptr) {
-                face = LIST_ENTRY(face_elem_ptr, Face, entry);
-                face_elem_ptr = list_next(&family->faces, face_elem_ptr);
-                if(!strcmpiW(face->StyleName, StyleW) &&
-                   (FT_IS_SCALABLE(ft_face) || ((size->y_ppem == face->size.y_ppem) && !memcmp(&fs, &face->fs, sizeof(fs)) ))) {
-                    TRACE("Already loaded font %s %s original version is %lx, this version is %lx\n",
-                          debugstr_w(family->FamilyName), debugstr_w(StyleW),
-                          face->font_version,  pHeader ? pHeader->Font_Revision : 0);
-
-                    if(fake_family) {
-                        TRACE("This font is a replacement but the original really exists, so we'll skip the replacement\n");
-                        HeapFree(GetProcessHeap(), 0, StyleW);
-                        pFT_Done_Face(ft_face);
-                        return 1;
-                    }
-                    if(!pHeader || pHeader->Font_Revision <= face->font_version) {
-                        TRACE("Original font is newer so skipping this one\n");
-                        HeapFree(GetProcessHeap(), 0, StyleW);
-                        pFT_Done_Face(ft_face);
-                        return 1;
-                    } else {
-                        TRACE("Replacing original with this one\n");
-                        list_remove(&face->entry);
-                        HeapFree(GetProcessHeap(), 0, face->file);
-                        HeapFree(GetProcessHeap(), 0, face->StyleName);
-                        HeapFree(GetProcessHeap(), 0, face->FullName);
-                        HeapFree(GetProcessHeap(), 0, face);
-                        break;
-                    }
-                }
-            }
-            face = HeapAlloc(GetProcessHeap(), 0, sizeof(*face));
-            face->cached_enum_data = NULL;
-            face->StyleName = StyleW;
-            face->FullName = get_face_name(ft_face, TT_NAME_ID_FULL_NAME, TT_MS_LANGID_ENGLISH_UNITED_STATES);
-            if (file)
-            {
-                face->file = strdupA(file);
-                face->font_data_ptr = NULL;
-                face->font_data_size = 0;
-            }
-            else
-            {
-                face->file = NULL;
-                face->font_data_ptr = font_data_ptr;
-                face->font_data_size = font_data_size;
-            }
-            face->face_index = face_index;
-            face->ntmFlags = 0;
-            if (ft_face->style_flags & FT_STYLE_FLAG_ITALIC)
-                face->ntmFlags |= NTM_ITALIC;
-            if (ft_face->style_flags & FT_STYLE_FLAG_BOLD)
-                face->ntmFlags |= NTM_BOLD;
-            if (face->ntmFlags == 0) face->ntmFlags = NTM_REGULAR;
-            face->font_version = pHeader ? pHeader->Font_Revision : 0;
-            face->family = family;
-            face->external = (flags & ADDFONT_EXTERNAL_FONT) ? TRUE : FALSE;
-            face->fs = fs;
-            memset(&face->fs_links, 0, sizeof(face->fs_links));
-
-            if(FT_IS_SCALABLE(ft_face)) {
-                memset(&face->size, 0, sizeof(face->size));
-                face->scalable = TRUE;
-            } else {
-                TRACE("Adding bitmap size h %d w %d size %ld x_ppem %ld y_ppem %ld\n",
-                      size->height, size->width, size->size >> 6,
-                      size->x_ppem >> 6, size->y_ppem >> 6);
-                face->size.height = size->height;
-                face->size.width = size->width;
-                face->size.size = size->size;
-                face->size.x_ppem = size->x_ppem;
-                face->size.y_ppem = size->y_ppem;
-                face->size.internal_leading = internal_leading;
-                face->scalable = FALSE;
-            }
-
-            /* check for the presence of the 'CFF ' table to check if the font is Type1 */
-            tmp_size = 0;
-            if (!pFT_Load_Sfnt_Table(ft_face, FT_MAKE_TAG('C','F','F',' '), 0, NULL, &tmp_size))
-            {
-                TRACE("Font %s/%p is OTF Type1\n", wine_dbgstr_a(file), font_data_ptr);
-                face->ntmFlags |= NTM_PS_OPENTYPE;
-            }
-
-            TRACE("fsCsb = %08x %08x/%08x %08x %08x %08x\n",
-                  face->fs.fsCsb[0], face->fs.fsCsb[1],
-                  face->fs.fsUsb[0], face->fs.fsUsb[1],
-                  face->fs.fsUsb[2], face->fs.fsUsb[3]);
-
-
-            if(face->fs.fsCsb[0] == 0) { /* let's see if we can find any interesting cmaps */
-                for(i = 0; i < ft_face->num_charmaps; i++) {
-                    switch(ft_face->charmaps[i]->encoding) {
-                    case FT_ENCODING_UNICODE:
-                    case FT_ENCODING_APPLE_ROMAN:
-			face->fs.fsCsb[0] |= FS_LATIN1;
-                        break;
-                    case FT_ENCODING_MS_SYMBOL:
-                        face->fs.fsCsb[0] |= FS_SYMBOL;
-                        break;
-                    default:
-                        break;
-                    }
-                }
-            }
-
-            if(flags & ADDFONT_ADD_TO_CACHE)
-                add_face_to_cache(face);
-
-            AddFaceToFamily(face, family);
-
-        } while(!FT_IS_SCALABLE(ft_face) && ++bitmap_num < ft_face->num_fixed_sizes);
+        if (FT_HAS_VERTICAL(ft_face))
+        {
+            AddFaceToList(ft_face, fake_family, file, font_data_ptr, font_data_size, face_index, flags, TRUE);
+            ++ret;
+        }
 
 	num_faces = ft_face->num_faces;
 	pFT_Done_Face(ft_face);
-	TRACE("Added font %s %s\n", debugstr_w(family->FamilyName),
-	      debugstr_w(StyleW));
     } while(num_faces > ++face_index);
-    return num_faces;
+    return ret;
 }
 
 static INT AddFontFileToList(const char *file, char *fake_family, const WCHAR *target_family, DWORD flags)
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index af49be5..470b2a2 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -4109,7 +4109,6 @@ static void test_vertical_font(void)
     }
 
     num = pAddFontResourceExA(ttf_name, FR_PRIVATE, 0);
-    todo_wine
     ok(num == 2, "AddFontResourceExA should add 2 fonts from vertical.ttf\n");
 
     check_vertical_font("@WineTestVertical", &installed, &selected, &gm);
@@ -4121,11 +4120,8 @@ static void test_vertical_font(void)
        gm.gmBlackBoxX, gm.gmBlackBoxY);
 
     check_vertical_font("@@WineTestVertical", &installed, &selected, &gm);
-    todo_wine
     ok(installed, "@@WineTestVertical is not installed\n");
-    todo_wine
     ok(selected, "@@WineTestVertical is not selected\n");
-    todo_wine
     ok(gm.gmBlackBoxX < gm.gmBlackBoxY,
        "gmBlackBoxX(%u) should be less than gmBlackBoxY(%u) if vertical\n",
        gm.gmBlackBoxX, gm.gmBlackBoxY);
-- 
1.7.7.3




More information about the wine-patches mailing list