Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/dwrite_private.h | 5 +++-- dlls/dwrite/format.c | 13 ++++++++----- dlls/dwrite/main.c | 34 ++++++++++++++++++++++++++++------ dlls/dwrite/tests/layout.c | 5 +---- 4 files changed, 40 insertions(+), 17 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index fdc916adc40..944f4cab635 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -286,8 +286,9 @@ struct dwrite_fontface };
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; +extern HRESULT create_text_format(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight, + DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, float size, const WCHAR *locale, REFIID riid, + void **out) DECLSPEC_HIDDEN; extern HRESULT create_textlayout(const struct textlayout_desc*,IDWriteTextLayout**) DECLSPEC_HIDDEN; extern HRESULT create_trimmingsign(IDWriteFactory7 *factory, IDWriteTextFormat *format, IDWriteInlineObject **sign) DECLSPEC_HIDDEN; diff --git a/dlls/dwrite/format.c b/dlls/dwrite/format.c index 133ca87e97f..dd120fe032e 100644 --- a/dlls/dwrite/format.c +++ b/dlls/dwrite/format.c @@ -711,12 +711,14 @@ struct dwrite_textformat *unsafe_impl_from_IDWriteTextFormat(IDWriteTextFormat * CONTAINING_RECORD(iface, struct dwrite_textformat, IDWriteTextFormat3_iface) : NULL; }
-HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight, - DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, float size, const WCHAR *locale, IDWriteTextFormat **format) +HRESULT create_text_format(const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_WEIGHT weight, + DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, float size, const WCHAR *locale, + REFIID riid, void **out) { struct dwrite_textformat *object; + HRESULT hr;
- *format = NULL; + *out = NULL;
if (size <= 0.0f) return E_INVALIDARG; @@ -746,9 +748,10 @@ HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *colle object->format.collection = collection; IDWriteFontCollection_AddRef(object->format.collection);
- *format = (IDWriteTextFormat *)&object->IDWriteTextFormat3_iface; + hr = IDWriteTextFormat3_QueryInterface(&object->IDWriteTextFormat3_iface, riid, out); + IDWriteTextFormat3_Release(&object->IDWriteTextFormat3_iface);
- return S_OK; + return hr; }
static HRESULT WINAPI dwritetrimmingsign_QueryInterface(IDWriteInlineObject *iface, REFIID riid, void **obj) diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index 01b47e673bb..c869ec3df54 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -1199,7 +1199,8 @@ static HRESULT WINAPI dwritefactory_CreateTextFormat(IDWriteFactory7 *iface, WCH return hr; }
- hr = create_textformat(family_name, collection, weight, style, stretch, size, locale, format); + hr = create_text_format(family_name, collection, weight, style, stretch, size, locale, + &IID_IDWriteTextFormat, (void **)format); IDWriteFontCollection_Release(collection); return hr; } @@ -1895,14 +1896,35 @@ static HRESULT WINAPI dwritefactory6_CreateFontSetBuilder(IDWriteFactory7 *iface return create_fontset_builder(iface, builder); }
-static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *familyname, +static HRESULT WINAPI dwritefactory6_CreateTextFormat(IDWriteFactory7 *iface, const WCHAR *family_name, IDWriteFontCollection *collection, DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_axis, - FLOAT fontsize, const WCHAR *localename, IDWriteTextFormat3 **format) + float size, const WCHAR *locale, IDWriteTextFormat3 **format) { - FIXME("%p, %s, %p, %p, %u, %.8e, %s, %p.\n", iface, debugstr_w(familyname), collection, axis_values, num_axis, - fontsize, debugstr_w(localename), format); + struct dwritefactory *factory = impl_from_IDWriteFactory7(iface); + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p, %p, %u, %.8e, %s, %p.\n", iface, debugstr_w(family_name), collection, axis_values, num_axis, + size, debugstr_w(locale), format); + + *format = NULL; + + if (axis_values) + FIXME("Axis values are ignored.\n"); + + if (collection) + { + IDWriteFontCollection_AddRef(collection); + } + else if (FAILED(hr = factory_get_system_collection(factory, DWRITE_FONT_FAMILY_MODEL_TYPOGRAPHIC, + &IID_IDWriteFontCollection, (void **)&collection))) + { + return hr; + } + + hr = create_text_format(family_name, collection, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, size, locale, &IID_IDWriteTextFormat3, (void **)format); + IDWriteFontCollection_Release(collection); + return hr; }
static HRESULT WINAPI dwritefactory7_GetSystemFontSet(IDWriteFactory7 *iface, BOOL include_downloadable, diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c index 43b6efa107b..24ec3be7585 100644 --- a/dlls/dwrite/tests/layout.c +++ b/dlls/dwrite/tests/layout.c @@ -5986,11 +5986,8 @@ static void test_text_format_axes(void) }
hr = IDWriteFactory6_CreateTextFormat(factory, L"test_family", NULL, NULL, 0, 10.0f, L"en-us", &format3); - todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-if (SUCCEEDED(hr)) -{ hr = IDWriteTextFormat3_GetFontCollection(format3, &collection); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
@@ -6025,7 +6022,7 @@ if (SUCCEEDED(hr)) ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "Unexpected font weight %d.\n", weight);
IDWriteTextFormat3_Release(format3); -} + hr = IDWriteFactory_CreateTextFormat((IDWriteFactory *)factory, L"test_family", NULL, DWRITE_FONT_WEIGHT_BOLD, DWRITE_FONT_STYLE_ITALIC, DWRITE_FONT_STRETCH_EXPANDED, 10.0f, L"en-us", &format);