Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/dwrite/tests/layout.c | 139 +++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 3fe149927ca..c242155cce3 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -6489,6 +6489,144 @@ if (SUCCEEDED(hr)) IDWriteFactory_Release(factory); }
+#define get_font_name(a, b, c) get_font_name_(a, b, c, __LINE__) +static void get_font_name_(IDWriteFont *font, WCHAR *name, UINT32 size, int line) +{ + HRESULT hr; + IDWriteFontFamily *family; + IDWriteLocalizedStrings *names; + UINT32 index; + BOOL exists; + + hr = IDWriteFont_GetFontFamily(font, &family); + ok_(__FILE__, line)(hr == S_OK, "got %#x\n", hr); + + hr = IDWriteFontFamily_GetFamilyNames(family, &names); + ok_(__FILE__, line)(hr == S_OK, "got %#x\n", hr); + + hr = IDWriteLocalizedStrings_FindLocaleName(names, L"en-us", &index, &exists); + ok_(__FILE__, line)(hr == S_OK, "got %#x\n", hr); + ok_(__FILE__, line)(index != UINT_MAX && exists, "name was not found\n"); + hr = IDWriteLocalizedStrings_GetString(names, index, name, size); + ok_(__FILE__, line)(hr == S_OK, "got %#x\n", hr); + + IDWriteLocalizedStrings_Release(names); + IDWriteFontFamily_Release(family); +} + +static void test_SegoeUI(void) +{ + static const WCHAR *families[] = { L"Tahoma", L"Segoe UI", NULL }; + static const WCHAR text[] = { 0x25d4, 0 }; + HRESULT hr; + IDWriteFactory2 *factory; + IDWriteFontCollection *collection; + IDWriteFontFamily *family; + IDWriteFont *font; + IDWriteFontFallback *fallback; + UINT32 index, count, i, mappedlength; + WCHAR name[256]; + BOOL exists, found; + FLOAT scale; + + hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory2, (IUnknown **)&factory); + if (hr != S_OK) + { + win_skip("IDWriteFactory2 is not supported\n"); + return; + } + + hr = IDWriteFactory2_GetSystemFontCollection(factory, &collection, FALSE); + ok(hr == S_OK, "got %#x\n", hr); + + hr = IDWriteFontCollection_FindFamilyName(collection, L"Segoe UI", &index, &exists); + ok(hr == S_OK, "got %#x\n", hr); + if (!exists) + { + skip("Segoe UI is not installed\n"); + IDWriteFontCollection_Release(collection); + IDWriteFactory2_Release(factory); + return; + } + ok(index != UINT_MAX && exists, "Segoe UI was not found\n"); + + hr = IDWriteFontCollection_GetFontFamily(collection, index, &family); + ok(hr == S_OK, "got %#x\n", hr); + + count = IDWriteFontFamily_GetFontCount(family); + trace("family Segoe UI has %u fonts\n", count); + + found = FALSE; + + for (i = 0; i < count; i++) + { + hr = IDWriteFontFamily_GetFont(family, i, &font); + ok(hr == S_OK, "got %#x\n", hr); + + get_font_name(font, name, ARRAY_SIZE(name)); + if (!wcscmp(name, L"Segoe UI Symbol")) + found = TRUE; + + hr = IDWriteFont_HasCharacter(font, 0x25d4, &exists); + ok(hr == S_OK, "got %#x\n", hr); + ok(!exists, "%u: %s has character 0x25d4\n", i, wine_dbgstr_w(name)); + + IDWriteFont_Release(font); + } + + ok(!found, "Segoe UI Symbol should not be part of Segoe UI family\n"); + + IDWriteFontFamily_Release(family); + + hr = IDWriteFactory2_GetSystemFontFallback(factory, &fallback); + ok(hr == S_OK, "got %#x\n", hr); + + g_source = text; + + hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, collection, L"Segoe UI", DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); + ok(hr == S_OK, "got %#x\n", hr); + ok(mappedlength == 1, "got %u\n", mappedlength); + ok(scale == 1.0f, "got %f\n", scale); + + get_font_name(font, name, ARRAY_SIZE(name)); +todo_wine + ok(!wcscmp(name, L"Segoe UI Symbol"), "got %s\n", wine_dbgstr_w(name)); + + hr = IDWriteFont_HasCharacter(font, 0x25d4, &exists); + ok(hr == S_OK, "got %#x\n", hr); +todo_wine + ok(exists, "%s should have character 0x25d4\n", wine_dbgstr_w(name)); + + IDWriteFont_Release(font); + + for (i = 0; i < ARRAY_SIZE(families); i++) + { + hr = IDWriteFontFallback_MapCharacters(fallback, &analysissource, 0, 1, collection, families[i], DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, &mappedlength, &font, &scale); +todo_wine_if(families[i] == NULL) + ok(hr == S_OK, "%u: %s - got %#x\n", i, wine_dbgstr_w(families[i]), hr); + if (hr != S_OK) continue; + ok(mappedlength == 1, "got %u\n", mappedlength); + ok(scale == 1.0f, "got %f\n", scale); + + get_font_name(font, name, ARRAY_SIZE(name)); +todo_wine + ok(!wcscmp(name, L"Segoe UI Symbol"), "got %s\n", wine_dbgstr_w(name)); + + hr = IDWriteFont_HasCharacter(font, 0x25d4, &exists); + ok(hr == S_OK, "got %#x\n", hr); +todo_wine + ok(exists, "%s should have character 0x25d4\n", wine_dbgstr_w(name)); + + IDWriteFont_Release(font); + } + + IDWriteFontFallback_Release(fallback); + IDWriteFontCollection_Release(collection); + IDWriteFactory2_Release(factory); +} + START_TEST(layout) { IDWriteFactory *factory; @@ -6544,6 +6682,7 @@ START_TEST(layout) test_text_format_axes(); test_layout_range_length(); test_HitTestTextRange(); + test_SegoeUI();
IDWriteFactory_Release(factory); }
Hello,
can I get a review of these patches please?
On 1/10/22 11:36, Dmitry Timoshkov wrote:
Hello,
can I get a review of these patches please?
I don't think we want to test for font name match.
For patch 2/2, it's not clear to me if using exact windows font name is a good idea, choice of characters range is also unclear.
Nikolay Sivov nsivov@codeweavers.com wrote:
I don't think we want to test for font name match.
Could you please elaborate?
For patch 2/2, it's not clear to me if using exact windows font name is a good idea, choice of characters range is also unclear.
I have a .Net WPF application that does precisely what the test replicates, and expects the exact character being rendered.
On 1/11/22 16:56, Dmitry Timoshkov wrote:
Nikolay Sivov nsivov@codeweavers.com wrote:
I don't think we want to test for font name match.
Could you please elaborate?
It's undocumented, could change over time, and it's not something linux/mac users can easily install.
For patch 2/2, it's not clear to me if using exact windows font name is a good idea, choice of characters range is also unclear.
I have a .Net WPF application that does precisely what the test replicates, and expects the exact character being rendered.
Test checks if fallback for 0x25d4 character returns a font that supports this character, that's what a successful result for MapCharacters() is in general. So why [0x2196, 0x2bef] specifically?
Nikolay Sivov nsivov@codeweavers.com wrote:
On 1/11/22 16:56, Dmitry Timoshkov wrote:
Nikolay Sivov nsivov@codeweavers.com wrote:
I don't think we want to test for font name match.
Could you please elaborate?
It's undocumented, could change over time,
Isn't that a pure speculation? Since there are applications depending on this it's pretty safe to assume that this mapping will be kept: https://stackoverflow.com/questions/25693651/how-does-directwrite-createtext...
and it's not something linux/mac users can easily install.
This has nothing to do with the problem.
For patch 2/2, it's not clear to me if using exact windows font name is a good idea, choice of characters range is also unclear.
I have a .Net WPF application that does precisely what the test replicates, and expects the exact character being rendered.
Test checks if fallback for 0x25d4 character returns a font that supports this character, that's what a successful result for MapCharacters() is in general. So why [0x2196, 0x2bef] specifically?
I have a program (attached) that generates the fallback ranges. I've slightly modified the resulting range(s) to avoid using complex ones, if required the range could be futher tuned for a particular usage pattern. An alternative is to look at the unicode ranges of the Segoe UI Symbol using fontforge.
Dmitry Timoshkov dmitry@baikal.ru wrote:
Nikolay Sivov nsivov@codeweavers.com wrote:
On 1/11/22 16:56, Dmitry Timoshkov wrote:
Nikolay Sivov nsivov@codeweavers.com wrote:
I don't think we want to test for font name match.
Could you please elaborate?
It's undocumented, could change over time,
Isn't that a pure speculation? Since there are applications depending on this it's pretty safe to assume that this mapping will be kept: https://stackoverflow.com/questions/25693651/how-does-directwrite-createtext...
and it's not something linux/mac users can easily install.
This has nothing to do with the problem.
For patch 2/2, it's not clear to me if using exact windows font name is a good idea, choice of characters range is also unclear.
I have a .Net WPF application that does precisely what the test replicates, and expects the exact character being rendered.
Test checks if fallback for 0x25d4 character returns a font that supports this character, that's what a successful result for MapCharacters() is in general. So why [0x2196, 0x2bef] specifically?
I have a program (attached) that generates the fallback ranges. I've slightly modified the resulting range(s) to avoid using complex ones, if required the range could be futher tuned for a particular usage pattern. An alternative is to look at the unicode ranges of the Segoe UI Symbol using fontforge.
Is there anything else I could provide to make this patch acceptable?