[=PATCH v5 1/2] gdi32: In AddFaceToList allow fonts with long names and add tests
Fabian Maurer
dark.shadow4 at web.de
Sun Nov 19 13:44:25 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