Nikolay Sivov : dwrite: Add additional structure for mappings array.
Alexandre Julliard
julliard at winehq.org
Fri Jul 22 15:38:23 CDT 2022
Module: wine
Branch: master
Commit: 1cf2ac20c8587504c32d85854737d103bc9c624a
URL: https://gitlab.winehq.org/wine/wine/-/commit/1cf2ac20c8587504c32d85854737d103bc9c624a
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sat Jul 16 15:01:20 2022 +0300
dwrite: Add additional structure for mappings array.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/dwrite/analyzer.c | 96 ++++++++++++++++++++++++++++++--------------------
1 file changed, 58 insertions(+), 38 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index a8ab12b9430..2f5f1e1d7fe 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -240,6 +240,12 @@ static const struct fallback_mapping fontfallback_neutral_data[] = {
#undef MAPPING_RANGE
};
+struct fallback_data
+{
+ struct fallback_mapping *mappings;
+ size_t count;
+};
+
struct dwrite_fontfallback
{
IDWriteFontFallback1 IDWriteFontFallback1_iface;
@@ -255,11 +261,31 @@ struct dwrite_fontfallback_builder
IDWriteFontFallbackBuilder IDWriteFontFallbackBuilder_iface;
LONG refcount;
IDWriteFactory7 *factory;
- struct fallback_mapping *mappings;
- size_t size;
- size_t count;
+ struct fallback_data data;
+ size_t mappings_size;
};
+static void release_fallback_mapping(struct fallback_mapping *mapping)
+{
+ unsigned int i;
+
+ free(mapping->ranges);
+ for (i = 0; i < mapping->families_count; ++i)
+ free(mapping->families[i]);
+ free(mapping->families);
+ if (mapping->collection)
+ IDWriteFontCollection_Release(mapping->collection);
+}
+
+static void release_fallback_data(struct fallback_data *data)
+{
+ size_t i;
+
+ for (i = 0; i < data->count; ++i)
+ release_fallback_mapping(&data->mappings[i]);
+ free(data->mappings);
+}
+
struct dwrite_numbersubstitution
{
IDWriteNumberSubstitution IDWriteNumberSubstitution_iface;
@@ -2327,76 +2353,70 @@ static ULONG WINAPI fontfallbackbuilder_AddRef(IDWriteFontFallbackBuilder *iface
static ULONG WINAPI fontfallbackbuilder_Release(IDWriteFontFallbackBuilder *iface)
{
- struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface);
- ULONG refcount = InterlockedDecrement(&fallbackbuilder->refcount);
- size_t i;
+ struct dwrite_fontfallback_builder *builder = impl_from_IDWriteFontFallbackBuilder(iface);
+ ULONG refcount = InterlockedDecrement(&builder->refcount);
TRACE("%p, refcount %ld.\n", iface, refcount);
if (!refcount)
{
- for (i = 0; i < fallbackbuilder->count; ++i)
- {
- struct fallback_mapping *mapping = &fallbackbuilder->mappings[i];
- UINT32 j;
-
- for (j = 0; j < mapping->families_count; j++)
- free(mapping->families[j]);
- free(mapping->families);
-
- if (mapping->collection)
- IDWriteFontCollection_Release(mapping->collection);
- free(mapping->ranges);
- free(mapping->locale);
- }
-
- IDWriteFactory7_Release(fallbackbuilder->factory);
- free(fallbackbuilder->mappings);
- free(fallbackbuilder);
+ IDWriteFactory7_Release(builder->factory);
+ release_fallback_data(&builder->data);
+ free(builder);
}
return refcount;
}
static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder *iface,
- const DWRITE_UNICODE_RANGE *ranges, UINT32 ranges_count, WCHAR const **target_families, UINT32 families_count,
- IDWriteFontCollection *collection, WCHAR const *locale, WCHAR const *base_family, FLOAT scale)
+ const DWRITE_UNICODE_RANGE *ranges, UINT32 ranges_count, WCHAR const **families, UINT32 families_count,
+ IDWriteFontCollection *collection, WCHAR const *locale_name, WCHAR const *base_family, float scale)
{
- struct dwrite_fontfallback_builder *fallbackbuilder = impl_from_IDWriteFontFallbackBuilder(iface);
+ struct dwrite_fontfallback_builder *builder = impl_from_IDWriteFontFallbackBuilder(iface);
struct fallback_mapping *mapping;
UINT32 i;
- TRACE("%p, %p, %u, %p, %u, %p, %s, %s, %f.\n", iface, ranges, ranges_count, target_families, families_count,
- collection, debugstr_w(locale), debugstr_w(base_family), scale);
+ TRACE("%p, %p, %u, %p, %u, %p, %s, %s, %f.\n", iface, ranges, ranges_count, families, families_count,
+ collection, debugstr_w(locale_name), debugstr_w(base_family), scale);
- if (!ranges || ranges_count == 0 || !target_families || families_count == 0 || scale < 0.0f)
+ if (!ranges || !ranges_count || !families || !families_count || scale < 0.0f)
return E_INVALIDARG;
if (base_family)
FIXME("base family ignored.\n");
- if (!dwrite_array_reserve((void **)&fallbackbuilder->mappings, &fallbackbuilder->size, fallbackbuilder->count + 1,
- sizeof(*fallbackbuilder->mappings)))
+ if (!dwrite_array_reserve((void **)&builder->data.mappings, &builder->mappings_size,
+ builder->data.count + 1, sizeof(*builder->data.mappings)))
{
return E_OUTOFMEMORY;
}
- mapping = &fallbackbuilder->mappings[fallbackbuilder->count++];
+ mapping = &builder->data.mappings[builder->data.count];
+ memset(mapping, 0, sizeof(*mapping));
+
+ if (!(mapping->ranges = calloc(ranges_count, sizeof(*mapping->ranges))))
+ goto failed;
- mapping->ranges = calloc(ranges_count, sizeof(*mapping->ranges));
- memcpy(mapping->ranges, ranges, sizeof(*mapping->ranges) * ranges_count);
mapping->ranges_count = ranges_count;
- mapping->families = calloc(families_count, sizeof(*mapping->families));
+ memcpy(mapping->ranges, ranges, sizeof(*mapping->ranges) * ranges_count);
+
+ if (!(mapping->families = calloc(families_count, sizeof(*mapping->families))))
+ goto failed;
mapping->families_count = families_count;
for (i = 0; i < families_count; i++)
- mapping->families[i] = wcsdup(target_families[i]);
+ if (!(mapping->families[i] = wcsdup(families[i]))) goto failed;
mapping->collection = collection;
if (mapping->collection)
IDWriteFontCollection_AddRef(mapping->collection);
- mapping->locale = wcsdup(locale);
+ mapping->locale = wcsdup(locale_name);
mapping->scale = scale;
+ builder->data.count++;
return S_OK;
+
+failed:
+ release_fallback_mapping(mapping);
+ return E_OUTOFMEMORY;
}
static HRESULT WINAPI fontfallbackbuilder_AddMappings(IDWriteFontFallbackBuilder *iface, IDWriteFontFallback *fallback)
More information about the wine-cvs
mailing list