[PATCH v4 1/2] gdi32: In AddFaceToList allow fonts with long names and add tests

Fabian Maurer dark.shadow4 at web.de
Sun Nov 19 11:09:19 CST 2017


v4
remove global variable
don't check if functions are available
fix RemoveFontResourceExA test
properly release dc
add another test for completeness sake

Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/gdi32/freetype.c              |   9 ++---
 dlls/gdi32/tests/font.c            |  54 ++++++++++++++++++++++++++++++
 dlls/gdi32/tests/resource.rc       |   3 ++
 dlls/gdi32/tests/wine_longname.sfd |  66 +++++++++++++++++++++++++++++++++++++
 dlls/gdi32/tests/wine_longname.ttf | Bin 0 -> 2252 bytes
 5 files changed, 128 insertions(+), 4 deletions(-)
 create mode 100644 dlls/gdi32/tests/wine_longname.sfd
 create mode 100644 dlls/gdi32/tests/wine_longname.ttf

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index 346e21dc21..8be1bfe22e 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -1571,6 +1571,9 @@ static BOOL insert_face_in_family_list( Face *face, Family *family )
     face->family = family;
     family->refcount++;
     face->refcount++;
+    /* GDI32 can't deal with long names, truncate them */
+    if (face->FullName && lstrlenW(face->FullName) > LF_FACESIZE - 1)
+        face->FullName[LF_FACESIZE - 1] = 0;
     return TRUE;
 }
 
@@ -2143,10 +2146,8 @@ static void AddFaceToList(FT_Face ft_face, const char *file, void *font_data_ptr
     family = get_family( ft_face, flags & ADDFONT_VERTICAL_FONT );
     if (strlenW(family->FamilyName) >= LF_FACESIZE)
     {
-        WARN("Ignoring %s because name is too long\n", debugstr_w(family->FamilyName));
-        release_face( face );
-        release_family( family );
-        return;
+        WARN("Truncating %s because name is too long\n", debugstr_w(family->FamilyName));
+        family->FamilyName[LF_FACESIZE - 1] = 0;
     }
 
     if (insert_face_in_family_list( face, family ))
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 299fadbab1..bd04a8b6b1 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -6679,6 +6679,59 @@ static void test_GetCharWidthI(void)
     ReleaseDC(0, hdc);
 }
 
