[PATCH 5/5] dwrite: Improve face name returned by ConvertFontToLOGFONT()
Nikolay Sivov
nsivov at codeweavers.com
Sun Dec 4 10:22:16 CST 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/dwrite_private.h | 2 +-
dlls/dwrite/font.c | 2 +-
dlls/dwrite/gdiinterop.c | 14 --------------
dlls/dwrite/opentype.c | 26 ++++++++++++++++++++++++--
dlls/dwrite/tests/font.c | 29 ++++++++++++++++++++++++++++-
5 files changed, 54 insertions(+), 19 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 77b6c4a..1e46498 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -224,7 +224,7 @@ extern void opentype_get_font_properties(struct file_stream_desc*,struct dwrite_
extern void opentype_get_font_metrics(struct file_stream_desc*,DWRITE_FONT_METRICS1*,DWRITE_CARET_METRICS*) DECLSPEC_HIDDEN;
extern HRESULT opentype_get_font_info_strings(const void*,DWRITE_INFORMATIONAL_STRING_ID,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
extern HRESULT opentype_get_font_familyname(struct file_stream_desc*,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
-extern HRESULT opentype_get_font_facename(struct file_stream_desc*,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
+extern HRESULT opentype_get_font_facename(struct file_stream_desc*,WCHAR*,IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
extern HRESULT opentype_get_typographic_features(IDWriteFontFace*,UINT32,UINT32,UINT32,UINT32*,DWRITE_FONT_FEATURE_TAG*) DECLSPEC_HIDDEN;
extern BOOL opentype_get_vdmx_size(const void*,INT,UINT16*,UINT16*) DECLSPEC_HIDDEN;
extern UINT32 opentype_get_cpal_palettecount(const void*) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 47ebd11..17bea89 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -3247,7 +3247,7 @@ static HRESULT init_font_data(const struct fontface_desc *desc, IDWriteLocalized
stream_desc.face_index = desc->index;
opentype_get_font_properties(&stream_desc, &props);
opentype_get_font_metrics(&stream_desc, &data->metrics, NULL);
- opentype_get_font_facename(&stream_desc, &data->names);
+ opentype_get_font_facename(&stream_desc, props.lf.lfFaceName, &data->names);
/* get family name from font file */
hr = opentype_get_font_familyname(&stream_desc, family_name);
diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c
index 5034ad7..3675875 100644
--- a/dlls/dwrite/gdiinterop.c
+++ b/dlls/dwrite/gdiinterop.c
@@ -623,12 +623,8 @@ static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop1 *iface,
IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
{
struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
- static const WCHAR enusW[] = {'e','n','-','u','s',0};
IDWriteFontCollection *collection;
- IDWriteLocalizedStrings *name;
IDWriteFontFamily *family;
- UINT32 index;
- BOOL exists;
HRESULT hr;
TRACE("(%p)->(%p %p %p)\n", This, font, logfont, is_systemfont);
@@ -655,17 +651,7 @@ static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop1 *iface,
get_logfont_from_font(font, logfont);
logfont->lfCharSet = DEFAULT_CHARSET;
logfont->lfOutPrecision = OUT_OUTLINE_PRECIS;
- logfont->lfFaceName[0] = 0;
-
- exists = FALSE;
- hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES, &name, &exists);
- if (FAILED(hr) || !exists)
- return hr;
- hr = IDWriteLocalizedStrings_FindLocaleName(name, enusW, &index, &exists);
- if (hr == S_OK)
- hr = IDWriteLocalizedStrings_GetString(name, index, logfont->lfFaceName, sizeof(logfont->lfFaceName)/sizeof(WCHAR));
- IDWriteLocalizedStrings_Release(name);
return hr;
}
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index 7f6ccd1..4a6d62c 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -1612,10 +1612,11 @@ HRESULT opentype_get_font_familyname(struct file_stream_desc *stream_desc, IDWri
/* FaceName locating order is WWS Face Name -> Preferred Face Name -> Face Name. If font claims to
have 'Preferred Face Name' in WWS format, then WWS name is not used. */
-HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, IDWriteLocalizedStrings **names)
+HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, WCHAR *lfname, IDWriteLocalizedStrings **names)
{
- const TT_OS2_V2 *tt_os2;
+ IDWriteLocalizedStrings *lfnames;
void *os2_context, *name_context;
+ const TT_OS2_V2 *tt_os2;
const void *name_table;
HRESULT hr;
@@ -1635,6 +1636,27 @@ HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, IDWrite
if (FAILED(hr))
hr = opentype_get_font_strings_from_id(name_table, OPENTYPE_STRING_SUBFAMILY_NAME, names);
+ /* User locale is preferred, with fallback to en-us. */
+ *lfname = 0;
+ if (SUCCEEDED(opentype_get_font_strings_from_id(name_table, OPENTYPE_STRING_FAMILY_NAME, &lfnames))) {
+ static const WCHAR enusW[] = {'e','n','-','u','s',0};
+ WCHAR localeW[LOCALE_NAME_MAX_LENGTH];
+ UINT32 index;
+ BOOL exists;
+
+ exists = FALSE;
+ if (GetUserDefaultLocaleName(localeW, sizeof(localeW)/sizeof(WCHAR)))
+ IDWriteLocalizedStrings_FindLocaleName(lfnames, localeW, &index, &exists);
+
+ if (!exists)
+ IDWriteLocalizedStrings_FindLocaleName(lfnames, enusW, &index, &exists);
+
+ if (exists)
+ IDWriteLocalizedStrings_GetString(lfnames, index, lfname, LF_FACESIZE);
+
+ IDWriteLocalizedStrings_Release(lfnames);
+ }
+
if (tt_os2)
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
if (name_context)
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index ca35324..987eac9 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -3459,6 +3459,7 @@ static void test_TryGetFontTable(void)
static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
{
void *os2_context, *head_context;
+ IDWriteLocalizedStrings *names;
DWRITE_FONT_SIMULATIONS sim;
IDWriteFontFace *fontface;
const TT_OS2_V2 *tt_os2;
@@ -3531,6 +3532,31 @@ static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
}
}
+ /* lfFaceName */
+ exists = FALSE;
+ logfont->lfFaceName[0] = 0;
+ hr = IDWriteFont_GetInformationalStrings(font, DWRITE_INFORMATIONAL_STRING_WIN32_FAMILY_NAMES, &names, &exists);
+ if (SUCCEEDED(hr)) {
+ if (exists) {
+ static const WCHAR enusW[] = {'e','n','-','u','s',0};
+ WCHAR localeW[LOCALE_NAME_MAX_LENGTH];
+ UINT32 index;
+
+ /* Fallback to en-us if there's no string for user locale. */
+ exists = FALSE;
+ if (GetUserDefaultLocaleName(localeW, sizeof(localeW)/sizeof(WCHAR)))
+ IDWriteLocalizedStrings_FindLocaleName(names, localeW, &index, &exists);
+
+ if (!exists)
+ IDWriteLocalizedStrings_FindLocaleName(names, enusW, &index, &exists);
+
+ if (exists)
+ IDWriteLocalizedStrings_GetString(names, index, logfont->lfFaceName, sizeof(logfont->lfFaceName)/sizeof(WCHAR));
+ }
+
+ IDWriteLocalizedStrings_Release(names);
+ }
+
if (tt_os2)
IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
if (tt_head)
@@ -3631,6 +3657,8 @@ if (0) { /* crashes on native */
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(!lstrcmpW(logfont.lfFaceName, lf.lfFaceName), "%s: unexpected facename %s, expected %s\n",
+ wine_dbgstr_w(nameW), wine_dbgstr_w(logfont.lfFaceName), wine_dbgstr_w(lf.lfFaceName));
ok(logfont.lfOutPrecision == OUT_OUTLINE_PRECIS, "%s: unexpected output precision %d\n", wine_dbgstr_w(nameW),
logfont.lfOutPrecision);
@@ -3639,7 +3667,6 @@ if (0) { /* crashes on native */
ok(logfont.lfQuality == DEFAULT_QUALITY, "%s: unexpected quality %d\n", wine_dbgstr_w(nameW), logfont.lfQuality);
ok(logfont.lfPitchAndFamily == DEFAULT_PITCH, "%s: unexpected pitch %d\n", wine_dbgstr_w(nameW),
logfont.lfPitchAndFamily);
- ok(logfont.lfFaceName[0] != 0, "got face name %s\n", wine_dbgstr_w(logfont.lfFaceName));
IDWriteFont_Release(font);
}
--
2.10.2
More information about the wine-patches
mailing list