Module: wine Branch: master Commit: eac1ca616d7723e19e8c82378c2a1876f27cf7c9 URL: https://source.winehq.org/git/wine.git/?a=commit;h=eac1ca616d7723e19e8c82378...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Mar 3 15:30:44 2021 +0300
dwrite: Implement set builder methods that don't specify font properties.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/dwrite/font.c | 93 ++++++++++++++++++++++++++++++++++++++++++++---- dlls/dwrite/tests/font.c | 3 -- 2 files changed, 87 insertions(+), 9 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index ac8f5c0a7bb..bbd73f734de 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -250,11 +250,22 @@ struct dwrite_fontresource IDWriteFactory7 *factory; };
+struct dwrite_fontset_entry +{ + IDWriteFontFile *file; + unsigned int face_index; + unsigned int simulations; +}; + struct dwrite_fontset_builder { IDWriteFontSetBuilder2 IDWriteFontSetBuilder2_iface; LONG refcount; IDWriteFactory7 *factory; + + struct dwrite_fontset_entry *entries; + size_t count; + size_t capacity; };
static void dwrite_grab_font_table(void *context, UINT32 table, const BYTE **data, UINT32 *size, void **data_context) @@ -7103,18 +7114,65 @@ static ULONG WINAPI dwritefontsetbuilder_Release(IDWriteFontSetBuilder2 *iface) { struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface); ULONG refcount = InterlockedDecrement(&builder->refcount); + size_t i;
TRACE("%p, refcount %u.\n", iface, refcount);
if (!refcount) { IDWriteFactory7_Release(builder->factory); + for (i = 0; i < builder->count; ++i) + IDWriteFontFile_Release(builder->entries[i].file); + heap_free(builder->entries); heap_free(builder); }
return refcount; }
+static HRESULT fontset_builder_add_entry(struct dwrite_fontset_builder *builder, IDWriteFontFile *file, + unsigned int face_index, unsigned int simulations) +{ + struct dwrite_fontset_entry *entry; + + if (!dwrite_array_reserve((void **)&builder->entries, &builder->capacity, builder->count + 1, + sizeof(*builder->entries))) + { + return E_OUTOFMEMORY; + } + + entry = &builder->entries[builder->count++]; + entry->file = file; + IDWriteFontFile_AddRef(entry->file); + entry->face_index = face_index; + entry->simulations = simulations; + + return S_OK; +} + +static HRESULT fontset_builder_add_file(struct dwrite_fontset_builder *builder, IDWriteFontFile *file) +{ + DWRITE_FONT_FILE_TYPE filetype; + DWRITE_FONT_FACE_TYPE facetype; + unsigned int i, face_count; + BOOL supported = FALSE; + HRESULT hr; + + if (FAILED(hr = IDWriteFontFile_Analyze(file, &supported, &filetype, &facetype, &face_count))) + return hr; + + if (!supported) + return DWRITE_E_FILEFORMAT; + + for (i = 0; i < face_count; ++i) + { + if (FAILED(hr = fontset_builder_add_entry(builder, file, i, DWRITE_FONT_SIMULATIONS_NONE))) + break; + } + + return hr; +} + static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference_(IDWriteFontSetBuilder2 *iface, IDWriteFontFaceReference *ref, DWRITE_FONT_PROPERTY const *props, UINT32 prop_count) { @@ -7126,9 +7184,21 @@ static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference_(IDWriteFontSetB static HRESULT WINAPI dwritefontsetbuilder_AddFontFaceReference(IDWriteFontSetBuilder2 *iface, IDWriteFontFaceReference *ref) { - FIXME("%p, %p.\n", iface, ref); + struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface); + unsigned int face_index, simulations; + IDWriteFontFile *file; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, ref); + + if (FAILED(hr = IDWriteFontFaceReference_GetFontFile(ref, &file))) return hr; + + face_index = IDWriteFontFaceReference_GetFontFaceIndex(ref); + simulations = IDWriteFontFaceReference_GetSimulations(ref); + hr = fontset_builder_add_entry(builder, file, face_index, simulations); + IDWriteFontFile_Release(file); + + return hr; }
static HRESULT WINAPI dwritefontsetbuilder_AddFontSet(IDWriteFontSetBuilder2 *iface, IDWriteFontSet *fontset) @@ -7147,9 +7217,11 @@ static HRESULT WINAPI dwritefontsetbuilder_CreateFontSet(IDWriteFontSetBuilder2
static HRESULT WINAPI dwritefontsetbuilder1_AddFontFile(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file) { - FIXME("%p, %p.\n", iface, file); + struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface);
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, file); + + return fontset_builder_add_file(builder, file); }
static HRESULT WINAPI dwritefontsetbuilder2_AddFont(IDWriteFontSetBuilder2 *iface, IDWriteFontFile *file, @@ -7165,9 +7237,18 @@ static HRESULT WINAPI dwritefontsetbuilder2_AddFont(IDWriteFontSetBuilder2 *ifac
static HRESULT WINAPI dwritefontsetbuilder2_AddFontFile(IDWriteFontSetBuilder2 *iface, const WCHAR *filepath) { - FIXME("%p, %s.\n", iface, debugstr_w(filepath)); + struct dwrite_fontset_builder *builder = impl_from_IDWriteFontSetBuilder2(iface); + IDWriteFontFile *file; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s.\n", iface, debugstr_w(filepath)); + + if (FAILED(hr = IDWriteFactory7_CreateFontFileReference(builder->factory, filepath, NULL, &file))) + return hr; + + hr = fontset_builder_add_file(builder, file); + IDWriteFontFile_Release(file); + return hr; }
static const IDWriteFontSetBuilder2Vtbl fontsetbuildervtbl = diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c index 24ad30bc845..c377f20556b 100644 --- a/dlls/dwrite/tests/font.c +++ b/dlls/dwrite/tests/font.c @@ -9394,11 +9394,9 @@ static void test_fontsetbuilder(void) ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
hr = IDWriteFontSetBuilder1_AddFontFile(builder1, file); - todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
hr = IDWriteFontSetBuilder1_AddFontFile(builder1, file); - todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n",hr);
hr = IDWriteFontSetBuilder1_CreateFontSet(builder1, &fontset); @@ -9451,7 +9449,6 @@ static void test_fontsetbuilder(void)
EXPECT_REF(ref, 1); hr = IDWriteFontSetBuilder_AddFontFaceReference(builder, ref); - todo_wine ok(hr == S_OK, "Failed to add fontface reference, hr %#x.\n", hr); EXPECT_REF(ref, 1);