[PATCH 2/2] dwrite: Improve ConvertFontFaceToLOGFONT using same logic IDWriteFont uses
Nikolay Sivov
nsivov at codeweavers.com
Wed Dec 7 07:46:39 CST 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/dwrite_private.h | 2 +-
dlls/dwrite/font.c | 18 +++
dlls/dwrite/gdiinterop.c | 55 +------
dlls/dwrite/tests/font.c | 331 ++++++++++++++++++++++++-------------------
4 files changed, 208 insertions(+), 198 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 1e46498..7d1cfa8 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -163,7 +163,6 @@ struct fontface_desc
struct dwrite_font_data *font_data; /* could be NULL when face is created directly with IDWriteFactory::CreateFontFace() */
};
-extern HRESULT convert_fontface_to_logfont(IDWriteFontFace*, LOGFONTW*) DECLSPEC_HIDDEN;
extern HRESULT create_numbersubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD,const WCHAR *locale,BOOL,IDWriteNumberSubstitution**) DECLSPEC_HIDDEN;
extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT_WEIGHT,DWRITE_FONT_STYLE,DWRITE_FONT_STRETCH,
FLOAT,const WCHAR*,IDWriteTextFormat**) DECLSPEC_HIDDEN;
@@ -201,6 +200,7 @@ extern HRESULT factory_get_cached_fontface(IDWriteFactory4*,IDWriteFontFile*cons
struct list**) DECLSPEC_HIDDEN;
extern void factory_cache_fontface(struct list*,IDWriteFontFace4*) DECLSPEC_HIDDEN;
extern void get_logfont_from_font(IDWriteFont*,LOGFONTW*) DECLSPEC_HIDDEN;
+extern void get_logfont_from_fontface(IDWriteFontFace*,LOGFONTW*) DECLSPEC_HIDDEN;
/* Opentype font table functions */
struct dwrite_font_props {
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 17bea89..ba97025 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -243,6 +243,8 @@ struct dwrite_fontface {
DWRITE_FONT_STRETCH stretch;
DWRITE_FONT_WEIGHT weight;
DWRITE_PANOSE panose;
+
+ LOGFONTW lf;
};
struct dwrite_fontfile {
@@ -1685,12 +1687,26 @@ static struct dwrite_font *unsafe_impl_from_IDWriteFont(IDWriteFont *iface)
return CONTAINING_RECORD(iface, struct dwrite_font, IDWriteFont3_iface);
}
+static struct dwrite_fontface *unsafe_impl_from_IDWriteFontFace(IDWriteFontFace *iface)
+{
+ if (!iface)
+ return NULL;
+ assert(iface->lpVtbl = (IDWriteFontFaceVtbl*)&dwritefontfacevtbl);
+ return CONTAINING_RECORD(iface, struct dwrite_fontface, IDWriteFontFace4_iface);
+}
+
void get_logfont_from_font(IDWriteFont *iface, LOGFONTW *lf)
{
struct dwrite_font *font = unsafe_impl_from_IDWriteFont(iface);
*lf = font->data->lf;
}
+void get_logfont_from_fontface(IDWriteFontFace *iface, LOGFONTW *lf)
+{
+ struct dwrite_fontface *fontface = unsafe_impl_from_IDWriteFontFace(iface);
+ *lf = fontface->lf;
+}
+
static HRESULT create_font(struct dwrite_font_data *data, IDWriteFontFamily1 *family, IDWriteFont3 **font)
{
struct dwrite_font *This;
@@ -4284,6 +4300,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, IDWriteFontFace4 **ret
fontface->style = desc->font_data->style;
fontface->stretch = desc->font_data->stretch;
fontface->panose = desc->font_data->panose;
+ fontface->lf = desc->font_data->lf;
}
else {
IDWriteLocalizedStrings *names;
@@ -4299,6 +4316,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, IDWriteFontFace4 **ret
fontface->style = data->style;
fontface->stretch = data->stretch;
fontface->panose = data->panose;
+ fontface->lf = data->lf;
IDWriteLocalizedStrings_Release(names);
release_font_data(data);
diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c
index 3675875..67fc4a0 100644
--- a/dlls/dwrite/gdiinterop.c
+++ b/dlls/dwrite/gdiinterop.c
@@ -658,67 +658,20 @@ static HRESULT WINAPI gdiinterop_ConvertFontToLOGFONT(IDWriteGdiInterop1 *iface,
static HRESULT WINAPI gdiinterop_ConvertFontFaceToLOGFONT(IDWriteGdiInterop1 *iface,
IDWriteFontFace *fontface, LOGFONTW *logfont)
{
- static const WCHAR enusW[] = {'e','n','-','u','s',0};
struct gdiinterop *This = impl_from_IDWriteGdiInterop1(iface);
- IDWriteLocalizedStrings *familynames;
- DWRITE_FONT_SIMULATIONS simulations;
- struct file_stream_desc stream_desc;
- struct dwrite_font_props props;
- IDWriteFontFileStream *stream;
- IDWriteFontFile *file = NULL;
- UINT32 index;
- BOOL exists;
- HRESULT hr;
TRACE("(%p)->(%p %p)\n", This, fontface, logfont);
memset(logfont, 0, sizeof(*logfont));
- index = 1;
- hr = IDWriteFontFace_GetFiles(fontface, &index, &file);
- if (FAILED(hr) || !file)
- return hr;
-
- hr = get_filestream_from_file(file, &stream);
- if (FAILED(hr)) {
- IDWriteFontFile_Release(file);
- return hr;
- }
-
- stream_desc.stream = stream;
- stream_desc.face_type = IDWriteFontFace_GetType(fontface);
- stream_desc.face_index = IDWriteFontFace_GetIndex(fontface);
- opentype_get_font_properties(&stream_desc, &props);
- hr = opentype_get_font_familyname(&stream_desc, &familynames);
- IDWriteFontFile_Release(file);
- IDWriteFontFileStream_Release(stream);
- if (FAILED(hr))
- return hr;
-
- simulations = IDWriteFontFace_GetSimulations(fontface);
+ if (!fontface)
+ return E_INVALIDARG;
+ get_logfont_from_fontface(fontface, logfont);
logfont->lfCharSet = DEFAULT_CHARSET;
- logfont->lfWeight = props.weight;
- logfont->lfItalic = props.style == DWRITE_FONT_STYLE_ITALIC || (simulations & DWRITE_FONT_SIMULATIONS_OBLIQUE);
logfont->lfOutPrecision = OUT_OUTLINE_PRECIS;
- logfont->lfFaceName[0] = 0;
-
- exists = FALSE;
- hr = IDWriteLocalizedStrings_FindLocaleName(familynames, enusW, &index, &exists);
- if (FAILED(hr) || !exists) {
- /* fallback to 0 index */
- if (IDWriteLocalizedStrings_GetCount(familynames) > 0)
- index = 0;
- else {
- IDWriteLocalizedStrings_Release(familynames);
- return E_FAIL;
- }
- }
- hr = IDWriteLocalizedStrings_GetString(familynames, index, logfont->lfFaceName, sizeof(logfont->lfFaceName)/sizeof(WCHAR));
- IDWriteLocalizedStrings_Release(familynames);
-
- return hr;
+ return S_OK;
}
struct font_realization_info {
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index ce4145e..d5126ff 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -2196,68 +2196,215 @@ static void test_system_fontcollection(void)
IDWriteFactory_Release(factory);
}
-static void test_ConvertFontFaceToLOGFONT(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;
+ 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;
+ logfont->lfWidth = 0;
+ logfont->lfEscapement = 0;
+ logfont->lfOrientation = 0;
+ logfont->lfUnderline = 0;
+ logfont->lfStrikeOut = 0;
+
+ logfont->lfWeight = 0;
+ logfont->lfItalic = 0;
+
+ hr = IDWriteFont_CreateFontFace(font, &fontface);
+ ok(hr == S_OK, "Failed to create font face, %#x\n", 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 = 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);
+
+ /* lfWeight */
+ weight = FW_REGULAR;
+ if (tt_os2) {
+ USHORT usWeightClass = GET_BE_WORD(tt_os2->usWeightClass);
+
+ 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);
+ }
+ else if (tt_head) {
+ USHORT macStyle = GET_BE_WORD(tt_head->macStyle);
+ logfont->lfItalic = !!(macStyle & TT_HEAD_MACSTYLE_ITALIC);
+ }
+ }
+
+ /* 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 (GetSystemDefaultLocaleName(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)
+ IDWriteFontFace_ReleaseFontTable(fontface, head_context);
+ IDWriteFontFace_Release(fontface);
+}
+
+static void test_ConvertFontFaceToLOGFONT(void)
+{
IDWriteGdiInterop *interop;
IDWriteFontFace *fontface;
IDWriteFactory *factory;
- IDWriteFont *font;
LOGFONTW logfont;
+ UINT32 count, i;
HRESULT hr;
+ IDWriteFontCollection *collection;
factory = create_factory();
hr = IDWriteFactory_GetGdiInterop(factory, &interop);
ok(hr == S_OK, "got 0x%08x\n", hr);
- memset(&logfont, 0, sizeof(logfont));
- logfont.lfHeight = 12;
- logfont.lfWidth = 12;
- logfont.lfEscapement = 100;
- logfont.lfWeight = FW_NORMAL;
- logfont.lfItalic = 1;
- logfont.lfUnderline = 1;
- logfont.lfStrikeOut = 1;
-
- lstrcpyW(logfont.lfFaceName, tahomaW);
+if (0) /* crashes on native */
+{
+ hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, NULL, NULL);
+ hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, fontface, NULL);
+}
+ memset(&logfont, 0xcc, sizeof(logfont));
+ hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, NULL, &logfont);
+ ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+ ok(logfont.lfFaceName[0] == 0, "got face name %s\n", wine_dbgstr_w(logfont.lfFaceName));
- hr = IDWriteGdiInterop_CreateFontFromLOGFONT(interop, &logfont, &font);
+ hr = IDWriteFactory_GetSystemFontCollection(factory, &collection, FALSE);
ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IDWriteFont_CreateFontFace(font, &fontface);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+ count = IDWriteFontCollection_GetFontFamilyCount(collection);
+ for (i = 0; i < count; i++) {
+ WCHAR nameW[128], familynameW[64], facenameW[64];
+ IDWriteLocalizedStrings *names;
+ DWRITE_FONT_SIMULATIONS sim;
+ IDWriteFontFamily *family;
+ UINT32 font_count, j;
+ IDWriteFont *font;
+ LOGFONTW lf;
- sim = IDWriteFont_GetSimulations(font);
- ok(sim == DWRITE_FONT_SIMULATIONS_OBLIQUE, "sim %d\n", sim);
+ hr = IDWriteFontCollection_GetFontFamily(collection, i, &family);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
- sim = IDWriteFontFace_GetSimulations(fontface);
- ok(sim == DWRITE_FONT_SIMULATIONS_OBLIQUE, "sim %d\n", sim);
+ hr = IDWriteFontFamily_GetFamilyNames(family, &names);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
- IDWriteFont_Release(font);
+ get_enus_string(names, familynameW, sizeof(familynameW)/sizeof(familynameW[0]));
+ IDWriteLocalizedStrings_Release(names);
-if (0) /* crashes on native */
-{
- hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, NULL, NULL);
- hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, fontface, NULL);
-}
+ font_count = IDWriteFontFamily_GetFontCount(family);
+
+ for (j = 0; j < font_count; j++) {
+ static const WCHAR spaceW[] = {' ', 0};
+ IDWriteFontFace *fontface;
+
+ hr = IDWriteFontFamily_GetFont(family, j, &font);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
- memset(&logfont, 0xa, sizeof(logfont));
- logfont.lfFaceName[0] = 0;
+ hr = IDWriteFont_GetFaceNames(font, &names);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
- hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, fontface, &logfont);
- ok(hr == S_OK, "got 0x%08x\n", hr);
- ok(logfont.lfHeight == 0, "got %d\n", logfont.lfHeight);
- ok(logfont.lfWidth == 0, "got %d\n", logfont.lfWidth);
- ok(logfont.lfWeight == FW_NORMAL, "got %d\n", logfont.lfWeight);
- ok(logfont.lfEscapement == 0, "got %d\n", logfont.lfEscapement);
- ok(logfont.lfItalic == 1, "got %d\n", logfont.lfItalic);
- ok(logfont.lfUnderline == 0, "got %d\n", logfont.lfUnderline);
- ok(logfont.lfStrikeOut == 0, "got %d\n", logfont.lfStrikeOut);
- ok(!lstrcmpW(logfont.lfFaceName, tahomaW), "got %s\n", wine_dbgstr_w(logfont.lfFaceName));
+ get_enus_string(names, facenameW, sizeof(facenameW)/sizeof(facenameW[0]));
+ IDWriteLocalizedStrings_Release(names);
+
+ lstrcpyW(nameW, familynameW);
+ lstrcatW(nameW, spaceW);
+ lstrcatW(nameW, facenameW);
+
+ hr = IDWriteFont_CreateFontFace(font, &fontface);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ memset(&logfont, 0xcc, sizeof(logfont));
+ hr = IDWriteGdiInterop_ConvertFontFaceToLOGFONT(interop, fontface, &logfont);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ sim = IDWriteFontFace_GetSimulations(fontface);
+
+ 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(!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);
+ ok(logfont.lfClipPrecision == CLIP_DEFAULT_PRECIS, "%s: unexpected clipping precision %d\n", wine_dbgstr_w(nameW),
+ logfont.lfClipPrecision);
+ 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);
+
+ IDWriteFontFace_Release(fontface);
+ IDWriteFont_Release(font);
+ }
+
+ IDWriteFontFamily_Release(family);
+ }
+ IDWriteFontCollection_Release(collection);
IDWriteGdiInterop_Release(interop);
- IDWriteFontFace_Release(fontface);
IDWriteFactory_Release(factory);
}
@@ -3456,114 +3603,6 @@ static void test_TryGetFontTable(void)
DELETE_FONTFILE(path);
}
-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;
- 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;
- logfont->lfWidth = 0;
- logfont->lfEscapement = 0;
- logfont->lfOrientation = 0;
- logfont->lfUnderline = 0;
- logfont->lfStrikeOut = 0;
-
- logfont->lfWeight = 0;
- logfont->lfItalic = 0;
-
- hr = IDWriteFont_CreateFontFace(font, &fontface);
- ok(hr == S_OK, "Failed to create font face, %#x\n", 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 = 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);
-
- /* lfWeight */
- weight = FW_REGULAR;
- if (tt_os2) {
- USHORT usWeightClass = GET_BE_WORD(tt_os2->usWeightClass);
-
- 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);
- }
- else if (tt_head) {
- USHORT macStyle = GET_BE_WORD(tt_head->macStyle);
- logfont->lfItalic = !!(macStyle & TT_HEAD_MACSTYLE_ITALIC);
- }
- }
-
- /* 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 (GetSystemDefaultLocaleName(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)
- IDWriteFontFace_ReleaseFontTable(fontface, head_context);
- IDWriteFontFace_Release(fontface);
-}
-
static void test_ConvertFontToLOGFONT(void)
{
IDWriteFactory *factory, *factory2;
--
2.10.2
More information about the wine-patches
mailing list