Nikolay Sivov : dwrite/tests: Improve coverage of IsSymbolFont() tests.
Alexandre Julliard
julliard at winehq.org
Fri Dec 20 14:07:24 CST 2019
Module: wine
Branch: master
Commit: b9a5ab67f1df116937b1b359c7425f783c7a70c0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=b9a5ab67f1df116937b1b359c7425f783c7a70c0
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Dec 20 14:32:55 2019 +0300
dwrite/tests: Improve coverage of IsSymbolFont() tests.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dwrite/tests/font.c | 123 ++++++++++++++++++++++++++++++++++++++---------
1 file changed, 99 insertions(+), 24 deletions(-)
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 3dff4a6191..da75a7b70c 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -446,6 +446,7 @@ enum opentype_cmap_table_platform
enum opentype_cmap_table_encoding
{
+ OPENTYPE_CMAP_TABLE_ENCODING_SYMBOL = 0,
OPENTYPE_CMAP_TABLE_ENCODING_UNICODE_BMP = 1,
OPENTYPE_CMAP_TABLE_ENCODING_UNICODE_FULL = 10,
};
@@ -7198,48 +7199,122 @@ static void test_CreateAlphaTexture(void)
ok(ref == 0, "factory not released, %u\n", ref);
}
+static BOOL get_expected_is_symbol(IDWriteFontFace *fontface)
+{
+ BOOL exists, is_symbol = FALSE;
+ struct dwrite_fonttable cmap;
+ const TT_OS2_V2 *tt_os2;
+ const BYTE *tables;
+ void *os2_context;
+ WORD num_tables;
+ unsigned int i;
+ UINT32 size;
+ HRESULT hr;
+
+ hr = IDWriteFontFace_TryGetFontTable(fontface, MS_0S2_TAG, (const void **)&tt_os2, &size, &os2_context, &exists);
+ ok(hr == S_OK, "Failed to get OS/2 table, hr %#x.\n", hr);
+
+ if (tt_os2)
+ {
+ if (tt_os2->version)
+ is_symbol = !!(GET_BE_DWORD(tt_os2->ulCodePageRange1) & FS_SYMBOL);
+ if (!is_symbol)
+ is_symbol = tt_os2->panose.bFamilyType == PAN_FAMILY_PICTORIAL;
+ IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
+ }
+
+ if (is_symbol)
+ return is_symbol;
+
+ hr = IDWriteFontFace_TryGetFontTable(fontface, MS_CMAP_TAG, (const void **)&cmap.data,
+ &cmap.size, &cmap.context, &exists);
+ if (FAILED(hr) || !exists)
+ return is_symbol;
+
+ num_tables = table_read_be_word(&cmap, 0, FIELD_OFFSET(struct cmap_header, numTables));
+ tables = cmap.data + FIELD_OFFSET(struct cmap_header, tables);
+
+ for (i = 0; i < num_tables; ++i)
+ {
+ struct cmap_encoding_record *record = (struct cmap_encoding_record *)(tables + i * sizeof(*record));
+ WORD platform, encoding;
+
+ platform = table_read_be_word(&cmap, record, FIELD_OFFSET(struct cmap_encoding_record, platformID));
+ encoding = table_read_be_word(&cmap, record, FIELD_OFFSET(struct cmap_encoding_record, encodingID));
+
+ if (platform == OPENTYPE_CMAP_TABLE_PLATFORM_WIN && encoding == OPENTYPE_CMAP_TABLE_ENCODING_SYMBOL)
+ {
+ is_symbol = TRUE;
+ break;
+ }
+ }
+
+ IDWriteFontFace_ReleaseFontTable(fontface, cmap.context);
+
+ return is_symbol;
+}
+
static void test_IsSymbolFont(void)
{
- static const WCHAR symbolW[] = {'S','y','m','b','o','l',0};
IDWriteFontCollection *collection;
IDWriteFontFace *fontface;
IDWriteFactory *factory;
IDWriteFont *font;
+ UINT32 count, i;
HRESULT hr;
ULONG ref;
- BOOL ret;
factory = create_factory();
- /* Tahoma */
- fontface = create_fontface(factory);
- ret = IDWriteFontFace_IsSymbolFont(fontface);
- ok(!ret, "got %d\n", ret);
-
hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IDWriteFontCollection_GetFontFromFontFace(collection, fontface, &font);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = IDWriteFontCollection_GetFontFamilyCount(collection);
+ for (i = 0; i < count; ++i)
+ {
+ IDWriteLocalizedStrings *names;
+ IDWriteFontFamily *family;
+ UINT32 font_count, j;
+ WCHAR nameW[256];
- ret = IDWriteFont_IsSymbolFont(font);
- ok(!ret, "got %d\n", ret);
+ hr = IDWriteFontCollection_GetFontFamily(collection, i, &family);
+ ok(hr == S_OK, "Failed to get family, hr %#x.\n", hr);
- IDWriteFontCollection_Release(collection);
- IDWriteFont_Release(font);
- IDWriteFontFace_Release(fontface);
+ hr = IDWriteFontFamily_GetFamilyNames(family, &names);
+ ok(hr == S_OK, "Failed to get names, hr %#x.\n", hr);
+ get_enus_string(names, nameW, ARRAY_SIZE(nameW));
+ IDWriteLocalizedStrings_Release(names);
- /* Symbol */
- font = get_font(factory, symbolW, DWRITE_FONT_STYLE_NORMAL);
- ret = IDWriteFont_IsSymbolFont(font);
- ok(ret, "got %d\n", ret);
+ font_count = IDWriteFontFamily_GetFontCount(family);
- hr = IDWriteFont_CreateFontFace(font, &fontface);
- ok(hr == S_OK, "got 0x%08x\n", hr);
- ret = IDWriteFontFace_IsSymbolFont(fontface);
- ok(ret, "got %d\n", ret);
- IDWriteFontFace_Release(fontface);
- IDWriteFont_Release(font);
+ for (j = 0; j < font_count; ++j)
+ {
+ BOOL is_symbol_font, is_symbol_face, is_symbol_expected;
+
+ hr = IDWriteFontFamily_GetFont(family, j, &font);
+ ok(hr == S_OK, "Failed to get font, hr %#x.\n", hr);
+
+ hr = IDWriteFont_CreateFontFace(font, &fontface);
+ ok(hr == S_OK, "Failed to create fontface, hr %#x.\n", hr);
+
+ is_symbol_font = IDWriteFont_IsSymbolFont(font);
+ is_symbol_face = IDWriteFontFace_IsSymbolFont(fontface);
+ ok(is_symbol_font == is_symbol_face, "Unexpected symbol flag.\n");
+
+ /* FIXME: failures disabled on Wine for now */
+ is_symbol_expected = get_expected_is_symbol(fontface);
+ todo_wine_if(is_symbol_expected != is_symbol_face)
+ ok(is_symbol_expected == is_symbol_face, "Unexpected is_symbol flag %d for %s, font %d.\n",
+ is_symbol_face, wine_dbgstr_w(nameW), j);
+
+ IDWriteFontFace_Release(fontface);
+ IDWriteFont_Release(font);
+ }
+
+ IDWriteFontFamily_Release(family);
+ }
+
+ IDWriteFontCollection_Release(collection);
ref = IDWriteFactory_Release(factory);
ok(ref == 0, "factory not released, %u\n", ref);
More information about the wine-cvs
mailing list