Module: wine Branch: master Commit: 0258e5319bd13f83e56000985fdb08d3c5511cfd URL: http://source.winehq.org/git/wine.git/?a=commit;h=0258e5319bd13f83e56000985f...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Jan 21 15:09:32 2015 +0300
dwrite/tests: Basic test for GetTypographicFeatures().
---
dlls/dwrite/tests/analyzer.c | 118 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+)
diff --git a/dlls/dwrite/tests/analyzer.c b/dlls/dwrite/tests/analyzer.c index 233f072..acb5b18 100644 --- a/dlls/dwrite/tests/analyzer.c +++ b/dlls/dwrite/tests/analyzer.c @@ -265,6 +265,14 @@ static HRESULT WINAPI analysissink_SetScriptAnalysis(IDWriteTextAnalysisSink *if return S_OK; }
+static DWRITE_SCRIPT_ANALYSIS g_sa; +static HRESULT WINAPI analysissink_SetScriptAnalysis2(IDWriteTextAnalysisSink *iface, + UINT32 position, UINT32 length, DWRITE_SCRIPT_ANALYSIS const* sa) +{ + g_sa = *sa; + return S_OK; +} + #define BREAKPOINT_COUNT 20 static DWRITE_LINE_BREAKPOINT g_actual_bp[BREAKPOINT_COUNT];
@@ -310,7 +318,18 @@ static IDWriteTextAnalysisSinkVtbl analysissinkvtbl = { analysissink_SetNumberSubstitution };
+static IDWriteTextAnalysisSinkVtbl analysissinkvtbl2 = { + analysissink_QueryInterface, + analysissink_AddRef, + analysissink_Release, + analysissink_SetScriptAnalysis2, + analysissink_SetLineBreakpoints, + analysissink_SetBidiLevel, + analysissink_SetNumberSubstitution +}; + static IDWriteTextAnalysisSink analysissink = { &analysissinkvtbl }; +static IDWriteTextAnalysisSink analysissink2 = { &analysissinkvtbl2 };
static HRESULT WINAPI analysissource_QueryInterface(IDWriteTextAnalysisSource *iface, REFIID riid, void **obj) @@ -836,6 +855,22 @@ static void init_expected_sa(struct call_sequence **seq, const struct sa_test *t add_call(seq, 0, &end_of_sequence); }
+static void get_script_analysis(const WCHAR *str, DWRITE_SCRIPT_ANALYSIS *sa) +{ + IDWriteTextAnalyzer *analyzer; + HRESULT hr; + + g_source = str; + + hr = IDWriteFactory_CreateTextAnalyzer(factory, &analyzer); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteTextAnalyzer_AnalyzeScript(analyzer, &analysissource, 0, lstrlenW(g_source), &analysissink2); + ok(hr == S_OK, "got 0x%08x\n", hr); + + *sa = g_sa; +} + static void test_AnalyzeScript(void) { const struct sa_test *ptr = sa_tests; @@ -1174,6 +1209,88 @@ if (0) { IDWriteFontFace_Release(fontface); }
+static BOOL has_feature(const DWRITE_FONT_FEATURE_TAG *tags, UINT32 count, DWRITE_FONT_FEATURE_TAG feature) +{ + UINT32 i; + + for (i = 0; i < count; i++) + if (tags[i] == feature) return TRUE; + return FALSE; +} + +static void test_GetTypographicFeatures(void) +{ + static const WCHAR localeW[] = {'c','a','d','a','b','r','a',0}; + static const WCHAR arabicW[] = {0x064a,0x064f,0x0633,0}; + static const WCHAR abcW[] = {'a','b','c',0}; + DWRITE_FONT_FEATURE_TAG tags[20]; + IDWriteTextAnalyzer2 *analyzer2; + IDWriteTextAnalyzer *analyzer; + IDWriteFontFace *fontface; + DWRITE_SCRIPT_ANALYSIS sa; + UINT32 count; + HRESULT hr; + BOOL ret; + + hr = IDWriteFactory_CreateTextAnalyzer(factory, &analyzer); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IDWriteTextAnalyzer_QueryInterface(analyzer, &IID_IDWriteTextAnalyzer2, (void**)&analyzer2); + IDWriteTextAnalyzer_Release(analyzer); + if (hr != S_OK) { + win_skip("GetTypographicFeatures() is not supported.\n"); + return; + } + + fontface = create_fontface(); + + get_script_analysis(abcW, &sa); + count = 0; + hr = IDWriteTextAnalyzer2_GetTypographicFeatures(analyzer2, fontface, sa, NULL, 0, &count, NULL); +todo_wine { + ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr); + ok(count > 0, "got %u\n", count); +} + /* invalid locale name is ignored */ + get_script_analysis(abcW, &sa); + count = 0; + hr = IDWriteTextAnalyzer2_GetTypographicFeatures(analyzer2, fontface, sa, localeW, 0, &count, NULL); +todo_wine { + ok(hr == E_NOT_SUFFICIENT_BUFFER, "got 0x%08x\n", hr); + ok(count > 0, "got %u\n", count); +} + /* both GSUB and GPOS features are reported */ + get_script_analysis(arabicW, &sa); + memset(tags, 0, sizeof(tags)); + count = 0; + hr = IDWriteTextAnalyzer2_GetTypographicFeatures(analyzer2, fontface, sa, NULL, sizeof(tags)/sizeof(tags[0]), &count, tags); +todo_wine { + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count > 0, "got %u\n", count); + ret = has_feature(tags, count, DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES); + ok(ret, "expected 'calt' feature\n"); + ret = has_feature(tags, count, DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING); + ok(ret, "expected 'mkmk' feature\n"); +} + get_script_analysis(abcW, &sa); + memset(tags, 0, sizeof(tags)); + count = 0; + hr = IDWriteTextAnalyzer2_GetTypographicFeatures(analyzer2, fontface, sa, NULL, sizeof(tags)/sizeof(tags[0]), &count, tags); +todo_wine { + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count > 0, "got %u\n", count); + ret = has_feature(tags, count, DWRITE_FONT_FEATURE_TAG_GLYPH_COMPOSITION_DECOMPOSITION); + ok(ret, "expected 'ccmp' feature\n"); + ret = has_feature(tags, count, DWRITE_FONT_FEATURE_TAG_MARK_TO_MARK_POSITIONING); + ok(ret, "expected 'mkmk' feature\n"); +} + ret = has_feature(tags, count, DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_ALTERNATES); + ok(!ret, "unexpected 'calt' feature\n"); + + IDWriteFontFace_Release(fontface); + IDWriteTextAnalyzer2_Release(analyzer2); +} + START_TEST(analyzer) { HRESULT hr; @@ -1195,6 +1312,7 @@ START_TEST(analyzer) test_GetTextComplexity(); test_GetGlyphs(); test_numbersubstitution(); + test_GetTypographicFeatures();
IDWriteFactory_Release(factory); }