Index: rostests/winetests/gdi32/font.c =================================================================== --- rostests/winetests/gdi32/font.c (revision 73458) +++ rostests/winetests/gdi32/font.c (working copy) @@ -6589,11 +6589,208 @@ DeleteDC(hdc); } +/* NOTE: TMPF_FIXED_PITCH is confusing and brain-dead. */ +#define _TMPF_VAR_PITCH TMPF_FIXED_PITCH + +typedef enum TRISTATE { + TS_UNKNOWN, + TS_TRUE, + TS_FALSE +} TRISTATE; + +typedef struct FONT_SEL_TEST { + BYTE CharSetBefore; + BYTE CharSetAfter; + + TRISTATE BoldBefore; + TRISTATE BoldAfter; + + BYTE ItalicBefore; + TRISTATE ItalicAfter; + + BYTE UnderlineBefore; + TRISTATE UnderlineAfter; + + BYTE StruckOutBefore; + TRISTATE StruckOutAfter; + + TRISTATE FixedPitchBefore; + TRISTATE FixedPitchAfter; +} FONT_SEL_TEST; + +static FONT_SEL_TEST g_Entries[] = { + /* Entry #0: default */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET + }, + /* Entry #1: symbol font*/ + { + SYMBOL_CHARSET, SYMBOL_CHARSET + }, + /* Entry #2: SHIFTJIS_CHARSET (Japanese) */ + { + SHIFTJIS_CHARSET, SHIFTJIS_CHARSET + }, + /* Entry #3: non-bold */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_FALSE, TS_FALSE + }, + /* Entry #4: bold */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #5: non-italic */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_FALSE + }, + /* Entry #6: italic */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + TRUE, TS_TRUE + }, + /* Entry #7: non-underline */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_FALSE, + }, + /* Entry #8: underline */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TRUE, TS_TRUE, + }, + /* Entry #9: struck-out */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TRUE, TS_TRUE, + }, + /* Entry #10: non-struck-out */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_FALSE, + }, + /* Entry #11: fixed-pitch */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #12: non-fixed-pitch */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_FALSE, TS_FALSE + } +}; +static INT g_EntryCount = (INT)(sizeof(g_Entries) / sizeof(g_Entries[0])); + +static void test_font_selection_entry(HDC hDC, INT nIndex, FONT_SEL_TEST *Entry) +{ + LOGFONTA lf; + HFONT hFont; + HGDIOBJ hFontOld; + TEXTMETRICA tm; + + ZeroMemory(&lf, sizeof(lf)); + + lf.lfCharSet = Entry->CharSetBefore; + + if (Entry->BoldBefore == TS_TRUE) + lf.lfWeight = FW_BOLD; + else if (Entry->BoldBefore == TS_FALSE) + lf.lfWeight = FW_NORMAL; + else + lf.lfWeight = FW_DONTCARE; + + lf.lfItalic = Entry->ItalicBefore; + lf.lfUnderline = Entry->UnderlineBefore; + lf.lfStrikeOut = Entry->StruckOutBefore; + + if (Entry->FixedPitchBefore == TS_TRUE) + lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; + else if (Entry->FixedPitchBefore == TS_FALSE) + lf.lfPitchAndFamily = VARIABLE_PITCH | FF_DONTCARE; + else + lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; + + hFont = CreateFontIndirectA(&lf); + ok(hFont != NULL, "Entry #%d: hFont failed\n", nIndex); + + hFontOld = SelectObject(hDC, hFont); + { + ok(GetTextMetricsA(hDC, &tm), "Entry #%d: GetTextMetricsA failed\n", nIndex); + + if (Entry->CharSetAfter != DEFAULT_CHARSET) + ok(tm.tmCharSet == Entry->CharSetAfter, "Entry #%d: CharSet mismatched\n", nIndex); + + if (Entry->BoldAfter == TS_TRUE) + ok(tm.tmWeight >= FW_BOLD, "Entry #%d: Weight mismatched\n", nIndex); + else if (Entry->BoldAfter == TS_FALSE) + ok(tm.tmWeight == FW_NORMAL, "Entry #%d: Weight mismatched\n", nIndex); + + if (Entry->ItalicAfter == TS_TRUE) + ok(tm.tmItalic, "Entry #%d: Italic mismatched\n", nIndex); + else if (Entry->ItalicAfter == TS_FALSE) + ok(!tm.tmItalic, "Entry #%d: Italic mismatched\n", nIndex); + + if (Entry->UnderlineAfter == TS_TRUE) + ok(tm.tmUnderlined, "Entry #%d: Underline mismatched\n", nIndex); + else if (Entry->UnderlineAfter == TS_FALSE) + ok(!tm.tmUnderlined, "Entry #%d: Underline mismatched\n", nIndex); + + if (Entry->StruckOutAfter == TS_TRUE) + ok(tm.tmStruckOut, "Entry #%d: Struck-out mismatched\n", nIndex); + else if (Entry->StruckOutAfter == TS_FALSE) + ok(!tm.tmStruckOut, "Entry #%d: Struck-out mismatched\n", nIndex); + + if (Entry->FixedPitchAfter == TS_TRUE) + ok(!(tm.tmPitchAndFamily & _TMPF_VAR_PITCH), "Entry #%d: Pitch mismatched\n", nIndex); + else if (Entry->FixedPitchAfter == TS_FALSE) + ok((tm.tmPitchAndFamily & _TMPF_VAR_PITCH), "Entry #%d: Pitch mismatched\n", nIndex); + } + SelectObject(hDC, hFontOld); + DeleteObject(hFont); +} + +static void test_font_selection(void) +{ + INT nIndex; + HDC hDC; + + hDC = CreateCompatibleDC(NULL); + for (nIndex = 0; nIndex < g_EntryCount; ++nIndex) + { + test_font_selection_entry(hDC, nIndex, &g_Entries[nIndex]); + } + DeleteDC(hDC); +} + START_TEST(font) { init(); test_stock_fonts(); + test_font_selection(); test_logfont(); test_bitmap_font(); test_outline_font();