Index: rostests/winetests/gdi32/font.c =================================================================== --- rostests/winetests/gdi32/font.c (revision 73465) +++ rostests/winetests/gdi32/font.c (working copy) @@ -3,6 +3,7 @@ * * Copyright 2002 Mike McCormack * Copyright 2004 Dmitry Timoshkov + * Copyright 2016 Katayama Hirofumi MZ * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -6589,11 +6590,411 @@ 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, + TS_UNKNOWN, TS_FALSE, + TS_UNKNOWN, TS_FALSE, + TS_UNKNOWN, TS_FALSE, + TS_UNKNOWN, TS_FALSE, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #1: symbol font*/ + { + SYMBOL_CHARSET, SYMBOL_CHARSET + }, + /* Entry #2: non-bold */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_FALSE, TS_FALSE + }, + /* Entry #3: bold */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #4: non-italic (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_FALSE + }, + /* Entry #5: italic (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + TRUE, TS_TRUE + }, + /* Entry #6: non-underline (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_FALSE + }, + /* Entry #7: underline (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + TRUE, TS_TRUE + }, + /* Entry #8: struck-out (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TRUE, TS_TRUE + }, + /* Entry #9: non-struck-out (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_FALSE + }, + /* Entry #10: fixed-pitch (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #11: non-fixed-pitch (without specifying bold) */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_FALSE, TS_FALSE + }, + /* Entry #12: fixed-pitch and bold */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_TRUE, TS_TRUE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #13: non-fixed-pitch and bold */ + { + DEFAULT_CHARSET, DEFAULT_CHARSET, + TS_TRUE, TS_TRUE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_FALSE, TS_FALSE + }, + /* Entry #14: OEM_CHARSET */ + { + OEM_CHARSET, OEM_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #15: OEM_CHARSET and bold */ + { + OEM_CHARSET, OEM_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #16: OEM_CHARSET and fixed-pitch */ + { + OEM_CHARSET, OEM_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #17: CHINESEBIG5_CHARSET (Chinese) */ + { + CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #18: CHINESEBIG5_CHARSET and bold */ + { + CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #19: CHINESEBIG5_CHARSET and fixed-pitch */ + { + CHINESEBIG5_CHARSET, CHINESEBIG5_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #20: GB2312_CHARSET (Chinese) */ + { + GB2312_CHARSET, GB2312_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #21: GB2312_CHARSET and bold */ + { + GB2312_CHARSET, GB2312_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #22: GB2312_CHARSET and fixed-pitch */ + { + GB2312_CHARSET, GB2312_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #23: RUSSIAN_CHARSET (Russian) */ + { + RUSSIAN_CHARSET, RUSSIAN_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #24: RUSSIAN_CHARSET and bold */ + { + RUSSIAN_CHARSET, RUSSIAN_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #25: RUSSIAN_CHARSET and italic */ + { + RUSSIAN_CHARSET, RUSSIAN_CHARSET, + TS_UNKNOWN, TS_FALSE, + TRUE, TS_TRUE, + }, + /* Entry #26: RUSSIAN_CHARSET and fixed-pitch */ + { + RUSSIAN_CHARSET, RUSSIAN_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #27: SHIFTJIS_CHARSET (Japanese) */ + { + SHIFTJIS_CHARSET, SHIFTJIS_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #28: SHIFTJIS_CHARSET and bold */ + { + SHIFTJIS_CHARSET, SHIFTJIS_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #29: SHIFTJIS_CHARSET and fixed-pitch */ + { + SHIFTJIS_CHARSET, SHIFTJIS_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #30: HANGUL_CHARSET (Korean) */ + { + HANGUL_CHARSET, HANGUL_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #31: HANGUL_CHARSET and bold */ + { + HANGUL_CHARSET, HANGUL_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #32: HANGUL_CHARSET and fixed-pitch */ + { + HANGUL_CHARSET, HANGUL_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #33: JOHAB_CHARSET (Korean) */ + { + JOHAB_CHARSET, JOHAB_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #34: JOHAB_CHARSET and bold */ + { + JOHAB_CHARSET, JOHAB_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #35: JOHAB_CHARSET and fixed-pitch */ + { + JOHAB_CHARSET, JOHAB_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #36: THAI_CHARSET (Thai) */ + { + THAI_CHARSET, THAI_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #37: THAI_CHARSET and bold */ + { + THAI_CHARSET, THAI_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #38: THAI_CHARSET and fixed-pitch */ + { + THAI_CHARSET, THAI_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + }, + /* Entry #39: GREEK_CHARSET (Greek) */ + { + GREEK_CHARSET, GREEK_CHARSET, + TS_UNKNOWN, TS_FALSE + }, + /* Entry #40: GREEK_CHARSET and bold */ + { + GREEK_CHARSET, GREEK_CHARSET, + TS_TRUE, TS_TRUE + }, + /* Entry #41: GREEK_CHARSET and italic */ + { + GREEK_CHARSET, GREEK_CHARSET, + TS_UNKNOWN, TS_FALSE, + TRUE, TS_TRUE + }, + /* Entry #42: GREEK_CHARSET and fixed-pitch */ + { + GREEK_CHARSET, GREEK_CHARSET, + TS_UNKNOWN, TS_FALSE, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + FALSE, TS_UNKNOWN, + TS_TRUE, TS_TRUE + } +}; +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, it was %u\n", nIndex, tm.tmCharSet); + + if (Entry->BoldAfter == TS_TRUE) + ok(tm.tmWeight >= FW_BOLD, "Entry #%d: Weight was non-bold\n", nIndex); + else if (Entry->BoldAfter == TS_FALSE) + ok(tm.tmWeight == FW_NORMAL, "Entry #%d: Weight was bold\n", nIndex); + + if (Entry->ItalicAfter == TS_TRUE) + ok(tm.tmItalic, "Entry #%d: Italic was non-italic\n", nIndex); + else if (Entry->ItalicAfter == TS_FALSE) + ok(!tm.tmItalic, "Entry #%d: Italic was italic\n", nIndex); + + if (Entry->UnderlineAfter == TS_TRUE) + ok(tm.tmUnderlined, "Entry #%d: Underlined was FALSE\n", nIndex); + else if (Entry->UnderlineAfter == TS_FALSE) + ok(!tm.tmUnderlined, "Entry #%d: Underlined was TRUE\n", nIndex); + + if (Entry->StruckOutAfter == TS_TRUE) + ok(tm.tmStruckOut, "Entry #%d: Struck-out was FALSE\n", nIndex); + else if (Entry->StruckOutAfter == TS_FALSE) + ok(!tm.tmStruckOut, "Entry #%d: Struck-out was TRUE\n", nIndex); + + if (Entry->FixedPitchAfter == TS_TRUE) + ok(!(tm.tmPitchAndFamily & _TMPF_VAR_PITCH), "Entry #%d: Pitch mismatched, it was non-fixed-pitch\n", nIndex); + else if (Entry->FixedPitchAfter == TS_FALSE) + ok((tm.tmPitchAndFamily & _TMPF_VAR_PITCH), "Entry #%d: Pitch mismatched, it was fixed-pitch\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();