[PATCH 2/7] dwrite: Use array allocation helper to manage collection entries.
Nikolay Sivov
nsivov at codeweavers.com
Tue May 14 05:27:24 CDT 2019
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/font.c | 138 +++++++++++++++++++++++----------------------
1 file changed, 72 insertions(+), 66 deletions(-)
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 7532aa090d..9f642f9c91 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -114,14 +114,15 @@ struct dwrite_fontfamily_data
BOOL has_italic_face : 1;
};
-struct dwrite_fontcollection {
+struct dwrite_fontcollection
+{
IDWriteFontCollection1 IDWriteFontCollection1_iface;
- LONG ref;
+ LONG refcount;
IDWriteFactory5 *factory;
struct dwrite_fontfamily_data **family_data;
- UINT32 family_count;
- UINT32 family_alloc;
+ size_t size;
+ size_t count;
};
struct dwrite_fontfamily {
@@ -2441,58 +2442,65 @@ static HRESULT WINAPI dwritefontcollection_QueryInterface(IDWriteFontCollection1
static ULONG WINAPI dwritefontcollection_AddRef(IDWriteFontCollection1 *iface)
{
- struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
- TRACE("(%p)->(%d)\n", This, ref);
- return ref;
+ struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+ ULONG refcount = InterlockedIncrement(&collection->refcount);
+
+ TRACE("%p, refcount %d.\n", collection, refcount);
+
+ return refcount;
}
static ULONG WINAPI dwritefontcollection_Release(IDWriteFontCollection1 *iface)
{
- struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
-
- TRACE("(%p)->(%d)\n", This, ref);
+ struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+ ULONG refcount = InterlockedDecrement(&collection->refcount);
+ size_t i;
- if (!ref) {
- int i;
+ TRACE("%p, refcount %d.\n", iface, refcount);
- factory_detach_fontcollection(This->factory, iface);
- for (i = 0; i < This->family_count; i++)
- release_fontfamily_data(This->family_data[i]);
- heap_free(This->family_data);
- heap_free(This);
+ if (!refcount)
+ {
+ factory_detach_fontcollection(collection->factory, iface);
+ for (i = 0; i < collection->count; ++i)
+ release_fontfamily_data(collection->family_data[i]);
+ heap_free(collection->family_data);
+ heap_free(collection);
}
- return ref;
+ return refcount;
}
static UINT32 WINAPI dwritefontcollection_GetFontFamilyCount(IDWriteFontCollection1 *iface)
{
- struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
- TRACE("(%p)\n", This);
- return This->family_count;
+ struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
+
+ TRACE("%p.\n", iface);
+
+ return collection->count;
}
-static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection1 *iface, UINT32 index, IDWriteFontFamily **family)
+static HRESULT WINAPI dwritefontcollection_GetFontFamily(IDWriteFontCollection1 *iface, UINT32 index,
+ IDWriteFontFamily **family)
{
- struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
+ struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
- TRACE("(%p)->(%u %p)\n", This, index, family);
+ TRACE("%p, %u, %p.\n", iface, index, family);
- if (index >= This->family_count) {
+ if (index >= collection->count)
+ {
*family = NULL;
return E_FAIL;
}
- return create_fontfamily(This, index, (IDWriteFontFamily1 **)family);
+ return create_fontfamily(collection, index, (IDWriteFontFamily1 **)family);
}
static UINT32 collection_find_family(struct dwrite_fontcollection *collection, const WCHAR *name)
{
- UINT32 i;
+ size_t i;
- for (i = 0; i < collection->family_count; i++) {
+ for (i = 0; i < collection->count; ++i)
+ {
IDWriteLocalizedStrings *family_name = collection->family_data[i]->familyname;
UINT32 j, count = IDWriteLocalizedStrings_GetCount(family_name);
HRESULT hr;
@@ -2540,17 +2548,18 @@ static BOOL is_same_fontfile(IDWriteFontFile *left, IDWriteFontFile *right)
return !memcmp(left_key, right_key, left_key_size);
}
-static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection1 *iface, IDWriteFontFace *face, IDWriteFont **font)
+static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollection1 *iface, IDWriteFontFace *face,
+ IDWriteFont **font)
{
- struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
+ struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
IDWriteFontFamily1 *family;
BOOL found_font = FALSE;
IDWriteFontFile *file;
- UINT32 i, face_index;
+ UINT32 face_index;
+ size_t i, j;
HRESULT hr;
- size_t j;
- TRACE("(%p)->(%p %p)\n", This, face, font);
+ TRACE("%p, %p, %p.\n", iface, face, font);
*font = NULL;
@@ -2564,8 +2573,9 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
face_index = IDWriteFontFace_GetIndex(face);
found_font = FALSE;
- for (i = 0; i < This->family_count; i++) {
- struct dwrite_fontfamily_data *family_data = This->family_data[i];
+ for (i = 0; i < collection->count; ++i)
+ {
+ struct dwrite_fontfamily_data *family_data = collection->family_data[i];
for (j = 0; j < family_data->count; ++j)
{
@@ -2585,7 +2595,7 @@ static HRESULT WINAPI dwritefontcollection_GetFontFromFontFace(IDWriteFontCollec
if (!found_font)
return DWRITE_E_NOFONT;
- hr = create_fontfamily(This, i, &family);
+ hr = create_fontfamily(collection, i, &family);
if (FAILED(hr))
return hr;
@@ -2603,18 +2613,20 @@ static HRESULT WINAPI dwritefontcollection1_GetFontSet(IDWriteFontCollection1 *i
return E_NOTIMPL;
}
-static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection1 *iface, UINT32 index, IDWriteFontFamily1 **family)
+static HRESULT WINAPI dwritefontcollection1_GetFontFamily(IDWriteFontCollection1 *iface, UINT32 index,
+ IDWriteFontFamily1 **family)
{
- struct dwrite_fontcollection *This = impl_from_IDWriteFontCollection1(iface);
+ struct dwrite_fontcollection *collection = impl_from_IDWriteFontCollection1(iface);
- TRACE("(%p)->(%u %p)\n", This, index, family);
+ TRACE("%p, %u, %p.\n", iface, index, family);
- if (index >= This->family_count) {
+ if (index >= collection->count)
+ {
*family = NULL;
return E_FAIL;
}
- return create_fontfamily(This, index, family);
+ return create_fontfamily(collection, index, family);
}
static const IDWriteFontCollection1Vtbl fontcollectionvtbl = {
@@ -2659,34 +2671,26 @@ static HRESULT fontfamily_add_font(struct dwrite_fontfamily_data *family_data, s
return S_OK;
}
-static HRESULT fontcollection_add_family(struct dwrite_fontcollection *collection, struct dwrite_fontfamily_data *family)
+static HRESULT fontcollection_add_family(struct dwrite_fontcollection *collection,
+ struct dwrite_fontfamily_data *family)
{
- if (collection->family_alloc < collection->family_count + 1) {
- struct dwrite_fontfamily_data **new_list;
- UINT32 new_alloc;
-
- new_alloc = collection->family_alloc * 2;
- new_list = heap_realloc(collection->family_data, sizeof(*new_list) * new_alloc);
- if (!new_list)
- return E_OUTOFMEMORY;
-
- collection->family_alloc = new_alloc;
- collection->family_data = new_list;
+ if (!dwrite_array_reserve((void **)&collection->family_data, &collection->size, collection->count + 1,
+ sizeof(*collection->family_data)))
+ {
+ return E_OUTOFMEMORY;
}
- collection->family_data[collection->family_count++] = family;
+ collection->family_data[collection->count++] = family;
return S_OK;
}
static HRESULT init_font_collection(struct dwrite_fontcollection *collection, BOOL is_system)
{
collection->IDWriteFontCollection1_iface.lpVtbl = is_system ? &systemfontcollectionvtbl : &fontcollectionvtbl;
- collection->ref = 1;
- collection->family_count = 0;
- collection->family_alloc = is_system ? 30 : 5;
- collection->family_data = heap_calloc(collection->family_alloc, sizeof(*collection->family_data));
- if (!collection->family_data)
- return E_OUTOFMEMORY;
+ collection->refcount = 1;
+ collection->count = 0;
+ collection->size = 0;
+ collection->family_data = NULL;
return S_OK;
}
@@ -3772,7 +3776,7 @@ HRESULT create_font_collection(IDWriteFactory5 *factory, IDWriteFontFileEnumerat
struct list scannedfiles;
BOOL current = FALSE;
HRESULT hr = S_OK;
- UINT32 i;
+ size_t i;
*ret = NULL;
@@ -3906,7 +3910,8 @@ HRESULT create_font_collection(IDWriteFactory5 *factory, IDWriteFontFileEnumerat
heap_free(fileenum);
}
- for (i = 0; i < collection->family_count; i++) {
+ for (i = 0; i < collection->count; ++i)
+ {
fontfamily_add_bold_simulated_face(collection->family_data[i]);
fontfamily_add_oblique_simulated_face(collection->family_data[i]);
}
@@ -4229,7 +4234,7 @@ HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection1
BOOL exists;
LONG retval;
HRESULT hr;
- UINT32 i;
+ size_t i;
TRACE("building EUDC font collection for factory %p, ACP %u\n", factory, GetACP());
@@ -4283,7 +4288,8 @@ HRESULT get_eudc_fontcollection(IDWriteFactory5 *factory, IDWriteFontCollection1
}
/* EUDC collection offers simulated faces too */
- for (i = 0; i < collection->family_count; i++) {
+ for (i = 0; i < collection->count; ++i)
+ {
fontfamily_add_bold_simulated_face(collection->family_data[i]);
fontfamily_add_oblique_simulated_face(collection->family_data[i]);
}
--
2.20.1
More information about the wine-devel
mailing list