From: Arie Miller <renari@arimil.com> --- dlls/gdi32/tests/Makefile.in | 1 + dlls/gdi32/tests/cff.otf | Bin 0 -> 1788 bytes dlls/gdi32/tests/cff.sfd | 77 +++++++++++++++++++++++++++++++++++ dlls/gdi32/tests/font.c | 70 +++++++++++++++++++++++++------ dlls/gdi32/tests/resource.rc | 3 ++ 5 files changed, 138 insertions(+), 13 deletions(-) create mode 100644 dlls/gdi32/tests/cff.otf create mode 100644 dlls/gdi32/tests/cff.sfd diff --git a/dlls/gdi32/tests/Makefile.in b/dlls/gdi32/tests/Makefile.in index 3ea3cdce957..c7b52d0229e 100644 --- a/dlls/gdi32/tests/Makefile.in +++ b/dlls/gdi32/tests/Makefile.in @@ -4,6 +4,7 @@ IMPORTS = setupapi user32 gdi32 advapi32 SOURCES = \ bitmap.c \ brush.c \ + cff.sfd \ clipping.c \ dc.c \ dib.c \ diff --git a/dlls/gdi32/tests/cff.otf b/dlls/gdi32/tests/cff.otf new file mode 100644 index 0000000000000000000000000000000000000000..854d1533a9648732c5763636fa05da08f9adfa0a GIT binary patch literal 1788 zcmeYd3Grv(W@unwW-xGeb5jVtlXH-PfmMcqfpMOjTZr$*Sv(sU7}#zwFfhotySTbB zh%$&UFtF_b@%@AKjUrl;nHU%t6&M&85|VQh3mABruQ4z%?_gkHbjnCgOwnr$`NF`! z08($3k&&9n{+hX%fq?-erjn6cQo(+K;Vc6K8;H-5n^;l6z!bp1z`!WMz`($kmzbNn zKKcJd1_s6k1_mbcg8br=|2r6r85mgpFfcGEFff9YGBE6m6Sa@$xB1Gz&HRFafq~%} zhrbkrK6shoEW=!;R;E@41_llWCXgsZ4|Bo)4#qDK^-Qf`lc17diiv?CfB~$Yh4}^J z1O`?H2Bt11kS}^5G~)vXLq;Z$5>`&I4iEuy4~PcifHc<>h64-+3<hw!K0xdSOM?iA z5BM0?!R?o0u!FK08Mqlrp=>4wc7};iHZy}d!%HZeg@Kz<6Ut^~;Aaelve_888EYAs z85mhWZnI%vfU+4G#28|sY$gUihDIoxnZb`?CX~&>AjT*NWwSEKF`7czYz$(IsSM5x z`3waNl?+7;nGER+84M*18Vtz{nhXjIMhpfFMhs>Q3Jl>4nGAUhsSFAX0SrY9`3zYM zsSL>sB@7JC`303lnduoN8p)apMg~S^3gMY~sR{u_`B|ySB@A$lAq=Su#SA43&J1o0 zZVU_{MIouhCC+Yc3=BaGsSN21r3^U?i3~*y3_+>sr8$X33=D1z`3!jsC1ARUAsuYJ z5rZCs0fPdA6_TS+&4$PsGFUL^GMF&v!ac#@mY-MRmS2>fs$isNpkM`dDAWxKRtkm| zx+c0H4-n_(FoslyB8FmyOt2djKuLnZ5bQPs1_K6$u+*aB%=|nB0|P@n0|Nu%%ml|N zC|(&DWT3Hb1Bxk7zGPrw0Ody(1{Sc4!T<jZ3=9VU|Np-T=7SO;8v~39N{2*Yl*CPx zjzO=88REkKTN#W%fdb(nNJa)076wK}Mjqr8$jHRN$e{m&pW%lz;}038AF|9pBv^WQ z7{4ceH~cB}Q;JoFp^IOJfk8lqp;u6bfkTFInh*msNRvE+7K17NJb+{o5)<SiK?Wv} z8A^<d-Ftty?q%G&_ve<q%zMRtN&Hy(Pl9dlpK{S3u0OZ@ab@TGe&xqY(diRe|1+@G za{gx!{E_~jLF}p5e+F)=Z~qx2=dS(Fz<g%$e+CiH>i-NZJ68N>5cc5y&%myx_MbsK zuj>E*zluix8Io9p{{R2B!tXyr!Oo!n|94J$^#A_{r#b)s_Z+$KpMh)dkN^KWRxkSh ze-lUM|Nk{p75@M4w4DF{|Five|Np<9(ewZRCr-2f|KI)i@&Et72e<zJf0<YFpMgR2 z!~g&7&Km#!f1Jkj|NpYL*8dsem#+BFAaZ{0e}?iSVI2See~?Q3&rtez)qe)BYkL0~ zN}r4UXDH^+{m&pH?Z7dGjqg{DNVjM=4;NC5@i2%murPoMV@R@wBvml^wBz?7Q1~I& M37}G+`31vS04A|&%>V!Z literal 0 HcmV?d00001 diff --git a/dlls/gdi32/tests/cff.sfd b/dlls/gdi32/tests/cff.sfd new file mode 100644 index 00000000000..11ff0b0731b --- /dev/null +++ b/dlls/gdi32/tests/cff.sfd @@ -0,0 +1,77 @@ +SplineFontDB: 3.0 +FontName: WineTestCFF +FullName: WineTestCFF +FamilyName: WineTestCFF +Weight: Regular +Copyright: Copyright(c) 2026 Wine Project +UComments: "#pragma makedep otf" +Version: 001.000 +ItalicAngle: 0 +UnderlinePosition: -100 +UnderlineWidth: 50 +Ascent: 800 +Descent: 200 +InvalidEm: 0 +LayerCount: 2 +Layer: 0 0 "Back" 1 +Layer: 1 0 "Fore" 0 +XUID: [1021 820 1266790224 8728248] +FSType: 0 +OS2Version: 4 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 1 +CreationTime: 1776459418 +ModificationTime: 1776488787 +PfmFamily: 17 +TTFWeight: 400 +TTFWidth: 5 +LineGap: 500 +VLineGap: 0 +OS2TypoAscent: 880 +OS2TypoAOffset: 0 +OS2TypoDescent: -120 +OS2TypoDOffset: 0 +OS2TypoLinegap: 500 +OS2WinAscent: 1000 +OS2WinAOffset: 0 +OS2WinDescent: 240 +OS2WinDOffset: 0 +HheadAscent: 880 +HheadAOffset: 0 +HheadDescent: -120 +HheadDOffset: 0 +OS2Vendor: 'PfEd' +MarkAttachClasses: 1 +DEI: 91125 +Encoding: ISO8859-1 +UnicodeInterp: none +NameList: AGL For New Fonts +DisplaySize: -48 +AntiAlias: 1 +FitToEm: 0 +WinInfo: 0 28 11 +BeginPrivate: 0 +EndPrivate +BeginChars: 256 1 + +StartChar: zero +Encoding: 48 48 0 +Width: 1000 +Flags: H +LayerCount: 2 +Fore +SplineSet +392 624 m 0 + 389.000022888 624 386.000022888 624 383 624 c 0 + 267.939740009 595.893556721 193.103101666 477.990871628 209 360 c 0 + 188.189011503 240.233056337 277.262329295 144.585963957 398 159 c 0 + 420.568423556 158.914300294 437.595888407 160.035977779 458 174 c 0 + 576.77492213 199.252966911 654.742061929 330.670439307 644 450 c 0 + 659.739813253 565.231194559 547.015903323 635.657432906 449 645 c 0 + 425.568450805 647.870332424 406.287034473 640.721319603 386 636 c 0 + 360.384076063 632.200638278 337.488412015 620.970317136 332 603 c 0 + 320 597 l 1025 +EndSplineSet +EndChar +EndChars +EndSplineFont diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index c56180b1ce6..df6b2518ed5 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -154,7 +154,7 @@ static BOOL write_tmp_file( const void *data, DWORD *size, char *tmp_name ) return ret; } -static BOOL write_ttf_file(const char *fontname, char *tmp_name) +static BOOL write_font_file(const char *fontname, char *tmp_name) { void *rsrc_data; DWORD rsrc_size; @@ -1671,7 +1671,7 @@ static void test_GetGlyphIndices(void) ok(glyphs[4] == 0, "GetGlyphIndicesW should have returned 0 not %04x\n", glyphs[4]); DeleteObject(SelectObject(hdc, hOldFont)); - ret = write_ttf_file("wine_nul.ttf", ttf_name); + ret = write_font_file("wine_nul.ttf", ttf_name); ok(ret, "Failed to create test font file.\n"); font = load_font(ttf_name, &font_size); ok(font != NULL, "Failed to map font file.\n"); @@ -4132,6 +4132,49 @@ static void test_GetTextMetrics(void) ReleaseDC(0, hdc); } +static void test_CFF_external_leading(void) +{ + char font_file[MAX_PATH]; + DWORD num, ret; + HDC hdc; + LOGFONTW lf; + HFONT hfont, hfont_prev; + TEXTMETRICW tm; + + if (!write_font_file("cff.otf", font_file)) + { + skip("Failed to create otf file for testing\n"); + return; + } + + num = AddFontResourceExA(font_file, FR_PRIVATE, 0); + ok(num == 1, "AddFontResourceExA should add 1 font from cff.otf, got %ld\n", num); + if (num == 0) goto cleanup; + + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = -18; + wcscpy(lf.lfFaceName, L"WineTestCFF"); + hfont = CreateFontIndirectW(&lf); + ok(hfont != NULL, "CreateFontIndirectW failed\n"); + + hdc = GetDC(NULL); + hfont_prev = SelectObject(hdc, hfont); + ret = GetFontData(hdc, MS_MAKE_TAG('C','F','F',' '), 0, NULL, 0); + ok(ret != GDI_ERROR, "Expected CFF table, got GDI_ERROR\n"); + ok(GetTextMetricsW(hdc, &tm), "GetTextMetricsW failed\n"); + ok(tm.tmExternalLeading == 0, "Expected tmExternalLeading 0, got %ld\n", tm.tmExternalLeading); + + SelectObject(hdc, hfont_prev); + DeleteObject(hfont); + ReleaseDC(NULL, hdc); + ret = RemoveFontResourceExA(font_file, FR_PRIVATE, 0); + ok(ret, "RemoveFontResourceExA error %ld\n", GetLastError()); + + cleanup: + ret = DeleteFileA(font_file); + ok(ret, "Failed to delete font file, %ld.\n", GetLastError()); +} + static void test_nonexistent_font(void) { static const struct @@ -5239,7 +5282,7 @@ static void test_AddFontMemResource(void) GetLastError()); /* Now with scalable font */ - bRet = write_ttf_file("wine_test.ttf", ttf_name); + bRet = write_font_file("wine_test.ttf", ttf_name); ok(bRet, "Failed to create test font file.\n"); font = load_font(ttf_name, &font_size); @@ -5967,7 +6010,7 @@ static void test_CreateScalableFontResource(void) ULONG (WINAPI *pNtGdiMakeFontDir)( DWORD embed, BYTE *buffer, UINT size, const WCHAR *path, UINT len ); int i; - if (!write_ttf_file("wine_test.ttf", ttf_name)) + if (!write_font_file("wine_test.ttf", ttf_name)) { skip("Failed to create ttf file for testing\n"); return; @@ -6290,7 +6333,7 @@ static void test_vertical_font(void) "@MS UI Gothic", /* has vmtx table, available on native */ }; - if (!write_ttf_file("vertical.ttf", ttf_name)) + if (!write_font_file("vertical.ttf", ttf_name)) { skip("Failed to create ttf file for testing\n"); return; @@ -6329,7 +6372,7 @@ static void test_vertical_font(void) DeleteFileA(ttf_name); - if (!write_ttf_file("vertical2.ttf", ttf_name)) + if (!write_font_file("vertical2.ttf", ttf_name)) { skip("Failed to create ttf file for testing\n"); return; @@ -7068,7 +7111,7 @@ static void test_long_names(void) int ret; HDC dc; - if (!write_ttf_file("wine_longname.ttf", ttf_name)) + if (!write_font_file("wine_longname.ttf", ttf_name)) { skip("Failed to create ttf file for testing\n"); return; @@ -7114,13 +7157,13 @@ static void test_ttf_names(void) int ret; HDC dc; - if (!write_ttf_file("wine_ttfnames.ttf", ttf_name)) + if (!write_font_file("wine_ttfnames.ttf", ttf_name)) { skip("Failed to create ttf file for testing\n"); return; } - if (!write_ttf_file("wine_ttfnames_bold.ttf", ttf_name_bold)) + if (!write_font_file("wine_ttfnames_bold.ttf", ttf_name_bold)) { skip("Failed to create ttf file for testing\n"); DeleteFileA(ttf_name); @@ -7194,20 +7237,20 @@ static void test_lang_names(void) return; } - if (!write_ttf_file( "wine_langnames.ttf", ttf_name )) + if (!write_font_file( "wine_langnames.ttf", ttf_name )) { skip( "Failed to create ttf file for testing\n" ); return; } - if (!write_ttf_file( "wine_langnames2.ttf", ttf_name2 )) + if (!write_font_file( "wine_langnames2.ttf", ttf_name2 )) { skip( "Failed to create ttf file for testing\n" ); DeleteFileA( ttf_name ); return; } - if (!write_ttf_file( "wine_langnames3.ttf", ttf_name3 )) + if (!write_font_file( "wine_langnames3.ttf", ttf_name3 )) { skip( "Failed to create ttf file for testing\n" ); DeleteFileA( ttf_name2 ); @@ -7848,7 +7891,7 @@ static void test_font_weight(void) BOOL bret; HDC hdc; - bret = write_ttf_file("wine_heavy.ttf", ttf_name); + bret = write_font_file("wine_heavy.ttf", ttf_name); ok(bret, "Failed to create test font file.\n"); count = AddFontResourceExA(ttf_name, 0, NULL); @@ -8067,6 +8110,7 @@ START_TEST(font) skip("Arial Black or Symbol/Wingdings is not installed\n"); test_EnumFontFamiliesEx_default_charset(); test_GetTextMetrics(); + test_CFF_external_leading(); test_RealizationInfo(); test_GetTextFace(); test_GetGlyphOutline(); diff --git a/dlls/gdi32/tests/resource.rc b/dlls/gdi32/tests/resource.rc index 2f1273d1e42..340e281a145 100644 --- a/dlls/gdi32/tests/resource.rc +++ b/dlls/gdi32/tests/resource.rc @@ -55,3 +55,6 @@ wine_nul.ttf RCDATA wine_nul.ttf /* @makedep: wine_heavy.ttf */ wine_heavy.ttf RCDATA wine_heavy.ttf + +/* @makedep: cff.otf */ +cff.otf RCDATA cff.otf -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10603