Nikolay Sivov : dwrite: Implement set builder methods that don't specify font properties.
Alexandre Julliard
julliard at winehq.org
Wed Mar 3 15:47:29 CST 2021
Module: wine
Branch: master
Commit: eac1ca616d7723e19e8c82378c2a1876f27cf7c9
URL: https://source.winehq.org/git/wine.git/?a=commit;h=eac1ca616d7723e19e8c82378c2a1876f27cf7c9
Author: Nikolay Sivov <nsivov at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list