From: Paul Gofman pgofman@codeweavers.com
--- dlls/gdi32/tests/Makefile.in | 1 + dlls/gdi32/tests/font.c | 71 ++++++++++ dlls/gdi32/tests/resource.rc | 3 + dlls/gdi32/tests/wine_heavy.sfd | 244 ++++++++++++++++++++++++++++++++ dlls/gdi32/tests/wine_heavy.ttf | Bin 0 -> 1784 bytes 5 files changed, 319 insertions(+) create mode 100644 dlls/gdi32/tests/wine_heavy.sfd create mode 100644 dlls/gdi32/tests/wine_heavy.ttf
diff --git a/dlls/gdi32/tests/Makefile.in b/dlls/gdi32/tests/Makefile.in index d6f33ee087d..db8b7c7e5b1 100644 --- a/dlls/gdi32/tests/Makefile.in +++ b/dlls/gdi32/tests/Makefile.in @@ -24,6 +24,7 @@ SOURCES = \ wine_langnames3.sfd \ wine_longname.sfd \ wine_nul.sfd \ + wine_heavy.sfd \ wine_test.sfd \ wine_ttfnames.sfd \ wine_ttfnames_bold.sfd \ diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c index 0513c2b2ca8..198fba2d847 100644 --- a/dlls/gdi32/tests/font.c +++ b/dlls/gdi32/tests/font.c @@ -7767,6 +7767,76 @@ static void test_GetOutlineTextMetrics_subst(void) ReleaseDC(0, hdc); }
+static INT CALLBACK test_font_weight_enum(const LOGFONTW *lf, const TEXTMETRICW *tm, DWORD type, LPARAM lparam +) +{ + const NEWTEXTMETRICW *ntm = (const NEWTEXTMETRICW *)tm; + int *called = (int *)lparam; + + if (type != TRUETYPE_FONTTYPE) return 1; + ok(!wcscmp(lf->lfFaceName, L"wine_heavy"), "got %s.\n", debugstr_w(lf->lfFaceName)); + ok((ntm->ntmFlags & (NTM_REGULAR | NTM_BOLD)) == NTM_REGULAR, "got %#lx.\n", ntm->ntmFlags); + todo_wine ok(ntm->tmWeight == 700, "got %ld.\n", ntm->tmWeight); + *called = 1; + + return 1; +} + +static void test_font_weight(void) +{ + HFONT hfont1, hfont2, old; + char ttf_name[MAX_PATH]; + TEXTMETRICW tm1, tm2; + int enum_called; + LOGFONTW lf; + DWORD count; + BOOL bret; + HDC hdc; + + bret = write_ttf_file("wine_heavy.ttf", ttf_name); + ok(bret, "Failed to create test font file.\n"); + + count = AddFontResourceExA(ttf_name, 0, NULL); + ok(count == 1, "got %lu.\n", count); + + hdc = GetDC(NULL); + + memset(&lf, 0, sizeof(lf)); + wcscpy(lf.lfFaceName, L"wine_heavy"); + lf.lfHeight = 90; + lf.lfWeight = FW_BOLD; + lf.lfCharSet = DEFAULT_CHARSET; + + enum_called = 0; + EnumFontFamiliesExW(hdc, &lf, test_font_weight_enum, (LPARAM)&enum_called, 0); + ok(enum_called, "font not found.\n"); + + enum_called = 0; + lf.lfWeight = FW_REGULAR; + EnumFontFamiliesExW(hdc, &lf, test_font_weight_enum, (LPARAM)&enum_called, 0); + ok(enum_called, "font not found.\n"); + + lf.lfWeight = FW_REGULAR; + hfont1 = CreateFontIndirectW(&lf); + lf.lfWeight = FW_BOLD; + hfont2 = CreateFontIndirectW(&lf); + + old = SelectObject(hdc, hfont1); + memset(&tm1, 0, sizeof(tm1)); + GetTextMetricsW(hdc, &tm1); + SelectObject(hdc, hfont2); + memset(&tm2, 0, sizeof(tm2)); + GetTextMetricsW(hdc, &tm2); + todo_wine ok(tm1.tmMaxCharWidth == tm2.tmMaxCharWidth, "got %ld, %ld.\n", tm1.tmMaxCharWidth, tm2.tmMaxCharWidth); + + SelectObject(hdc, old); + ReleaseDC(NULL, hdc); + DeleteObject(hfont1); + DeleteObject(hfont2); + bret = RemoveFontResourceExA(ttf_name, 0, NULL); + ok(bret, "got error %ld\n", GetLastError()); +} + START_TEST(font) { static const char *test_names[] = @@ -7856,6 +7926,7 @@ START_TEST(font) test_lang_names(); test_char_width(); test_select_object(); + test_font_weight();
/* 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 784d8602a9a..477d07de45d 100644 --- a/dlls/gdi32/tests/resource.rc +++ b/dlls/gdi32/tests/resource.rc @@ -49,3 +49,6 @@ wine_langnames3.ttf RCDATA wine_langnames3.ttf
/* @makedep: wine_nul.ttf */ wine_nul.ttf RCDATA wine_nul.ttf + +/* @makedep: wine_heavy.ttf */ +wine_heavy.ttf RCDATA wine_heavy.ttf diff --git a/dlls/gdi32/tests/wine_heavy.sfd b/dlls/gdi32/tests/wine_heavy.sfd new file mode 100644 index 00000000000..40269910232 --- /dev/null +++ b/dlls/gdi32/tests/wine_heavy.sfd @@ -0,0 +1,244 @@ +SplineFontDB: 3.0 +FontName: wine_heavy +FullName: wine_heavy +FamilyName: wine_heavy +Weight: Regular +Copyright: Copyright (c) 2024 Wine Test Suite +Version: 001.000 +ItalicAngle: 0 +UnderlinePosition: -205 +UnderlineWidth: 102 +Ascent: 1638 +Descent: 410 +sfntRevision: 0x00010000 +LayerCount: 2 +Layer: 0 1 "Back" 1 +Layer: 1 1 "Fore" 0 +XUID: [1021 905 592216984 1247726] +FSType: 32767 +OS2Version: 2 +OS2_WeightWidthSlopeOnly: 0 +OS2_UseTypoMetrics: 1 +PfmFamily: 17 +TTFWeight: 700 +TTFWidth: 5 +LineGap: 184 +VLineGap: 0 +Panose: 2 0 6 3 0 0 0 0 0 0 +OS2TypoAscent: 0 +OS2TypoAOffset: 1 +OS2TypoDescent: 0 +OS2TypoDOffset: 1 +OS2TypoLinegap: 184 +OS2WinAscent: 1638 +OS2WinAOffset: 0 +OS2WinDescent: 410 +OS2WinDOffset: 0 +HheadAscent: 0 +HheadAOffset: 1 +HheadDescent: 0 +HheadDOffset: 1 +OS2SubXSize: 1331 +OS2SubYSize: 1433 +OS2SubXOff: 0 +OS2SubYOff: 286 +OS2SupXSize: 1331 +OS2SupYSize: 1433 +OS2SupXOff: 0 +OS2SupYOff: 983 +OS2StrikeYSize: 102 +OS2StrikeYPos: 530 +OS2Vendor: 'Wine' +OS2CodePages: 00000001.00000000 +OS2UnicodeRanges: 00000001.00000000.00000000.00000000 +MarkAttachClasses: 1 +DEI: 91125 +ShortTable: cvt 2 + 68 + 1297 +EndShort +ShortTable: maxp 16 + 1 + 0 + 4 + 8 + 2 + 0 + 0 + 2 + 0 + 1 + 1 + 0 + 64 + 46 + 0 + 0 +EndShort +LangName: 1033 "" "" "" "Wine : wine_heavy : 5-07-2024" +GaspTable: 1 65535 2 0 +Encoding: UnicodeBmp +UnicodeInterp: none +NameList: Adobe Glyph List +DisplaySize: -24 +AntiAlias: 1 +FitToEm: 1 +WinInfo: 48 16 4 +BeginPrivate: 0 +EndPrivate +BeginChars: 65539 7 + +StartChar: .notdef +Encoding: 65536 -1 0 +AltUni2: 00fffe.ffffffff.0 00fffd.ffffffff.0 00fffc.ffffffff.0 00fffb.ffffffff.0 +Width: 748 +Flags: W +TtInstrs: +PUSHB_2 + 1 + 0 +MDAP[rnd] +ALIGNRP +PUSHB_3 + 7 + 4 + 0 +MIRP[min,rnd,black] +SHP[rp2] +PUSHB_2 + 6 + 5 +MDRP[rp0,min,rnd,grey] +ALIGNRP +PUSHB_3 + 3 + 2 + 0 +MIRP[min,rnd,black] +SHP[rp2] +SVTCA[y-axis] +PUSHB_2 + 3 + 0 +MDAP[rnd] +ALIGNRP +PUSHB_3 + 5 + 4 + 0 +MIRP[min,rnd,black] +SHP[rp2] +PUSHB_3 + 7 + 6 + 1 +MIRP[rp0,min,rnd,grey] +ALIGNRP +PUSHB_3 + 1 + 2 + 0 +MIRP[min,rnd,black] +SHP[rp2] +EndTTInstrs +LayerCount: 2 +Fore +SplineSet +68 0 m 1,0,-1 + 68 1365 l 1,1,-1 + 612 1365 l 1,2,-1 + 612 0 l 1,3,-1 + 68 0 l 1,0,-1 +136 68 m 1,4,-1 + 544 68 l 1,5,-1 + 544 1297 l 1,6,-1 + 136 1297 l 1,7,-1 + 136 68 l 1,4,-1 +EndSplineSet +EndChar + +StartChar: .null +Encoding: 65537 -1 1 +Width: 0 +Flags: W +LayerCount: 2 +EndChar + +StartChar: nonmarkingreturn +Encoding: 65538 -1 2 +Width: 682 +Flags: W +LayerCount: 2 +EndChar + +StartChar: exclam +Encoding: 33 33 3 +Width: 0 +Flags: W +LayerCount: 2 +EndChar + +StartChar: dieresis +Encoding: 168 168 4 +Width: 1000 +VWidth: 0 +Flags: W +LayerCount: 2 +Fore +SplineSet +620.215 824.429 m 1,0,1 + 760.84 777.554 760.84 777.554 713.965 636.929 c 1,2,-1 + 620.215 824.429 l 1,0,1 +154.883 324.971 m 0,3,-1 +254.492 773.213 m 1,4,5 + 310.707 834.805 310.707 834.805 374.609 767.354 c 1,6,7 + 410.471 728.672 410.471 728.672 374.609 691.182 c 0,8,9 + 308.375 621.934 308.375 621.934 254.492 688.252 c 0,10,11 + 216.406 735.127 216.406 735.127 254.492 773.213 c 1,4,5 +254.492 773.213 m 1,12,13 + 216.406 735.127 216.406 735.127 254.492 688.252 c 0,14,15 + 308.375 621.934 308.375 621.934 374.609 691.182 c 0,16,17 + 410.471 728.672 410.471 728.672 374.609 767.354 c 1,18,19 + 310.707 834.805 310.707 834.805 254.492 773.213 c 1,12,13 +EndSplineSet +EndChar + +StartChar: A +Encoding: 65 65 5 +Width: 1000 +VWidth: 0 +Flags: WO +LayerCount: 2 +Fore +SplineSet +459 1258 m 25,0,-1 + 462 1639 l 1,1,-1 + 389 1638 l 1,2,-1 + 492 1815 l 1,3,-1 + 609 1638.5 l 1,4,-1 + 531 1637.5 l 1,5,-1 + 523 1258 l 1,6,-1 + 459 1258 l 25,0,-1 +EndSplineSet +EndChar + +StartChar: D +Encoding: 68 68 6 +Width: 1000 +VWidth: 0 +Flags: WO +LayerCount: 2 +Fore +SplineSet +461 -30.7998 m 25,0,-1 + 464 -411.8 l 1,1,-1 + 391 -410.8 l 1,2,-1 + 494 -587.8 l 1,3,-1 + 611 -411.3 l 1,4,-1 + 533 -410.3 l 1,5,-1 + 525 -30.7998 l 1,6,-1 + 461 -30.7998 l 25,0,-1 +EndSplineSet +EndChar +EndChars +EndSplineFont diff --git a/dlls/gdi32/tests/wine_heavy.ttf b/dlls/gdi32/tests/wine_heavy.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e3b7e7fd80e923c18e5d1969d4a4f4898cc1a4b4 GIT binary patch literal 1784 zcmcIlPfVL-82`QBUjzeV5K0VV9~Qr|L}=G-tu|<IEvSj85w^vPw3hxerES{6Mx2?6 zE=x@2Sy|#?7Z;r-MGhQ1?6{~qXkxr9MmdqW9XxnIM?Zh>*AEzR2M_u*Z{OeZ=Y9UX z@6)Fc06Ot5R3xXSW~V<*c3c6B+msGGpO~CN0HfsB$lI^X1jC)LS04jJo_sRBkg7Pp z9r%R&FI;b>m+BT0dN-iHM7@?v)hdod&oHi&Z_5>zv%kiE_=@@@?UB!<<^$i2zDeC( zu1KDO_HV>h>W0Y==NIbdI&>vX{wDeUVmY0{b<xlBuaZBokUCevG$yHkfxJ~pEo9dF zf4sraNkAE>lxub8ieSFRdFn$9DZ?V%)q8%fYy1x!ZleI$_~Q3lyL)1LP1!Pi<lCS~ zDT!xH-}V~T)lJDNTdpSwcSv_7CVHW{B6(7{vI&g25>4GyzJ`9m(U0jLQ#sh$)t``6 z4$>zK-jhc%&s{oGC}sFQL%3#Sn^~+IS+PRpgEkg~au*4CMER_BP~8+4#U)5f=~u1+ z@60?od3u1k%6n^fD^(aFfoo2aF9zc0i2rgNX9IBFphTXK*Yzk@t45v3BVp_%BxLP7 zH@9m*uvg!XbpKAT54hZ~`;R%M`+tzz`*_m(OkkGprpR|u=Jivo-^5r$AUM8iYPc6} z82at;RaGHGLzQA(idRiT+#g@%HQoy!>mKTUVyJs4p;*mf@li9cpZfFjgeJRHh>O}C zCB;saci&@1eSTGZtG<|9e7Q}#Bi<2>M)Q5w?h-pX&3B}o-V^Xe1FE>yvOC;-k7h!= zO*;)MBB5-lab~Qd13mQGXNsPPug^3BcGU3oMI!-QDP9h4f1iGO!takqY*Hld_fM!# zja_cu6gQqt*!JYfplt_FPTDpLm(+<bcf0j*OnF$a?=E;);mxdgSj8dy>|qV<;-H6h zbcts?Y*3z-U93Gq|1wMq3;zBJ9#$Cl0}rc+;i`u<+T8cBjzMwA!v=cAG~y_uf@M_c zCx<-hurPu&j&Kiif`oCL=nS<bWQb<@U30Bwut;g0JmTfba<!1l*R7HC5i1-DAGhR> z*qY7M>ekF+p-!8#o{KpK$smO#2E|!g&2b1W5x+)pjy{W2R>@{^i^UYdUhEj-Kg^BA zYAu}L+zuhi@14BiCK0ptqF6EO#AqlwDpULyDV=6YRhC=eC6yQ=#LrQVH@Sy^)0t|m zP%c@a(9y9_h=PYDx35NTN;p|$WuyFqOiBd%QNu9*hdz`Xr<3A#ft*8q7<4(o-WKju Sk{*S(xVab`+K9ya=KSB#KL!i{
literal 0 HcmV?d00001