Author: akhaldi Date: Thu Nov 26 23:16:17 2015 New Revision: 70129
URL: http://svn.reactos.org/svn/reactos?rev=70129&view=rev Log: [GDI32_WINETEST] Sync with Wine Staging 1.7.55. CORE-10536
Modified: trunk/rostests/winetests/gdi32/font.c trunk/rostests/winetests/gdi32/metafile.c trunk/rostests/winetests/gdi32/palette.c
Modified: trunk/rostests/winetests/gdi32/font.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdi32/font.c?rev... ============================================================================== --- trunk/rostests/winetests/gdi32/font.c [iso-8859-1] (original) +++ trunk/rostests/winetests/gdi32/font.c [iso-8859-1] Thu Nov 26 23:16:17 2015 @@ -55,6 +55,9 @@ static BOOL (WINAPI *pRemoveFontMemResourceEx)(HANDLE); static INT (WINAPI *pAddFontResourceExA)(LPCSTR, DWORD, PVOID); static BOOL (WINAPI *pRemoveFontResourceExA)(LPCSTR, DWORD, PVOID); +static BOOL (WINAPI *pGetFontRealizationInfo)(HDC hdc, DWORD *); +static BOOL (WINAPI *pGetFontFileInfo)(DWORD, DWORD, void *, DWORD, DWORD *); +static BOOL (WINAPI *pGetFontFileData)(DWORD, DWORD, ULONGLONG, void *, DWORD);
static HMODULE hgdi32 = 0; static const MAT2 mat = { {0,1}, {0,0}, {0,0}, {0,1} }; @@ -97,6 +100,9 @@ pRemoveFontMemResourceEx = (void *)GetProcAddress(hgdi32, "RemoveFontMemResourceEx"); pAddFontResourceExA = (void *)GetProcAddress(hgdi32, "AddFontResourceExA"); pRemoveFontResourceExA = (void *)GetProcAddress(hgdi32, "RemoveFontResourceExA"); + pGetFontRealizationInfo = (void *)GetProcAddress(hgdi32, "GetFontRealizationInfo"); + pGetFontFileInfo = (void *)GetProcAddress(hgdi32, "GetFontFileInfo"); + pGetFontFileData = (void *)GetProcAddress(hgdi32, "GetFontFileData");
system_lang_id = PRIMARYLANGID(GetSystemDefaultLangID()); } @@ -747,6 +753,7 @@ #define FH_SCALE 0x80000000 static void test_bitmap_font_metrics(void) { + static const WORD skip_rtl[] = {LANG_ARABIC, LANG_HEBREW, 0}; static const struct font_data { const char face_name[LF_FACESIZE]; @@ -754,19 +761,19 @@ int ave_char_width, max_char_width, dpi; BYTE first_char, last_char, def_char, break_char; DWORD ansi_bitfield; - WORD skip_lang_id; + const WORD *skip_lang_id; int scaled_height; } fd[] = { - { "MS Sans Serif", FW_NORMAL, FH_SCALE | 6, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, LANG_ARABIC, 13 }, + { "MS Sans Serif", FW_NORMAL, FH_SCALE | 6, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, skip_rtl, 13 }, { "MS Sans Serif", FW_NORMAL, FH_SCALE | 6, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x7f, 0x20, FS_CYRILLIC, 0, 13 }, - { "MS Sans Serif", FW_NORMAL, FH_SCALE | 8, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, LANG_ARABIC, 13 }, + { "MS Sans Serif", FW_NORMAL, FH_SCALE | 8, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, skip_rtl, 13 }, { "MS Sans Serif", FW_NORMAL, FH_SCALE | 8, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x7f, 0x20, FS_CYRILLIC, 0, 13 }, - { "MS Sans Serif", FW_NORMAL, FH_SCALE | 10, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, LANG_ARABIC, 13 }, + { "MS Sans Serif", FW_NORMAL, FH_SCALE | 10, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, skip_rtl, 13 }, { "MS Sans Serif", FW_NORMAL, FH_SCALE | 10, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x7f, 0x20, FS_CYRILLIC, 0, 13 }, - { "MS Sans Serif", FW_NORMAL, FH_SCALE | 14, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, LANG_ARABIC, 13 }, + { "MS Sans Serif", FW_NORMAL, FH_SCALE | 14, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, skip_rtl, 13 }, { "MS Sans Serif", FW_NORMAL, FH_SCALE | 14, 11, 2, 2, 0, 5, 11, 96, 0x20, 0xff, 0x7f, 0x20, FS_CYRILLIC, 0, 13 }, - { "MS Sans Serif", FW_NORMAL, FH_SCALE | 18, 13, 3, 3, 0, 7, 14, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, LANG_ARABIC, 16 }, + { "MS Sans Serif", FW_NORMAL, FH_SCALE | 18, 13, 3, 3, 0, 7, 14, 96, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, skip_rtl, 16 }, { "MS Sans Serif", FW_NORMAL, FH_SCALE | 18, 13, 3, 3, 0, 7, 14, 96, 0x20, 0xff, 0x7f, 0x20, FS_CYRILLIC, 0, 16 },
{ "MS Sans Serif", FW_NORMAL, FH_SCALE | 6, 13, 3, 3, 0, 7, 14, 120, 0x20, 0xff, 0x81, 0x20, FS_LATIN1 | FS_LATIN2, 0, 16 }, @@ -858,22 +865,22 @@ { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 2, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1 }, { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 1, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN2 | FS_CYRILLIC }, { "Small Fonts", FW_NORMAL, 3, 2, 1, 0, 0, 2, 4, 96, 0x20, 0xff, 0x80, 0x20, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 3, 4, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1, LANG_ARABIC }, + { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 3, 4, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1, skip_rtl}, { "Small Fonts", FW_NORMAL, 5, 4, 1, 1, 0, 2, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN2 | FS_CYRILLIC }, { "Small Fonts", FW_NORMAL, 5, 4, 1, 0, 0, 3, 6, 96, 0x20, 0xff, 0x80, 0x20, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 13, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1, LANG_ARABIC }, + { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 13, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1, skip_rtl}, { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN2 | FS_CYRILLIC }, { "Small Fonts", FW_NORMAL, 6, 5, 1, 1, 0, 3, 8, 96, 0x00, 0xff, 0x60, 0x00, FS_ARABIC }, { "Small Fonts", FW_NORMAL, 6, 5, 1, 0, 0, 4, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 7, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1, LANG_ARABIC }, + { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 7, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1, skip_rtl}, { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN2 | FS_CYRILLIC }, { "Small Fonts", FW_NORMAL, 8, 7, 1, 1, 0, 4, 8, 96, 0x00, 0xff, 0x60, 0x00, FS_ARABIC }, { "Small Fonts", FW_NORMAL, 8, 7, 1, 0, 0, 5, 10, 96, 0x20, 0xff, 0x80, 0x20, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 4, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1 | FS_LATIN2, LANG_ARABIC }, + { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 4, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1 | FS_LATIN2, skip_rtl}, { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 5, 8, 96, 0x20, 0xff, 0x80, 0x20, FS_CYRILLIC }, { "Small Fonts", FW_NORMAL, 10, 8, 2, 2, 0, 4, 9, 96, 0x00, 0xff, 0x60, 0x00, FS_ARABIC }, { "Small Fonts", FW_NORMAL, 10, 8, 2, 0, 0, 6, 12, 96, 0x20, 0xff, 0x80, 0x20, FS_JISJAPAN }, - { "Small Fonts", FW_NORMAL, 11, 9, 2, 2, 0, 5, 9, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC, LANG_ARABIC }, + { "Small Fonts", FW_NORMAL, 11, 9, 2, 2, 0, 5, 9, 96, 0x20, 0xff, 0x80, 0x20, FS_LATIN1 | FS_LATIN2 | FS_CYRILLIC, skip_rtl}, { "Small Fonts", FW_NORMAL, 11, 9, 2, 2, 0, 4, 10, 96, 0x00, 0xff, 0x60, 0x00, FS_ARABIC }, { "Small Fonts", FW_NORMAL, 11, 9, 2, 0, 0, 7, 14, 96, 0x20, 0xff, 0x80, 0x20, FS_JISJAPAN },
@@ -1015,8 +1022,17 @@
if(fd[i].dpi == tm.tmDigitizedAspectX) { + int skipme = 0; trace("matched %s, height %d charset %x dpi %d\n", lf.lfFaceName, lf.lfHeight, lf.lfCharSet, fd[i].dpi); - if (fd[i].skip_lang_id == 0 || system_lang_id != fd[i].skip_lang_id) + if (fd[i].skip_lang_id) + { + int si = 0; + skipme = 0; + while(!skipme && fd[i].skip_lang_id[si]) + if (fd[i].skip_lang_id[si++] == system_lang_id) + skipme = 1; + } + if (!skipme) { ok(tm.tmWeight == fd[i].weight, "%s(%d): tm.tmWeight %d != %d\n", fd[i].face_name, height, tm.tmWeight, fd[i].weight); if (fd[i].height & FH_SCALE) @@ -1850,6 +1866,8 @@ }
SelectObject(hdc, old_hfont); + /* force GDI to use new font, otherwise Windows leaks the font reference */ + GetTextMetricsA(hdc, &tm); DeleteObject(hfont); } } @@ -2002,6 +2020,7 @@ BYTE *ratio_rec; char ttf_name[MAX_PATH]; void *res, *copy; + BOOL ret;
if (!pAddFontResourceExA) { @@ -2034,7 +2053,9 @@ test_height( hdc, data[i].fd ); pRemoveFontResourceExA( ttf_name, FR_PRIVATE, 0 ); } - DeleteFileA( ttf_name ); + ret = DeleteFileA( ttf_name ); + ok(ret || broken(!ret && GetLastError() == ERROR_ACCESS_DENIED), + "DeleteFile error %d\n", GetLastError()); } }
@@ -2141,6 +2162,11 @@ ok(otm->otmpStyleName == NULL, "expected NULL got %p\n", otm->otmpStyleName); } ok(otm->otmpFullName == unset_ptr, "expected %p got %p\n", unset_ptr, otm->otmpFullName); + + /* check handling of NULL pointer */ + SetLastError(0xdeadbeef); + ret = GetOutlineTextMetricsA(hdc, otm_size, NULL); + ok(ret == otm_size, "expected %u, got %u, error %d\n", otm_size, ret, GetLastError());
HeapFree(GetProcessHeap(), 0, otm);
@@ -2375,12 +2401,12 @@ if (charset == SYMBOL_CHARSET) { ok(strcmp("Arial", name), "face name should NOT be Arial\n"); - ok(fs.fsCsb[0] & (1 << 31), "symbol encoding should be available\n"); + ok(fs.fsCsb[0] & (1u << 31), "symbol encoding should be available\n"); } else { ok(!strcmp("Arial", name), "face name should be Arial, not %s\n", name); - ok(!(fs.fsCsb[0] & (1 << 31)), "symbol encoding should NOT be available\n"); + ok(!(fs.fsCsb[0] & (1u << 31)), "symbol encoding should NOT be available\n"); }
if (!TranslateCharsetInfo((DWORD *)(INT_PTR)cs, &csi, TCI_SRCCHARSET)) @@ -3172,8 +3198,13 @@ USHORT usDefaultChar; USHORT usBreakChar; USHORT usMaxContext; -} TT_OS2_V2; + /* version 4 (OpenType 1.6) */ + USHORT usLowerOpticalPointSize; + USHORT usUpperOpticalPointSize; +} TT_OS2_V4; #include "poppack.h" + +#define TT_OS2_V0_SIZE (FIELD_OFFSET(TT_OS2_V4, ulCodePageRange1))
typedef struct { @@ -3226,7 +3257,7 @@ USHORT id_range_offset; } cmap_format_4_seg;
-static void expect_ff(const TEXTMETRICA *tmA, const TT_OS2_V2 *os2, WORD family, const char *name) +static void expect_ff(const TEXTMETRICA *tmA, const TT_OS2_V4 *os2, WORD family, const char *name) { ok((tmA->tmPitchAndFamily & 0xf0) == family || broken(PRIMARYLANGID(GetSystemDefaultLangID()) != LANG_ENGLISH), @@ -3646,7 +3677,7 @@ HDC hdc; HFONT hfont, hfont_old; TEXTMETRICA tmA; - TT_OS2_V2 tt_os2; + TT_OS2_V4 tt_os2; LONG size, ret; const char *font_name = lf->lfFaceName; DWORD cmap_first = 0, cmap_last = 0; @@ -3677,7 +3708,8 @@
memset(&tt_os2, 0, sizeof(tt_os2)); ret = GetFontData(hdc, MS_OS2_TAG, 0, &tt_os2, size); - ok(ret == size, "GetFontData should return %u not %u\n", size, ret); + ok(ret >= TT_OS2_V0_SIZE && ret <= size, "GetFontData should return size from [%u,%u] not %u\n", TT_OS2_V0_SIZE, + size, ret);
SetLastError(0xdeadbeef); ret = GetTextMetricsA(hdc, &tmA); @@ -3696,7 +3728,7 @@ TEXTMETRICW tmW;
ascent = GET_BE_WORD(tt_os2.usWinAscent); - descent = GET_BE_WORD(tt_os2.usWinDescent); + descent = abs((SHORT)GET_BE_WORD(tt_os2.usWinDescent)); cell_height = ascent + descent; ok(ntm->ntmCellHeight == cell_height, "%s: ntmCellHeight %u != %u, os2.usWinAscent/os2.usWinDescent %u/%u\n", font_name, ntm->ntmCellHeight, cell_height, ascent, descent); @@ -3917,30 +3949,76 @@ { "Times New Roman Greek", 161 }, { "Times New Roman TUR", 162 } }; + static const struct + { + const char *name; + int charset; + } shell_subst[] = + { + { "MS Shell Dlg", 186 }, + { "MS Shell Dlg", 238 }, + { "MS Shell Dlg", 204 }, + { "MS Shell Dlg", 161 }, + { "MS Shell Dlg", 162 } + }; LOGFONTA lf; HDC hdc; HFONT hfont; CHARSETINFO csi; - INT cs, expected_cs, i; + INT cs, expected_cs, i, ret; char buf[LF_FACESIZE]; + + expected_cs = GetACP(); + if (!TranslateCharsetInfo(ULongToPtr(expected_cs), &csi, TCI_SRCCODEPAGE)) + { + skip("TranslateCharsetInfo failed for code page %d\n", expected_cs); + return; + } + expected_cs = csi.ciCharset; + trace("ACP %d -> charset %d\n", GetACP(), expected_cs); + + hdc = CreateCompatibleDC(0); + + for (i = 0; i < sizeof(shell_subst)/sizeof(shell_subst[0]); i++) + { + ret = is_font_installed(shell_subst[i].name); + ok(ret || broken(!ret) /* win2000 */, "%s should be enumerated\n", shell_subst[i].name); + ret = is_truetype_font_installed(shell_subst[i].name); + ok(ret || broken(!ret) /* win2000 */, "%s should be enumerated\n", shell_subst[i].name); + + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = -13; + lf.lfWeight = FW_REGULAR; + strcpy(lf.lfFaceName, shell_subst[i].name); + hfont = CreateFontIndirectA(&lf); + hfont = SelectObject(hdc, hfont); + GetTextFaceA(hdc, sizeof(buf), buf); + ok(!lstrcmpiA(buf, shell_subst[i].name), "expected %s, got %s\n", shell_subst[i].name, buf); + cs = GetTextCharset(hdc); + ok(cs == ANSI_CHARSET, "expected ANSI_CHARSET, got %d for font %s\n", cs, shell_subst[i].name); + + DeleteObject(SelectObject(hdc, hfont)); + + memset(&lf, 0, sizeof(lf)); + lf.lfHeight = -13; + lf.lfWeight = FW_DONTCARE; + strcpy(lf.lfFaceName, shell_subst[i].name); + hfont = CreateFontIndirectA(&lf); + hfont = SelectObject(hdc, hfont); + GetTextFaceA(hdc, sizeof(buf), buf); + ok(!lstrcmpiA(buf, shell_subst[i].name), "expected %s, got %s\n", shell_subst[i].name, buf); + cs = GetTextCharset(hdc); + ok(cs == expected_cs || cs == ANSI_CHARSET, "expected %d, got %d for font %s\n", expected_cs, cs, shell_subst[i].name); + DeleteObject(SelectObject(hdc, hfont)); + }
if (!is_truetype_font_installed("Arial") || !is_truetype_font_installed("Times New Roman")) { + DeleteDC(hdc); skip("Arial or Times New Roman not installed\n"); return; } - - expected_cs = GetACP(); - if (!TranslateCharsetInfo(ULongToPtr(expected_cs), &csi, TCI_SRCCODEPAGE)) - { - skip("TranslateCharsetInfo failed for code page %d\n", expected_cs); - return; - } - expected_cs = csi.ciCharset; - trace("ACP %d -> charset %d\n", GetACP(), expected_cs); - - hdc = GetDC(0);
memset(&lf, 0, sizeof(lf)); lf.lfHeight = 100; @@ -3999,6 +4077,15 @@
for (i = 0; i < sizeof(font_subst)/sizeof(font_subst[0]); i++) { + ret = is_font_installed(font_subst[i].name); +todo_wine + ok(ret || broken(!ret && !i) /* win2000 doesn't have Times New Roman Baltic substitution */, + "%s should be enumerated\n", font_subst[i].name); + ret = is_truetype_font_installed(font_subst[i].name); +todo_wine + ok(ret || broken(!ret && !i) /* win2000 doesn't have Times New Roman Baltic substitution */, + "%s should be enumerated\n", font_subst[i].name); + memset(&lf, 0, sizeof(lf)); lf.lfHeight = -13; lf.lfWeight = FW_REGULAR; @@ -4038,16 +4125,44 @@ DeleteObject(SelectObject(hdc, hfont)); }
- ReleaseDC(0, hdc); -} - -static void test_GdiRealizationInfo(void) -{ + DeleteDC(hdc); +} + +static void test_RealizationInfo(void) +{ + struct font_realization_info { + DWORD size; + DWORD flags; + DWORD cache_num; + DWORD instance_id; + DWORD unk; + WORD face_index; + WORD simulations; + }; + + struct realization_info_t + { + DWORD flags; + DWORD cache_num; + DWORD instance_id; + }; + HDC hdc; - DWORD info[4]; - BOOL r; + DWORD info[4], info2[10]; + BOOL r, have_file = FALSE; HFONT hfont, hfont_old; LOGFONTA lf; + DWORD needed, read; + HANDLE h; + BYTE file[16], data[14]; + struct file_info + { + FILETIME time; + LARGE_INTEGER size; + WCHAR path[MAX_PATH]; + } file_info; + FILETIME time; + LARGE_INTEGER size;
if(!pGdiRealizationInfo) { @@ -4063,16 +4178,17 @@ ok((info[0] & 0xf) == 1, "info[0] = %x for the system font\n", info[0]); ok(info[3] == 0xcccccccc, "structure longer than 3 dwords\n");
- if (!is_truetype_font_installed("Arial")) + if (!is_truetype_font_installed("Tahoma")) { skip("skipping GdiRealizationInfo with truetype font\n"); goto end; }
memset(&lf, 0, sizeof(lf)); - strcpy(lf.lfFaceName, "Arial"); + strcpy(lf.lfFaceName, "Tahoma"); lf.lfHeight = 20; - lf.lfWeight = FW_NORMAL; + lf.lfWeight = FW_BOLD; + lf.lfItalic = 1; hfont = CreateFontIndirectA(&lf); hfont_old = SelectObject(hdc, hfont);
@@ -4081,6 +4197,93 @@ ok(r != 0, "ret 0\n"); ok((info[0] & 0xf) == 3, "info[0] = %x for arial\n", info[0]); ok(info[3] == 0xcccccccc, "structure longer than 3 dwords\n"); + + if (pGetFontRealizationInfo) + { + struct font_realization_info *fri = (struct font_realization_info*)info2; + struct realization_info_t *ri = (struct realization_info_t*)info; + + /* The first DWORD represents a struct size. On a + newly rebooted system setting this to < 16 results + in GetFontRealizationInfo failing. However there + appears to be some caching going on which results + in calls after a successful call also succeeding even + if the size < 16. This means we can't reliably test + this behaviour. */ + + memset(info2, 0xcc, sizeof(info2)); + info2[0] = 16; + r = pGetFontRealizationInfo(hdc, info2); + ok(r != 0, "ret 0\n"); + /* We may get the '24' version here if that has been previously + requested. */ + ok(fri->size == 16 || fri->size == 24, "got %d\n", info2[0]); + ok(fri->flags == ri->flags, "flags mismatch\n"); + ok(fri->cache_num == ri->cache_num, "cache_num mismatch\n"); + ok(fri->instance_id == ri->instance_id, "instance id mismatch\n"); + ok(info2[6] == 0xcccccccc, "got wrong dword 6, 0x%08x\n", info2[6]); + + memset(info2, 0xcc, sizeof(info2)); + info2[0] = 28; + r = pGetFontRealizationInfo(hdc, info2); + ok(r == FALSE, "got %d\n", r); + + memset(info2, 0xcc, sizeof(info2)); + info2[0] = 24; + r = pGetFontRealizationInfo(hdc, info2); + ok(r != 0, "ret 0\n"); + ok(fri->size == 24, "got %d\n", fri->size); + ok(fri->flags == ri->flags, "flags mismatch\n"); + ok(fri->cache_num == ri->cache_num, "cache_num mismatch\n"); + ok(fri->instance_id == ri->instance_id, "instance id mismatch\n"); + ok(fri->simulations == 0x2, "got simulations flags 0x%04x\n", fri->simulations); + ok(fri->face_index == 0, "got wrong face index %u\n", fri->face_index); + ok(info2[6] == 0xcccccccc, "structure longer than 6 dwords\n"); + + /* Test GetFontFileInfo() */ + /* invalid font id */ + SetLastError(0xdeadbeef); + r = pGetFontFileInfo(0xabababab, 0, &file_info, sizeof(file_info), &needed); + ok(r == 0 && GetLastError() == ERROR_INVALID_PARAMETER, "ret %d gle %d\n", r, GetLastError()); + + needed = 0; + r = pGetFontFileInfo(fri->instance_id, 0, &file_info, sizeof(file_info), &needed); + ok(r != 0 || GetLastError() == ERROR_NOACCESS, "ret %d gle %d\n", r, GetLastError()); + + if (r) + { + ok(needed > 0 && needed < sizeof(file_info), "got needed size %u\n", needed); + + h = CreateFileW(file_info.path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + ok(h != INVALID_HANDLE_VALUE, "Unable to open file %d\n", GetLastError()); + + GetFileTime(h, NULL, NULL, &time); + ok(!CompareFileTime(&file_info.time, &time), "time mismatch\n"); + GetFileSizeEx(h, &size); + ok(file_info.size.QuadPart == size.QuadPart, "size mismatch\n"); + + /* Read first 16 bytes from the file */ + ReadFile(h, file, sizeof(file), &read, NULL); + CloseHandle(h); + have_file = TRUE; + + /* shorter buffer */ + SetLastError(0xdeadbeef); + r = pGetFontFileInfo(fri->instance_id, 0, &file_info, needed - 1, &needed); + ok(r == 0 && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "ret %d gle %d\n", r, GetLastError()); + } + + if (pGetFontFileData) { + /* Get bytes 2 - 16 using GetFontFileData */ + r = pGetFontFileData(fri->instance_id, 0, 2, data, sizeof(data)); + ok(r != 0, "ret 0 gle %d\n", GetLastError()); + + if (have_file) + ok(!memcmp(data, file + 2, sizeof(data)), "mismatch\n"); + else + win_skip("GetFontFileInfo() failed, skipping\n"); + } + }
DeleteObject(SelectObject(hdc, hfont_old));
@@ -4868,7 +5071,6 @@ int ret; LOGFONTA lf; HDC hdc; - struct enum_fullname_data efnd;
if (!is_truetype_font_installed("Arial")) { @@ -4929,26 +5131,89 @@ ret = EnumFontFamiliesA(hdc, NULL, enum_all_fonts_proc, (LPARAM)&lf); ok(ret, "font Arial Italic Bold should not be enumerated\n");
- /* MS Shell Dlg and MS Shell Dlg 2 must exist */ + DeleteDC(hdc); +} + +static INT CALLBACK enum_ms_shell_dlg_proc(const LOGFONTA *lf, const TEXTMETRICA *ntm, DWORD type, LPARAM lParam) +{ + struct enum_fullname_data *efnd = (struct enum_fullname_data *)lParam; + +if (0) /* Disabled to limit console spam */ + trace("enumed font "%s", charset %d, height %d, weight %d, italic %d\n", + lf->lfFaceName, lf->lfCharSet, lf->lfHeight, lf->lfWeight, lf->lfItalic); + + if (type != TRUETYPE_FONTTYPE) return 1; + if (strcmp(lf->lfFaceName, "MS Shell Dlg") != 0) return 1; + + efnd->elf[efnd->total++] = *(ENUMLOGFONTA *)lf; + return 0; +} + +static INT CALLBACK enum_ms_shell_dlg2_proc(const LOGFONTA *lf, const TEXTMETRICA *ntm, DWORD type, LPARAM lParam) +{ + struct enum_fullname_data *efnd = (struct enum_fullname_data *)lParam; + +if (0) /* Disabled to limit console spam */ + trace("enumed font "%s", charset %d, height %d, weight %d, italic %d\n", + lf->lfFaceName, lf->lfCharSet, lf->lfHeight, lf->lfWeight, lf->lfItalic); + + if (type != TRUETYPE_FONTTYPE) return 1; + if (strcmp(lf->lfFaceName, "MS Shell Dlg 2") != 0) return 1; + + efnd->elf[efnd->total++] = *(ENUMLOGFONTA *)lf; + return 0; +} + +static void test_EnumFonts_subst(void) +{ + int ret; + LOGFONTA lf; + HDC hdc; + struct enum_fullname_data efnd; + + ret = is_font_installed("MS Shell Dlg"); + ok(ret, "MS Shell Dlg should be enumerated\n"); + ret = is_truetype_font_installed("MS Shell Dlg"); + ok(ret, "MS Shell Dlg should be enumerated as a TrueType font\n"); + + ret = is_font_installed("MS Shell Dlg 2"); + ok(ret, "MS Shell Dlg 2 should be enumerated\n"); + ret = is_truetype_font_installed("MS Shell Dlg 2"); + ok(ret, "MS Shell Dlg 2 should be enumerated as a TrueType font\n"); + + hdc = CreateCompatibleDC(0); + + memset(&efnd, 0, sizeof(efnd)); + ret = EnumFontFamiliesExA(hdc, NULL, enum_ms_shell_dlg_proc, (LPARAM)&efnd, 0); + ok(ret, "MS Shell Dlg should not be enumerated\n"); + ok(!efnd.total, "MS Shell Dlg should not be enumerated\n"); + memset(&lf, 0, sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET;
memset(&efnd, 0, sizeof(efnd)); strcpy(lf.lfFaceName, "MS Shell Dlg"); - ret = EnumFontFamiliesExA(hdc, &lf, enum_fullname_data_proc, (LPARAM)&efnd, 0); - ok(ret, "font MS Shell Dlg is not enumerated\n"); - ret = strcmp((char*)efnd.elf[0].elfLogFont.lfFaceName, "MS Shell Dlg"); - todo_wine ok(!ret, "expected MS Shell Dlg got %s\n", efnd.elf[0].elfLogFont.lfFaceName); - ret = strcmp((char*)efnd.elf[0].elfFullName, "MS Shell Dlg"); + ret = EnumFontFamiliesExA(hdc, &lf, enum_ms_shell_dlg_proc, (LPARAM)&efnd, 0); + ok(!ret, "MS Shell Dlg should be enumerated\n"); + ok(efnd.total > 0, "MS Shell Dlg should be enumerated\n"); + ret = strcmp((const char *)efnd.elf[0].elfLogFont.lfFaceName, "MS Shell Dlg"); + ok(!ret, "expected MS Shell Dlg, got %s\n", efnd.elf[0].elfLogFont.lfFaceName); + ret = strcmp((const char *)efnd.elf[0].elfFullName, "MS Shell Dlg"); ok(ret, "did not expect MS Shell Dlg\n"); + + memset(&efnd, 0, sizeof(efnd)); + ret = EnumFontFamiliesExA(hdc, NULL, enum_ms_shell_dlg2_proc, (LPARAM)&efnd, 0); + ok(ret, "MS Shell Dlg 2 should not be enumerated\n"); + ok(!efnd.total, "MS Shell Dlg 2 should not be enumerated\n");
memset(&efnd, 0, sizeof(efnd)); strcpy(lf.lfFaceName, "MS Shell Dlg 2"); - ret = EnumFontFamiliesExA(hdc, &lf, enum_fullname_data_proc, (LPARAM)&efnd, 0); - ok(ret, "font MS Shell Dlg 2 is not enumerated\n"); - ret = strcmp((char*)efnd.elf[0].elfLogFont.lfFaceName, "MS Shell Dlg 2"); - todo_wine ok(!ret, "expected MS Shell Dlg 2 got %s\n", efnd.elf[0].elfLogFont.lfFaceName); - ret = strcmp((char*)efnd.elf[0].elfFullName, "MS Shell Dlg 2"); + ret = EnumFontFamiliesExA(hdc, &lf, enum_ms_shell_dlg2_proc, (LPARAM)&efnd, 0); + ok(!ret, "MS Shell Dlg 2 should be enumerated\n"); + ok(efnd.total > 0, "MS Shell Dlg 2 should be enumerated\n"); + ret = strcmp((const char *)efnd.elf[0].elfLogFont.lfFaceName, "MS Shell Dlg 2"); + ok(!ret, "expected MS Shell Dlg 2, got %s\n", efnd.elf[0].elfLogFont.lfFaceName); + ret = strcmp((const char *)efnd.elf[0].elfFullName, "MS Shell Dlg 2"); ok(ret, "did not expect MS Shell Dlg 2\n");
DeleteDC(hdc); @@ -5704,9 +5969,12 @@ { int charset, weight, height, height_pixels, dpi; const char face_name[LF_FACESIZE]; - } td[][11] = + WORD lang_id; + } td[][12] = { { /* ANSI_FIXED_FONT */ + { ANSI_CHARSET, FW_NORMAL, 12, 12, 96, "Courier", LANG_ARABIC }, + { ANSI_CHARSET, FW_NORMAL, 12, 12, 96, "Courier", LANG_HEBREW}, { DEFAULT_CHARSET, FW_NORMAL, 12, 13, 96, "Courier" }, { DEFAULT_CHARSET, FW_NORMAL, 12, 13, 120, "Courier" }, { 0 } @@ -5735,6 +6003,7 @@ { 0 } }, { /* DEFAULT_GUI_FONT */ + { SHIFTJIS_CHARSET, FW_NORMAL, -11, 13, 96, "MS Shell Dlg" }, { SHIFTJIS_CHARSET, FW_NORMAL, -12, 15, 96, "?MS UI Gothic" }, { SHIFTJIS_CHARSET, FW_NORMAL, -15, 18, 120, "?MS UI Gothic" }, { HANGEUL_CHARSET, FW_NORMAL, -12, 15, 96, "?Gulim" }, @@ -5769,7 +6038,9 @@
for (j = 0; td[i][j].face_name[0] != 0; j++) { - if (lf.lfCharSet != td[i][j].charset && td[i][j].charset != DEFAULT_CHARSET) + if ((lf.lfCharSet != td[i][j].charset && td[i][j].charset != DEFAULT_CHARSET) || + (system_lang_id != td[i][j].lang_id && td[i][j].lang_id != LANG_NEUTRAL) || + (td[i][j].face_name[0] != '?' && strcmp(lf.lfFaceName, td[i][j].face_name))) { continue; } @@ -6224,6 +6495,7 @@ test_height_selection(); test_AddFontMemResource(); test_EnumFonts(); + test_EnumFonts_subst();
/* On Windows Arial has a lot of default charset aliases such as Arial Cyr, * I'd like to avoid them in this test. @@ -6241,7 +6513,7 @@ skip("Arial Black or Symbol/Wingdings is not installed\n"); test_EnumFontFamiliesEx_default_charset(); test_GetTextMetrics(); - test_GdiRealizationInfo(); + test_RealizationInfo(); test_GetTextFace(); test_GetGlyphOutline(); test_GetTextMetrics2("Tahoma", -11);
Modified: trunk/rostests/winetests/gdi32/metafile.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdi32/metafile.c... ============================================================================== --- trunk/rostests/winetests/gdi32/metafile.c [iso-8859-1] (original) +++ trunk/rostests/winetests/gdi32/metafile.c [iso-8859-1] Thu Nov 26 23:16:17 2015 @@ -3361,6 +3361,39 @@ DeleteEnhMetaFile(hemf); }
+static void test_emf_GetPath(void) +{ + HDC hdcMetafile; + HENHMETAFILE hemf; + BOOL ret; + int size; + + SetLastError(0xdeadbeef); + hdcMetafile = CreateEnhMetaFileA(GetDC(0), NULL, NULL, NULL); + ok(hdcMetafile != 0, "CreateEnhMetaFileA error %d\n", GetLastError()); + + BeginPath(hdcMetafile); + ret = MoveToEx(hdcMetafile, 50, 50, NULL); + ok( ret, "MoveToEx error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 50, 150); + ok( ret, "LineTo error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 150, 150); + ok( ret, "LineTo error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 150, 50); + ok( ret, "LineTo error %d.\n", GetLastError()); + ret = LineTo(hdcMetafile, 50, 50); + ok( ret, "LineTo error %d.\n", GetLastError()); + EndPath(hdcMetafile); + + size = GetPath(hdcMetafile, NULL, NULL, 0); + todo_wine ok( size == 5, "GetPath returned %d.\n", size); + + hemf = CloseEnhMetaFile(hdcMetafile); + ok(hemf != 0, "CloseEnhMetaFile error %d\n", GetLastError()); + + DeleteEnhMetaFile(hemf); +} + START_TEST(metafile) { init_function_pointers(); @@ -3374,6 +3407,7 @@ test_emf_ExtTextOut_on_path(); test_emf_clipping(); test_emf_polybezier(); + test_emf_GetPath();
/* For win-format metafiles (mfdrv) */ test_mf_SaveDC();
Modified: trunk/rostests/winetests/gdi32/palette.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/gdi32/palette.c?... ============================================================================== --- trunk/rostests/winetests/gdi32/palette.c [iso-8859-1] (original) +++ trunk/rostests/winetests/gdi32/palette.c [iso-8859-1] Thu Nov 26 23:16:17 2015 @@ -191,108 +191,115 @@ ReleaseDC( 0, hdc ); }
-static void test_system_palette_entries(void) -{ - HDC hdc; +static void check_system_palette_entries(HDC hdc) +{ PALETTEENTRY entries[256]; PALETTEENTRY defpal[20]; int i, count;
+ memset( defpal, 0xaa, sizeof(defpal) ); + count = GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 20, defpal ); + ok( count == 20, "wrong size %u\n", count ); + + memset( entries, 0x55, sizeof(entries) ); + count = GetSystemPaletteEntries( hdc, 0, 256, entries ); + ok( count == 0, "wrong size %u\n", count); + for (i = 0; i < 10; i++) + { + ok( entries[i].peRed == defpal[i].peRed && + entries[i].peGreen == defpal[i].peGreen && + entries[i].peBlue == defpal[i].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, + defpal[i].peRed, defpal[i].peGreen, defpal[i].peBlue ); + } + for (i = 10; i < 246; ++i) + { + ok( !entries[i].peRed && + !entries[i].peGreen && + !entries[i].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of 0,0,0\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags); + } + for (i = 246; i < 256; i++) + { + int idx = i - 246 + 10; + ok( entries[i].peRed == defpal[idx].peRed && + entries[i].peGreen == defpal[idx].peGreen && + entries[i].peBlue == defpal[idx].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, + defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue ); + } + + memset( entries, 0x55, sizeof(entries) ); + count = GetSystemPaletteEntries( hdc, 0, 10, entries ); + ok( count == 0, "wrong size %u\n", count); + for (i = 0; i < 10; i++) + { + ok( entries[i].peRed == defpal[i].peRed && + entries[i].peGreen == defpal[i].peGreen && + entries[i].peBlue == defpal[i].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, + defpal[i].peRed, defpal[i].peGreen, defpal[i].peBlue ); + } + + memset( entries, 0x55, sizeof(entries) ); + count = GetSystemPaletteEntries( hdc, 10, 246, entries ); + ok( count == 0, "wrong size %u\n", count); + for (i = 0; i < 236; ++i) + { + ok( !entries[i].peRed && + !entries[i].peGreen && + !entries[i].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of 0,0,0\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags); + } + for (i = 236; i < 246; i++) + { + int idx = i - 236 + 10; + ok( entries[i].peRed == defpal[idx].peRed && + entries[i].peGreen == defpal[idx].peGreen && + entries[i].peBlue == defpal[idx].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, + defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue ); + } + + memset( entries, 0x55, sizeof(entries) ); + count = GetSystemPaletteEntries( hdc, 246, 10, entries ); + ok( count == 0, "wrong size %u\n", count); + for (i = 0; i < 10; i++) + { + int idx = i + 10; + ok( entries[i].peRed == defpal[idx].peRed && + entries[i].peGreen == defpal[idx].peGreen && + entries[i].peBlue == defpal[idx].peBlue && + !entries[i].peFlags, + "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, + entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, + defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue ); + } +} + +static void test_system_palette_entries(void) +{ + HDC hdc; + HDC metafile_dc; + HMETAFILE metafile; + hdc = GetDC(0);
if (!(GetDeviceCaps( hdc, RASTERCAPS ) & RC_PALETTE)) { - memset( defpal, 0xaa, sizeof(defpal) ); - count = GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, 20, defpal ); - ok( count == 20, "wrong size %u\n", count ); - - memset( entries, 0x55, sizeof(entries) ); - count = GetSystemPaletteEntries( hdc, 0, 256, entries ); - ok( count == 0, "wrong size %u\n", count); - for (i = 0; i < 10; i++) - { - ok( entries[i].peRed == defpal[i].peRed && - entries[i].peGreen == defpal[i].peGreen && - entries[i].peBlue == defpal[i].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, - defpal[i].peRed, defpal[i].peGreen, defpal[i].peBlue ); - } - for (i = 10; i < 246; ++i) - { - ok( !entries[i].peRed && - !entries[i].peGreen && - !entries[i].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of 0,0,0\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags); - } - for (i = 246; i < 256; i++) - { - int idx = i - 246 + 10; - ok( entries[i].peRed == defpal[idx].peRed && - entries[i].peGreen == defpal[idx].peGreen && - entries[i].peBlue == defpal[idx].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, - defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue ); - } - - memset( entries, 0x55, sizeof(entries) ); - count = GetSystemPaletteEntries( hdc, 0, 10, entries ); - ok( count == 0, "wrong size %u\n", count); - for (i = 0; i < 10; i++) - { - ok( entries[i].peRed == defpal[i].peRed && - entries[i].peGreen == defpal[i].peGreen && - entries[i].peBlue == defpal[i].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, - defpal[i].peRed, defpal[i].peGreen, defpal[i].peBlue ); - } - - memset( entries, 0x55, sizeof(entries) ); - count = GetSystemPaletteEntries( hdc, 10, 246, entries ); - ok( count == 0, "wrong size %u\n", count); - for (i = 0; i < 236; ++i) - { - ok( !entries[i].peRed && - !entries[i].peGreen && - !entries[i].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of 0,0,0\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags); - } - for (i = 236; i < 246; i++) - { - int idx = i - 236 + 10; - ok( entries[i].peRed == defpal[idx].peRed && - entries[i].peGreen == defpal[idx].peGreen && - entries[i].peBlue == defpal[idx].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, - defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue ); - } - - memset( entries, 0x55, sizeof(entries) ); - count = GetSystemPaletteEntries( hdc, 246, 10, entries ); - ok( count == 0, "wrong size %u\n", count); - for (i = 0; i < 10; i++) - { - int idx = i + 10; - ok( entries[i].peRed == defpal[idx].peRed && - entries[i].peGreen == defpal[idx].peGreen && - entries[i].peBlue == defpal[idx].peBlue && - !entries[i].peFlags, - "%u: wrong color %02x,%02x,%02x,%02x instead of %02x,%02x,%02x\n", i, - entries[i].peRed, entries[i].peGreen, entries[i].peBlue, entries[i].peFlags, - defpal[idx].peRed, defpal[idx].peGreen, defpal[idx].peBlue ); - } - + check_system_palette_entries(hdc); } else { @@ -300,6 +307,13 @@ }
ReleaseDC( 0, hdc ); + + metafile_dc = CreateMetaFileA(NULL); + + check_system_palette_entries(metafile_dc); + + metafile = CloseMetaFile(metafile_dc); + DeleteMetaFile(metafile); }
START_TEST(palette)