[PATCH 1/5] dwrite: Implement GetFaceNames() for fontfaces.
Nikolay Sivov
nsivov at codeweavers.com
Fri Jan 24 02:17:34 CST 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/dwrite_private.h | 4 ++-
dlls/dwrite/font.c | 57 ++++++++++++++++++++----------------
dlls/dwrite/main.c | 2 +-
dlls/dwrite/tests/font.c | 30 ++++++++++++++++++-
4 files changed, 65 insertions(+), 28 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index cf3f13b1c6..58b5e9a0e0 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -231,6 +231,8 @@ struct dwrite_fontface
FONTSIGNATURE fontsig;
UINT32 glyph_image_formats;
+ IDWriteLocalizedStrings *names;
+
struct scriptshaping_cache *shaping_cache;
LOGFONTW lf;
@@ -245,7 +247,7 @@ extern HRESULT create_trimmingsign(IDWriteFactory7 *factory, IDWriteTextFormat *
extern HRESULT create_typography(IDWriteTypography**) DECLSPEC_HIDDEN;
extern HRESULT create_localizedstrings(IDWriteLocalizedStrings**) DECLSPEC_HIDDEN;
extern HRESULT add_localizedstring(IDWriteLocalizedStrings*,const WCHAR*,const WCHAR*) DECLSPEC_HIDDEN;
-extern HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
+extern HRESULT clone_localizedstrings(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **strings) DECLSPEC_HIDDEN;
extern void set_en_localizedstring(IDWriteLocalizedStrings*,const WCHAR*) DECLSPEC_HIDDEN;
extern void sort_localizedstrings(IDWriteLocalizedStrings*) DECLSPEC_HIDDEN;
extern HRESULT get_system_fontcollection(IDWriteFactory7 *factory, IDWriteFontCollection1 **collection) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 4e08b2f632..df1bc5adcb 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -539,6 +539,8 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface)
if (fontface->stream)
IDWriteFontFileStream_Release(fontface->stream);
heap_free(fontface->files);
+ if (fontface->names)
+ IDWriteLocalizedStrings_Release(fontface->names);
for (i = 0; i < ARRAY_SIZE(fontface->glyphs); i++)
heap_free(fontface->glyphs[i]);
@@ -1259,9 +1261,11 @@ static HRESULT WINAPI dwritefontface3_GetFamilyNames(IDWriteFontFace5 *iface, ID
static HRESULT WINAPI dwritefontface3_GetFaceNames(IDWriteFontFace5 *iface, IDWriteLocalizedStrings **names)
{
- FIXME("%p, %p: stub\n", iface, names);
+ struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
- return E_NOTIMPL;
+ TRACE("%p, %p.\n", iface, names);
+
+ return clone_localizedstrings(fontface->names, names);
}
static HRESULT WINAPI dwritefontface3_GetInformationalStrings(IDWriteFontFace5 *iface,
@@ -1616,9 +1620,11 @@ static BOOL WINAPI dwritefont_IsSymbolFont(IDWriteFont3 *iface)
static HRESULT WINAPI dwritefont_GetFaceNames(IDWriteFont3 *iface, IDWriteLocalizedStrings **names)
{
- struct dwrite_font *This = impl_from_IDWriteFont3(iface);
- TRACE("(%p)->(%p)\n", This, names);
- return clone_localizedstring(This->data->names, names);
+ struct dwrite_font *font = impl_from_IDWriteFont3(iface);
+
+ TRACE("%p, %p.\n", iface, names);
+
+ return clone_localizedstrings(font->data->names, names);
}
static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont3 *iface,
@@ -1663,7 +1669,7 @@ static HRESULT WINAPI dwritefont_GetInformationalStrings(IDWriteFont3 *iface,
IDWriteFontFace5_Release(fontface);
}
- hr = clone_localizedstring(data->info_strings[stringid], strings);
+ hr = clone_localizedstrings(data->info_strings[stringid], strings);
if (FAILED(hr))
return hr;
@@ -2166,7 +2172,10 @@ static HRESULT WINAPI dwritefontfamily_GetFont(IDWriteFontFamily2 *iface, UINT32
static HRESULT WINAPI dwritefontfamily_GetFamilyNames(IDWriteFontFamily2 *iface, IDWriteLocalizedStrings **names)
{
struct dwrite_fontfamily *family = impl_from_IDWriteFontFamily2(iface);
- return clone_localizedstring(family->data->familyname, names);
+
+ TRACE("%p, %p.\n", iface, names);
+
+ return clone_localizedstrings(family->data->familyname, names);
}
static BOOL is_better_font_match(const struct dwrite_font_propvec *next, const struct dwrite_font_propvec *cur,
@@ -4614,6 +4623,7 @@ HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_ke
HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_list, IDWriteFontFace5 **ret)
{
struct file_stream_desc stream_desc;
+ struct dwrite_font_data *font_data;
struct dwrite_fontface *fontface;
HRESULT hr;
int i;
@@ -4678,38 +4688,35 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
*/
if (desc->font_data)
{
- fontface->weight = desc->font_data->weight;
- fontface->style = desc->font_data->style;
- fontface->stretch = desc->font_data->stretch;
- fontface->panose = desc->font_data->panose;
- fontface->fontsig = desc->font_data->fontsig;
- fontface->lf = desc->font_data->lf;
- fontface->flags |= desc->font_data->flags & (FONT_IS_SYMBOL | FONT_IS_MONOSPACED | FONT_IS_COLORED);
+ font_data = desc->font_data;
+ addref_font_data(font_data);
}
else
{
IDWriteLocalizedStrings *names;
- struct dwrite_font_data *data;
- hr = init_font_data(desc, &names, &data);
+ hr = init_font_data(desc, &names, &font_data);
if (FAILED(hr))
{
IDWriteFontFace5_Release(&fontface->IDWriteFontFace5_iface);
return hr;
}
- fontface->weight = data->weight;
- fontface->style = data->style;
- fontface->stretch = data->stretch;
- fontface->panose = data->panose;
- fontface->fontsig = data->fontsig;
- fontface->lf = data->lf;
- fontface->flags |= data->flags & (FONT_IS_SYMBOL | FONT_IS_MONOSPACED | FONT_IS_COLORED);
-
IDWriteLocalizedStrings_Release(names);
- release_font_data(data);
}
+ fontface->weight = font_data->weight;
+ fontface->style = font_data->style;
+ fontface->stretch = font_data->stretch;
+ fontface->panose = font_data->panose;
+ fontface->fontsig = font_data->fontsig;
+ fontface->lf = font_data->lf;
+ fontface->flags |= font_data->flags & (FONT_IS_SYMBOL | FONT_IS_MONOSPACED | FONT_IS_COLORED);
+ fontface->names = font_data->names;
+ if (fontface->names)
+ IDWriteLocalizedStrings_AddRef(fontface->names);
+ release_font_data(font_data);
+
fontface->cached = factory_cache_fontface(fontface->factory, cached_list, &fontface->IDWriteFontFace5_iface);
*ret = &fontface->IDWriteFontFace5_iface;
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 317a6cedaf..283cccb76c 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -468,7 +468,7 @@ HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale,
return S_OK;
}
-HRESULT clone_localizedstring(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **ret)
+HRESULT clone_localizedstrings(IDWriteLocalizedStrings *iface, IDWriteLocalizedStrings **ret)
{
struct localizedstrings *strings, *strings_clone;
size_t i;
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index ac70a4c137..6a2acd7cd8 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -4410,8 +4410,10 @@ static void test_GetFaceNames(void)
static const WCHAR obliqueW[] = {'O','b','l','i','q','u','e',0};
static const WCHAR enus2W[] = {'e','n','-','U','s',0};
static const WCHAR enusW[] = {'e','n','-','u','s',0};
- IDWriteLocalizedStrings *strings, *strings2;
+ IDWriteLocalizedStrings *strings, *strings2, *strings3;
+ IDWriteFontFace3 *fontface3;
IDWriteGdiInterop *interop;
+ IDWriteFontFace *fontface;
IDWriteFactory *factory;
UINT32 count, index;
IDWriteFont *font;
@@ -4470,6 +4472,32 @@ static void test_GetFaceNames(void)
ok(!lstrcmpW(buffW, obliqueW), "got %s\n", wine_dbgstr_w(buffW));
IDWriteLocalizedStrings_Release(strings);
+ hr = IDWriteFont_CreateFontFace(font, &fontface);
+ ok(hr == S_OK, "Failed to create a font face, hr %#x.\n", hr);
+
+ if (SUCCEEDED(IDWriteFontFace_QueryInterface(fontface, &IID_IDWriteFontFace3, (void **)&fontface3)))
+ {
+ hr = IDWriteFontFace3_GetFaceNames(fontface3, &strings2);
+ ok(hr == S_OK, "Failed to get face names, hr %#x.\n", hr);
+
+ hr = IDWriteFontFace3_GetFaceNames(fontface3, &strings3);
+ ok(hr == S_OK, "Failed to get face names, hr %#x.\n", hr);
+ ok(strings2 != strings3, "Unexpected instance.\n");
+ IDWriteLocalizedStrings_Release(strings3);
+
+ buffW[0] = 0;
+ hr = IDWriteLocalizedStrings_GetString(strings2, 0, buffW, ARRAY_SIZE(buffW));
+ ok(hr == S_OK, "Failed to get a string, hr %#x.\n", hr);
+ ok(!lstrcmpW(buffW, obliqueW), "Unexpected name %s.\n", wine_dbgstr_w(buffW));
+ IDWriteLocalizedStrings_Release(strings2);
+
+ IDWriteFontFace3_Release(fontface3);
+ }
+ else
+ win_skip("GetFaceNames() is not supported.\n");
+
+ IDWriteFontFace_Release(fontface);
+
IDWriteFont_Release(font);
IDWriteGdiInterop_Release(interop);
ref = IDWriteFactory_Release(factory);
--
2.24.1
More information about the wine-devel
mailing list