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,238 @@ 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: SHIFTJIS_CHARSET (Japanese) */ + { + SHIFTJIS_CHARSET, SHIFTJIS_CHARSET, + TS_FALSE, TS_FALSE + }, + /* Entry #15: SHIFTJIS_CHARSET and bold */ + { + SHIFTJIS_CHARSET, SHIFTJIS_CHARSET, + 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\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();