Nikolay Sivov : dwrite/tests: Basic test for GetTypographicFeatures().

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 21 15:16:21 CST 2015


Module: wine
Branch: master
Commit: 0258e5319bd13f83e56000985fdb08d3c5511cfd
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0258e5319bd13f83e56000985fdb08d3c5511cfd

Author: Nikolay Sivov <nsivov at 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);
 }




More information about the wine-cvs mailing list