From: Arie Miller <renari@arimil.com> --- dlls/gdi32/tests/Makefile.in | 1 + dlls/gdi32/tests/cff.otf | Bin 0 -> 1544 bytes dlls/gdi32/tests/cff.sfd | 52 ++++++++++++++++++++++++++ dlls/gdi32/tests/font.c | 70 ++++++++++++++++++++++++++++------- dlls/gdi32/tests/resource.rc | 3 ++ 5 files changed, 113 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..608c0a8e8d4ca99d3c9a4832d6d487115c15afca GIT binary patch literal 1544 zcmeYd3Grv(W@unwW-xGeb5mFuImv>7fmMWofnmFwTZr$*nX~pYFtEO0U|^7OcX4%N z5M>ZyU|>B1;`;~d8--TJBrq^ADljlGBqZl17BKKKO=MtT-oe1YXqAzgn4+zB{~-ed z!yX0(2D6Ne)I{c*{}v1k3||-+7*sNHODY&aECx0f1_lO}+{B6k2F3se1_nk61_lPU zyu{qp^~rxHGB7YUFfcHg7vvY0{NKS~#K6D;(xt$_2vW+xV6lA{PdvZPR|alokUJTk zarjFyFff4VM<5!CIT)CrEJg+fW`+M23{fEd|NjtEKx||jzyLO%h4BmH1O`?H2Bt11 zkS}^5G~)vXLq;YB1||kpW@KFmc0ihI3PS_Pbc9`KHbH#A$FL4;6G*EZgB_I3$iU4| z3S~1furo}AvY8pw8D2u!EDYR?nou??13zOZl+DJ#%~;F8%)rRP$-uy1!@vM#Gct%V z#6sCj415fYP&PAzAHz&2n}tD)Q4q>zWsqYug|gWg#28Z<oEh>N3K%LGiWo8((it)s zN*FX4k{L7^6c~&c3>b_U%or3H!Wl9d@)%MX6c_>+iWu@4vKUesk{L=E7@YG9DvL7H zGfFg)H5H5ujLa0mGxJgv0*dmpQj<#<;2J|1QW=UFN*J6O+!)*#7(j|bQj1HR-P{-$ zf*4X6(iut_au^aBiWnGzQqxOw5{noZ+!*p1@)%0MbP+>3*m@%dJq7~?1qLf5N1>Vx zkuzj4XV7IZVbFzpg2636uf#3CC_PodNY6mQ3hYp*8x*V*49#^-bU_{<&dp&AsSHI7 z#SEEXH!3g~Fc>fxg53sUF@&WS6=&w>DHs?S>KPaq5N9ShPC@a?z#s#SbrVobf$}8- z3j-+sFhSBgC<Xri4^hL&21(SQq&9*vG{^qm3Mxx5!-0{3g@u8Uk&y>E<uNibFfwTT z;Ai+D&G<ux>4z-y4+)m;?(S|@8HQ$l83qOc8HN@?83ukCh802#%pleB3|b7P_!B*n z4M<FolNcEp6}tESaNWzeckl1Gz07;XRDZ1e$hP-Sx#$nq-*JCj+4*D}7#J8tz@%t5 j4;Lb8c^E_(KqV@uyn~jJu#)F#$L~WR<B`iqP#FvW+l1UG literal 0 HcmV?d00001 diff --git a/dlls/gdi32/tests/cff.sfd b/dlls/gdi32/tests/cff.sfd new file mode 100644 index 00000000000..2176d622a36 --- /dev/null +++ b/dlls/gdi32/tests/cff.sfd @@ -0,0 +1,52 @@ +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] +OS2Version: 0 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 1 +CreationTime: 1776459418 +ModificationTime: 1776459618 +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: 0 28 11 +OnlyBitmaps: 1 +BeginPrivate: 0 +EndPrivate +BeginChars: 256 0 +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