Nikolay Sivov : dwrite: Improve lfWeight values returned by ConvertFontToLOGFONT().

Alexandre Julliard julliard at winehq.org
Tue Dec 6 16:27:43 CST 2016


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Dec  4 19:22:14 2016 +0300

dwrite: Improve lfWeight values returned by ConvertFontToLOGFONT().

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

---

 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);




More information about the wine-cvs mailing list