dwrite: Improve face name returned by ConvertFontToLOGFONT().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3ffa9ee082
commit
17586e3082
|
@ -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 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_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_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 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 BOOL opentype_get_vdmx_size(const void*,INT,UINT16*,UINT16*) DECLSPEC_HIDDEN;
|
||||||
extern UINT32 opentype_get_cpal_palettecount(const void*) DECLSPEC_HIDDEN;
|
extern UINT32 opentype_get_cpal_palettecount(const void*) DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -3247,7 +3247,7 @@ static HRESULT init_font_data(const struct fontface_desc *desc, IDWriteLocalized
|
||||||
stream_desc.face_index = desc->index;
|
stream_desc.face_index = desc->index;
|
||||||
opentype_get_font_properties(&stream_desc, &props);
|
opentype_get_font_properties(&stream_desc, &props);
|
||||||
opentype_get_font_metrics(&stream_desc, &data->metrics, NULL);
|
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 */
|
/* get family name from font file */
|
||||||
hr = opentype_get_font_familyname(&stream_desc, family_name);
|
hr = opentype_get_font_familyname(&stream_desc, family_name);
|
||||||
|
|
|
@ -623,12 +623,8 @@ static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop1 *iface,
|
||||||
IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
|
IDWriteFont *font, LOGFONTW *logfont, BOOL *is_systemfont)
|
||||||
{
|
{
|
||||||
struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
|
struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
|
||||||
static const WCHAR enusW[] = {'e','n','-','u','s',0};
|
|
||||||
IDWriteFontCollection *collection;
|
IDWriteFontCollection *collection;
|
||||||
IDWriteLocalizedStrings *name;
|
|
||||||
IDWriteFontFamily *family;
|
IDWriteFontFamily *family;
|
||||||
UINT32 index;
|
|
||||||
BOOL exists;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p)->(%p %p %p)\n", This, font, logfont, is_systemfont);
|
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);
|
get_logfont_from_font(font, logfont);
|
||||||
logfont->lfCharSet = DEFAULT_CHARSET;
|
logfont->lfCharSet = DEFAULT_CHARSET;
|
||||||
logfont->lfOutPrecision = OUT_OUTLINE_PRECIS;
|
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;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
/* 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. */
|
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;
|
void *os2_context, *name_context;
|
||||||
|
const TT_OS2_V2 *tt_os2;
|
||||||
const void *name_table;
|
const void *name_table;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
@ -1635,6 +1636,27 @@ HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, IDWrite
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
hr = opentype_get_font_strings_from_id(name_table, OPENTYPE_STRING_SUBFAMILY_NAME, names);
|
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)
|
if (tt_os2)
|
||||||
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
|
IDWriteFontFileStream_ReleaseFileFragment(stream_desc->stream, os2_context);
|
||||||
if (name_context)
|
if (name_context)
|
||||||
|
|
|
@ -3459,6 +3459,7 @@ static void test_TryGetFontTable(void)
|
||||||
static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
|
static void get_logfont_from_font(IDWriteFont *font, LOGFONTW *logfont)
|
||||||
{
|
{
|
||||||
void *os2_context, *head_context;
|
void *os2_context, *head_context;
|
||||||
|
IDWriteLocalizedStrings *names;
|
||||||
DWRITE_FONT_SIMULATIONS sim;
|
DWRITE_FONT_SIMULATIONS sim;
|
||||||
IDWriteFontFace *fontface;
|
IDWriteFontFace *fontface;
|
||||||
const TT_OS2_V2 *tt_os2;
|
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)
|
if (tt_os2)
|
||||||
IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
|
IDWriteFontFace_ReleaseFontTable(fontface, os2_context);
|
||||||
if (tt_head)
|
if (tt_head)
|
||||||
|
@ -3631,6 +3657,8 @@ if (0) { /* crashes on native */
|
||||||
sim & DWRITE_FONT_SIMULATIONS_BOLD ? "yes" : "no");
|
sim & DWRITE_FONT_SIMULATIONS_BOLD ? "yes" : "no");
|
||||||
ok(logfont.lfItalic == lf.lfItalic, "%s: unexpected italic flag %d, oblique simulation %s\n",
|
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");
|
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),
|
ok(logfont.lfOutPrecision == OUT_OUTLINE_PRECIS, "%s: unexpected output precision %d\n", wine_dbgstr_w(nameW),
|
||||||
logfont.lfOutPrecision);
|
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.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),
|
ok(logfont.lfPitchAndFamily == DEFAULT_PITCH, "%s: unexpected pitch %d\n", wine_dbgstr_w(nameW),
|
||||||
logfont.lfPitchAndFamily);
|
logfont.lfPitchAndFamily);
|
||||||
ok(logfont.lfFaceName[0] != 0, "got face name %s\n", wine_dbgstr_w(logfont.lfFaceName));
|
|
||||||
|
|
||||||
IDWriteFont_Release(font);
|
IDWriteFont_Release(font);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue