[PATCH 1/2] dwrite/tests: Test for lineGap metric
Nikolay Sivov
nsivov at codeweavers.com
Sun Apr 17 22:47:13 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/tests/font.c | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 5d8a4ca..dc9f64e 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -205,6 +205,23 @@ typedef struct {
ULONG maxmemType1;
} TT_POST;
+typedef struct {
+ ULONG version;
+ SHORT ascender;
+ SHORT descender;
+ SHORT linegap;
+ USHORT advanceWidthMax;
+ SHORT minLeftSideBearing;
+ SHORT minRightSideBearing;
+ SHORT xMaxExtent;
+ SHORT caretSlopeRise;
+ SHORT caretSlopeRun;
+ SHORT caretOffset;
+ SHORT reserved[4];
+ SHORT metricDataFormat;
+ USHORT numberOfHMetrics;
+} TT_HHEA;
+
#include "poppack.h"
static IDWriteFactory *create_factory(void)
@@ -1534,10 +1551,11 @@ todo_wine
static void get_expected_font_metrics(IDWriteFontFace *fontface, DWRITE_FONT_METRICS1 *metrics)
{
- void *os2_context, *head_context, *post_context;
+ void *os2_context, *head_context, *post_context, *hhea_context;
const TT_OS2_V2 *tt_os2;
const TT_HEAD *tt_head;
const TT_POST *tt_post;
+ const TT_HHEA *tt_hhea;
UINT32 size;
BOOL exists;
HRESULT hr;
@@ -1548,6 +1566,8 @@ static void get_expected_font_metrics(IDWriteFontFace *fontface, DWRITE_FONT_MET
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFace_TryGetFontTable(fontface, MS_HEAD_TAG, (const void**)&tt_head, &size, &head_context, &exists);
ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IDWriteFontFace_TryGetFontTable(fontface, MS_HHEA_TAG, (const void**)&tt_hhea, &size, &hhea_context, &exists);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDWriteFontFace_TryGetFontTable(fontface, MS_POST_TAG, (const void**)&tt_post, &size, &post_context, &exists);
ok(hr == S_OK, "got 0x%08x\n", hr);
@@ -1564,6 +1584,7 @@ static void get_expected_font_metrics(IDWriteFontFace *fontface, DWRITE_FONT_MET
SHORT descent = GET_BE_WORD(tt_os2->sTypoDescender);
metrics->ascent = GET_BE_WORD(tt_os2->sTypoAscender);
metrics->descent = descent < 0 ? -descent : 0;
+ metrics->lineGap = GET_BE_WORD(tt_os2->sTypoLineGap);
metrics->hasTypographicMetrics = TRUE;
}
else {
@@ -1571,6 +1592,15 @@ static void get_expected_font_metrics(IDWriteFontFace *fontface, DWRITE_FONT_MET
/* Some fonts have usWinDescent value stored as signed short, which could be wrongly
interpreted as large unsigned value. */
metrics->descent = abs((SHORT)GET_BE_WORD(tt_os2->usWinDescent));
+
+ if (tt_hhea) {
+ SHORT descender = (SHORT)GET_BE_WORD(tt_hhea->descender);
+ INT32 linegap;
+
+ linegap = GET_BE_WORD(tt_hhea->ascender) + abs(descender) + GET_BE_WORD(tt_hhea->linegap) -
+ metrics->ascent - metrics->descent;
+ metrics->lineGap = linegap > 0 ? linegap : 0;
+ }
}
metrics->strikethroughPosition = GET_BE_WORD(tt_os2->yStrikeoutPosition);
@@ -1606,6 +1636,8 @@ static void get_expected_font_metrics(IDWriteFontFace *fontface, DWRITE_FONT_MET
IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
if (tt_head)
IDWriteFontFace_ReleaseFontTable(fontface, head_context);
+ if (tt_hhea)
+ IDWriteFontFace_ReleaseFontTable(fontface, hhea_context);
if (tt_post)
IDWriteFontFace_ReleaseFontTable(fontface, post_context);
}
@@ -1619,6 +1651,8 @@ static void check_font_metrics(const WCHAR *nameW, BOOL has_metrics1, const DWRI
expected->ascent);
ok(got->descent == expected->descent, "font %s: descent %u, expected %u\n", wine_dbgstr_w(nameW), got->descent,
expected->descent);
+ ok(got->lineGap == expected->lineGap, "font %s: lineGap %d, expected %d\n", wine_dbgstr_w(nameW), got->lineGap,
+ expected->lineGap);
ok(got->underlinePosition == expected->underlinePosition, "font %s: underlinePosition %d, expected %d\n",
wine_dbgstr_w(nameW), got->underlinePosition, expected->underlinePosition);
ok(got->underlineThickness == expected->underlineThickness, "font %s: underlineThickness %u, "
--
2.8.0.rc3
More information about the wine-patches
mailing list