Nikolay Sivov : dwrite: Line height/baseline includes lineGap as well.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 27 11:27:21 CST 2016


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jan 27 15:57:48 2016 +0300

dwrite: Line height/baseline includes lineGap as well.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/layout.c       |   4 +-
 dlls/dwrite/tests/layout.c | 101 +++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 94 insertions(+), 11 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 77426e9..9fd4baf 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -892,8 +892,8 @@ static HRESULT layout_compute_runs(struct dwrite_textlayout *layout)
         else
             IDWriteFontFace_GetMetrics(run->run.fontFace, &fontmetrics);
 
-        r->baseline = SCALE_FONT_METRIC(fontmetrics.ascent, run->run.fontEmSize, &fontmetrics);
-        r->height = SCALE_FONT_METRIC(fontmetrics.ascent + fontmetrics.descent, run->run.fontEmSize, &fontmetrics);
+        r->baseline = SCALE_FONT_METRIC(fontmetrics.ascent + fontmetrics.lineGap, run->run.fontEmSize, &fontmetrics);
+        r->height = SCALE_FONT_METRIC(fontmetrics.ascent + fontmetrics.descent + fontmetrics.lineGap, run->run.fontEmSize, &fontmetrics);
 
         layout_set_cluster_metrics(layout, r, &cluster);
 
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 7d83c1a..b623414 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -3157,18 +3157,34 @@ static IDWriteFontFace *get_fontface_from_format(IDWriteTextFormat *format)
     return fontface;
 }
 
+static void get_enus_string(IDWriteLocalizedStrings *strings, WCHAR *buff, UINT32 size)
+{
+    UINT32 index;
+    BOOL exists = FALSE;
+    HRESULT hr;
+
+    hr = IDWriteLocalizedStrings_FindLocaleName(strings, enusW, &index, &exists);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(exists, "got %d\n", exists);
+
+    hr = IDWriteLocalizedStrings_GetString(strings, index, buff, size);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+}
+
 static void test_GetLineMetrics(void)
 {
     static const WCHAR str3W[] = {'a','\r','b','\n','c','\n','\r','d','\r','\n',0};
     static const WCHAR strW[] = {'a','b','c','d',' ',0};
     static const WCHAR str2W[] = {'a','b','\r','c','d',0};
+    IDWriteFontCollection *syscollection;
     DWRITE_FONT_METRICS fontmetrics;
     DWRITE_LINE_METRICS metrics[6];
+    UINT32 count, i, familycount;
     IDWriteTextFormat *format;
     IDWriteTextLayout *layout;
     IDWriteFontFace *fontface;
     IDWriteFactory *factory;
-    UINT32 count;
+    WCHAR nameW[256];
     HRESULT hr;
 
     factory = create_factory();
@@ -3194,16 +3210,83 @@ static void test_GetLineMetrics(void)
     ok(metrics[0].newlineLength == 0, "got %u\n", metrics[0].newlineLength);
     ok(metrics[0].isTrimmed == FALSE, "got %d\n", metrics[0].isTrimmed);
 
-    /* Tahoma doesn't provide BASE table, so baseline is calculated from font metrics */
+    IDWriteTextLayout_Release(layout);
+
+    /* Test line height and baseline calculation */
+    hr = IDWriteFactory_GetSystemFontCollection(factory, &syscollection, FALSE);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    familycount = IDWriteFontCollection_GetFontFamilyCount(syscollection);
+
+    for (i = 0; i < familycount; i++) {
+        static const WCHAR mvboliW[] = {'M','V',' ','B','o','l','i',0};
+        IDWriteLocalizedStrings *names;
+        IDWriteFontFamily *family;
+        IDWriteFont *font;
+
+        format = NULL;
+        layout = NULL;
+
+        hr = IDWriteFontCollection_GetFontFamily(syscollection, i, &family);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        hr = IDWriteFontFamily_GetFirstMatchingFont(family, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL,
+            DWRITE_FONT_STYLE_NORMAL, &font);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        hr = IDWriteFont_CreateFontFace(font, &fontface);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        hr = IDWriteFontFamily_GetFamilyNames(family, &names);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        get_enus_string(names, nameW, sizeof(nameW)/sizeof(nameW[0]));
+
+        IDWriteLocalizedStrings_Release(names);
+        IDWriteFont_Release(font);
+
+        /* This will effectively skip on Vista/2008 only, newer systems work just fine with this font. */
+        if (!lstrcmpW(nameW, mvboliW)) {
+            skip("Skipping line metrics test for %s, gives inconsistent results\n", wine_dbgstr_w(nameW));
+            goto cleanup;
+        }
+
+        IDWriteFontFace_GetMetrics(fontface, &fontmetrics);
+        hr = IDWriteFactory_CreateTextFormat(factory, nameW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+            DWRITE_FONT_STRETCH_NORMAL, fontmetrics.designUnitsPerEm, enusW, &format);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        hr = IDWriteFactory_CreateTextLayout(factory, strW, 5, format, 30000.0f, 100.0f, &layout);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+
+        memset(metrics, 0, sizeof(metrics));
+        count = 0;
+        hr = IDWriteTextLayout_GetLineMetrics(layout, metrics, 2, &count);
+        ok(hr == S_OK, "got 0x%08x\n", hr);
+        ok(count == 1, "got %u\n", count);
+
+        ok(metrics[0].baseline == fontmetrics.ascent + fontmetrics.lineGap, "%s: got %.2f, expected %d, "
+            "linegap %d\n", wine_dbgstr_w(nameW), metrics[0].baseline, fontmetrics.ascent + fontmetrics.lineGap,
+            fontmetrics.lineGap);
+        ok(metrics[0].height == fontmetrics.ascent + fontmetrics.descent + fontmetrics.lineGap,
+            "%s: got %.2f, expected %d, linegap %d\n", wine_dbgstr_w(nameW), metrics[0].height,
+            fontmetrics.ascent + fontmetrics.descent + fontmetrics.lineGap, fontmetrics.lineGap);
+
+    cleanup:
+        if (layout)
+            IDWriteTextLayout_Release(layout);
+        if (format)
+            IDWriteTextFormat_Release(format);
+        IDWriteFontFace_Release(fontface);
+        IDWriteFontFamily_Release(family);
+    }
+    IDWriteFontCollection_Release(syscollection);
+
+    hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, 2048.0f, enusW, &format);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
     fontface = get_fontface_from_format(format);
     ok(fontface != NULL, "got %p\n", fontface);
-    IDWriteFontFace_GetMetrics(fontface, &fontmetrics);
-
-    ok(metrics[0].baseline == fontmetrics.ascent, "got %.2f, expected %d\n", metrics[0].baseline,
-        fontmetrics.ascent);
-    ok(metrics[0].height == fontmetrics.ascent + fontmetrics.descent, "got %.2f, expected %d\n",
-        metrics[0].height, fontmetrics.ascent + fontmetrics.descent);
-    IDWriteTextLayout_Release(layout);
 
     /* force 2 lines */
     hr = IDWriteFactory_CreateTextLayout(factory, str2W, 5, format, 10000.0, 1000.0, &layout);




More information about the wine-cvs mailing list