+static INT CALLBACK long_enum_proc(const LOGFONTA *lf, const TEXTMETRICA *tm, DWORD type, LPARAM lparam)
+{
+    BOOL *found_font = (BOOL *)lparam;
+    *found_font = TRUE;
+    return 1;
+}
+
+static void test_long_names(void)
+{
+    char ttf_name[MAX_PATH];
+    LOGFONTA font = {0};
+    HFONT handle_font;
+    BOOL found_font;
+    int ret;
+    HDC dc;
+
+    if (!write_ttf_file("wine_longname.ttf", ttf_name))
+    {
+        skip("Failed to create ttf file for testing\n");
+        return;
+    }
+
+    dc = GetDC(NULL);
+
+    ret = AddFontResourceExA(ttf_name, FR_PRIVATE, 0);
+    ok(ret, "AddFontResourceEx() failed\n");
+
+    strcpy(font.lfFaceName, "wine_3_this_is_a_very_long_name");
+    found_font = FALSE;
+    EnumFontFamiliesExA(dc, &font, long_enum_proc, (LPARAM)&found_font, 0);
+    ok(found_font == TRUE, "EnumFontFamiliesExA didn't find font.\n");
+
+    strcpy(font.lfFaceName, "wine_2_this_is_a_very_long_name");
+    found_font = FALSE;
+    EnumFontFamiliesExA(dc, &font, long_enum_proc, (LPARAM)&found_font, 0);
+    ok(found_font == TRUE, "EnumFontFamiliesExA didn't find font.\n");
+
+    strcpy(font.lfFaceName, "wine_1_this_is_a_very_long_name");
+    found_font = FALSE;
+    EnumFontFamiliesExA(dc, &font, long_enum_proc, (LPARAM)&found_font, 0);
+    ok(found_font == FALSE, "EnumFontFamiliesExA must not find font.\n");
+
+    handle_font = CreateFontIndirectA(&font);
+    ok(handle_font != NULL, "CreateFontIndirectA failed\n");
+    DeleteObject(handle_font);
+
+    ret = RemoveFontResourceExA(ttf_name, FR_PRIVATE, 0);
+    ok(ret, "RemoveFontResourceEx() failed\n");
+
+    DeleteFileA(ttf_name);
+    ReleaseDC(NULL, dc);
+}
+
 START_TEST(font)
 {
     init();
@@ -6742,6 +6795,7 @@ START_TEST(font)
     test_fake_bold_font();
     test_bitmap_font_glyph_index();
     test_GetCharWidthI();
+    test_long_names();
 
     /* These tests should be last test until RemoveFontResource
      * is properly implemented.
diff --git a/dlls/gdi32/tests/resource.rc b/dlls/gdi32/tests/resource.rc
index fdd95f687a..6dcbd42ab5 100644
--- a/dlls/gdi32/tests/resource.rc
+++ b/dlls/gdi32/tests/resource.rc
@@ -28,3 +28,6 @@ wine_vdmx.ttf RCDATA wine_vdmx.ttf
 
 /* @makedep: vertical.ttf */
 vertical.ttf RCDATA vertical.ttf
+
+/* @makedep: wine_longname.ttf */
+wine_longname.ttf RCDATA wine_longname.ttf
diff --git a/dlls/gdi32/tests/wine_longname.sfd b/dlls/gdi32/tests/wine_longname.sfd
new file mode 100644
index 0000000000..998d7cc01f
--- /dev/null
+++ b/dlls/gdi32/tests/wine_longname.sfd
@@ -0,0 +1,66 @@
+SplineFontDB: 3.0
+FontName: wine_1_this_is_a_very_long_name_that_might_be_too_long_for_gdi32
+FullName: wine_2_this_is_a_very_long_name_that_might_be_too_long_for_gdi32
+FamilyName: wine_3_this_is_a_very_long_name_that_might_be_too_long_for_gdi32
+Weight: Regular
+Copyright: Copyright (c) 2017, Fabian Maurer
+UComments: "2017-11-17: Created with FontForge (http://fontforge.org)"
+Version: 001.000
+ItalicAngle: 0
+UnderlinePosition: -102.4
+UnderlineWidth: 51.2
+Ascent: 819
+Descent: 205
+InvalidEm: 0
+LayerCount: 2
+Layer: 0 0 "Back" 1
+Layer: 1 0 "Fore" 0
+XUID: [1021 48 28337276 3092883]
+OS2Version: 0
+OS2_WeightWidthSlopeOnly: 0
+OS2_UseTypoMetrics: 1
+CreationTime: 1510948643
+ModificationTime: 1510949092
+OS2TypoAscent: 0
+OS2TypoAOffset: 1
+OS2TypoDescent: 0
+OS2TypoDOffset: 1
+OS2TypoLinegap: 0
+OS2WinAscent: 0
+OS2WinAOffset: 1
+OS2WinDescent: 0
+OS2WinDOffset: 1
+HheadAscent: 0
+HheadAOffset: 1
+HheadDescent: 0
+HheadDOffset: 1
+OS2Vendor: 'PfEd'
+MarkAttachClasses: 1
+DEI: 91125
+Encoding: ISO8859-1
+UnicodeInterp: none
+NameList: AGL For New Fonts
+DisplaySize: -48
+AntiAlias: 1
+FitToEm: 0
+WinInfo: 64 16 4
+BeginPrivate: 0
+EndPrivate
+BeginChars: 256 1
+
+StartChar: at
+Encoding: 64 64 0
+Width: 1024
+VWidth: 0
+Flags: HW
+LayerCount: 2
+Fore
+SplineSet
+259 332 m 29
+ 468 664 l 29
+ 514 332 l 29
+ 259 332 l 29
+EndSplineSet
+EndChar
+EndChars
+EndSplineFont
diff --git a/dlls/gdi32/tests/wine_longname.ttf b/dlls/gdi32/tests/wine_longname.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..59d9517560592e9578f1510f99f4fb65065c1195
GIT binary patch
literal 2252
zcmdT`J!~6Q9RIz$vy(ze6NyY%=$Z!6pv1io)Gv83{V*L80j0`9(dA;F&nMYF>wHP-
zEn;Fof`I`fHnvbz#A0FuAu(hCArJ#BOqEKh7`jo+ at 4dUk$yy{T-ueID|MR{7*WEJ&
zfGKQ4$6Bp+W96OM-;M#3pOag9^~%*6X7McP4<-HDn`fNWg1-fb7U{Km$M4}p at gC`)
z376`dsfju5T|h5UZiIfnHyUwgOuk2YGHef;-|P-8$`?uZT7lnq=Jxy@;=dElw#X<P
zGYZ^mp7eaHlioTG at dD{@Nl&-qx{r0-puI`@sg8fEhikY%`8CpJ*Y5=DvzvRAf5PLx
z>c#zZw1cxedX4gzAY&y=efL?(J5hOvrwuZIpI(0OX}12^z#O1y+79VSXp+l88^yVq
z>1&$WDU)Thp*Y5YjkFYsS4CN=7*zQHj7|Gkqlb7uTg5%Nf*IFP;G7TX=fQZrd9}g%
zR8iI4k&Bzk6Xnx^iU~o_=sBZSAeeKRcLk-~+X^YUbBRhOSA&nFtE`clM_=cf5XJEU
zLdGKD at Hpb(VZj)e$N$fV>Sgwge9ki#P3BlQtbmRQly?QrRE84<?mN51!Y`Gft`Wtq
zF4+ai9!?a+UzH(Kc;9hnPR_jO&YYSP(|_#kX*-Wr=d>ob6S`Pt$9*JoES at 9zeOWAv
z<-fm>$(zER{hHt;uH?8t6?b!7!-Tky<2v3Jk8<2VRr at u^3z*icIbLKR{UAHRko|Uv
zkl}(o*35AYQ(_^<b$lsa$#DbQ+FLnZfT=&9<3()iZ{RXw^e{kz2q9WX*=46u#{yRe
z7HpiuBJmpJTO4ujl3L-qL7RYp%W-dzL}4p6PuCYr$Fk2Ynl*nt^1J4WzmWt~*`j5a
z+8$g&%5x(0iDk1-Y*XzuAl9ZwUHam2_R&#R(!!^mM|$5+kN(IVQ|iY@?3$z#azZqy
z?J^E*Mcu%2y|fkeJ^p-eGe`zrJMM;_`~Xqlr(Q<};jNR3<4o3!6EAE;E_b-j!$Jn#
zrX!5#dJt~3eIhmGZmQOV8i7h&nW-~zkuVP3QO^F?p=Vy$d=-{hOq=t5Sy79-X)R8|
zz;w!%dC^o!avncP+`>M;WZO%!2M!ng$wZzN{a?fbtg at U5J2g^8Hd$2pM#$pI$D~4#
z^rN_IT9#e5EQ_3Rz3nGb?<{Kj at vF#>%l^$V+UDEC51eEj8S=ss)H<cOf_KsQc0JDj
V9#YOPqq5Ab)%@daq1MB9_dm8?dc^<$

literal 0
HcmV?d00001

-- 
2.15.0




More information about the wine-devel mailing list