[PATCH 3/5] dwrite: Improve lfWeight values returned by ConvertFontToLOGFONT()
Nikolay Sivov
nsivov at codeweavers.com
Sun Dec 4 10:22:14 CST 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/font.c | 1 +
dlls/dwrite/gdiinterop.c | 1 -
dlls/dwrite/opentype.c | 12 +++----
dlls/dwrite/tests/font.c | 81 ++++++++++++++++++++++++++++++++----------------
4 files changed, 62 insertions(+), 33 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 356000c..47ebd11 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -3401,6 +3401,7 @@ static void fontfamily_add_bold_simulated_face(struct dwrite_fontfamily_data *fa
if (init_font_data_from_font(family->fonts[heaviest], DWRITE_FONT_SIMULATIONS_BOLD, facenameW, &boldface) == S_OK) {
boldface->bold_sim_tested = 1;
+ boldface->lf.lfWeight += (FW_BOLD - FW_REGULAR) / 2 + 1;
fontfamily_add_font(family, boldface);
}
}
diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c
index e4ef835..5034ad7 100644
--- a/dlls/dwrite/gdiinterop.c
+++ b/dlls/dwrite/gdiinterop.c
@@ -654,7 +654,6 @@ static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop1 *iface,
get_logfont_from_font(font, logfont);
logfont->lfCharSet = DEFAULT_CHARSET;
- logfont->lfWeight = IDWriteFont_GetWeight(font);
logfont->lfOutPrecision = OUT_OUTLINE_PRECIS;
logfont->lfFaceName[0] = 0;
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index e16bf76..7f6ccd1 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -1307,10 +1307,9 @@ void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct d
if (version >= 4 && (fsSelection & OS2_FSSELECTION_OBLIQUE))
props->style = DWRITE_FONT_STYLE_OBLIQUE;
- else if (fsSelection & OS2_FSSELECTION_ITALIC) {
+ else if (fsSelection & OS2_FSSELECTION_ITALIC)
props->style = DWRITE_FONT_STYLE_ITALIC;
- props->lf.lfItalic = 1;
- }
+
memcpy(&props->panose, &tt_os2->panose, sizeof(props->panose));
}
else if (tt_head) {
@@ -1324,12 +1323,13 @@ void opentype_get_font_properties(struct file_stream_desc *stream_desc, struct d
if (macStyle & TT_HEAD_MACSTYLE_BOLD)
props->weight = DWRITE_FONT_WEIGHT_BOLD;
- if (macStyle & TT_HEAD_MACSTYLE_ITALIC) {
+ if (macStyle & TT_HEAD_MACSTYLE_ITALIC)
props->style = DWRITE_FONT_STYLE_ITALIC;
- props->lf.lfItalic = 1;
- }
}
+ props->lf.lfWeight = props->weight;
+ props->lf.lfItalic = props->style == DWRITE_FONT_STYLE_ITALIC;
+
TRACE("stretch=%d, weight=%d, style %d\n", props->stretch, props->weight, props->style);
if (tt_os2)
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index d3c9d42..738d100 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -3458,7 +3458,16 @@ static void test_TryGetFontTable(void)
static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
{
+ void *os2_context, *head_context;
+ DWRITE_FONT_SIMULATIONS sim;
+ IDWriteFontFace *fontface;
+ const TT_OS2_V2 *tt_os2;
DWRITE_FONT_STYLE style;
+ const TT_HEAD *tt_head;
+ LONG weight;
+ UINT32 size;
+ BOOL exists;
+ HRESULT hr;
/* These are rendering time properties. */
logfont->lfHeight = 0;
@@ -3468,32 +3477,50 @@ static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
logfont->lfUnderline = 0;
logfont->lfStrikeOut = 0;
+ logfont->lfWeight = 0;
logfont->lfItalic = 0;
- if (IDWriteFont_GetSimulations(font) & DWRITE_FONT_SIMULATIONS_OBLIQUE)
- logfont->lfItalic = 1;
+ hr = IDWriteFont_CreateFontFace(font, &fontface);
+ ok(hr == S_OK, "Failed to create font face, %#x\n", hr);
- style = IDWriteFont_GetStyle(font);
- if (!logfont->lfItalic && ((style == DWRITE_FONT_STYLE_ITALIC) || (style == DWRITE_FONT_STYLE_OBLIQUE))) {
- void *os2_context, *head_context;
- IDWriteFontFace *fontface;
- const TT_OS2_V2 *tt_os2;
- const TT_HEAD *tt_head;
- UINT32 size;
- BOOL exists;
- 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, %#x\n", hr);
- hr = IDWriteFont_CreateFontFace(font, &fontface);
- ok(hr == S_OK, "Failed to create font face, %#x\n", hr);
+ hr = IDWriteFontFace_TryGetFontTable(fontface, MS_HEAD_TAG, (const void **)&tt_head, &size,
+ &head_context, &exists);
+ ok(hr == S_OK, "Failed to get head table, %#x\n", hr);
+
+ sim = IDWriteFont_GetSimulations(font);
- 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, %#x\n", hr);
+ /* lfWeight */
+ weight = FW_REGULAR;
+ if (tt_os2) {
+ USHORT usWeightClass = GET_BE_WORD(tt_os2->usWeightClass);
- hr = IDWriteFontFace_TryGetFontTable(fontface, MS_HEAD_TAG, (const void **)&tt_head, &size,
- &head_context, &exists);
- ok(hr == S_OK, "Failed to get head table, %#x\n", hr);
+ if (usWeightClass >= 1 && usWeightClass <= 9)
+ usWeightClass *= 100;
+ if (usWeightClass > DWRITE_FONT_WEIGHT_ULTRA_BLACK)
+ weight = DWRITE_FONT_WEIGHT_ULTRA_BLACK;
+ else if (usWeightClass > 0)
+ weight = usWeightClass;
+ }
+ else if (tt_head) {
+ USHORT macStyle = GET_BE_WORD(tt_head->macStyle);
+ if (macStyle & TT_HEAD_MACSTYLE_BOLD)
+ weight = DWRITE_FONT_WEIGHT_BOLD;
+ }
+ if (sim & DWRITE_FONT_SIMULATIONS_BOLD)
+ weight += (FW_BOLD - FW_REGULAR) / 2 + 1;
+ logfont->lfWeight = weight;
+
+ /* lfItalic */
+ if (IDWriteFont_GetSimulations(font) & DWRITE_FONT_SIMULATIONS_OBLIQUE)
+ logfont->lfItalic = 1;
+
+ style = IDWriteFont_GetStyle(font);
+ if (!logfont->lfItalic && ((style == DWRITE_FONT_STYLE_ITALIC) || (style == DWRITE_FONT_STYLE_OBLIQUE))) {
if (tt_os2) {
USHORT fsSelection = GET_BE_WORD(tt_os2->fsSelection);
logfont->lfItalic = !!(fsSelection & OS2_FSSELECTION_ITALIC);
@@ -3502,13 +3529,13 @@ static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
USHORT macStyle = GET_BE_WORD(tt_head->macStyle);
logfont->lfItalic = !!(macStyle & TT_HEAD_MACSTYLE_ITALIC);
}
-
- if (tt_os2)
- IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
- if (tt_head)
- IDWriteFontFace_ReleaseFontTable(fontface, head_context);
- IDWriteFontFace_Release(fontface);
}
+
+ if (tt_os2)
+ IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
+ if (tt_head)
+ IDWriteFontFace_ReleaseFontTable(fontface, head_context);
+ IDWriteFontFace_Release(fontface);
}
static void test_ConvertFontToLOGFONT(void)
@@ -3599,10 +3626,12 @@ if (0) { /* crashes on native */
sim = IDWriteFont_GetSimulations(font);
get_logfont_from_font(font, &lf);
+ ok(logfont.lfWeight == lf.lfWeight, "%s: unexpected lfWeight %d, expected lfWeight %d, font weight %d, "
+ "bold simulation %s\n", wine_dbgstr_w(nameW), logfont.lfWeight, lf.lfWeight, IDWriteFont_GetWeight(font),
+ sim & DWRITE_FONT_SIMULATIONS_BOLD ? "yes" : "no");
ok(logfont.lfItalic == lf.lfItalic, "%s: unexpected italic flag %d, oblique simulation %s\n",
wine_dbgstr_w(nameW), logfont.lfItalic, sim & DWRITE_FONT_SIMULATIONS_OBLIQUE ? "yes" : "no");
- ok(logfont.lfWeight > 0, "got %d\n", logfont.lfWeight);
ok(logfont.lfOutPrecision == OUT_OUTLINE_PRECIS, "got %d\n", logfont.lfOutPrecision);
ok(logfont.lfClipPrecision == 0, "got %d\n", logfont.lfClipPrecision);
ok(logfont.lfQuality == 0, "got %d\n", logfont.lfQuality);
--
2.10.2
More information about the wine-patches
mailing list