Nikolay Sivov : dwrite: Limit to exactly one font file per fontface.

Alexandre Julliard julliard at winehq.org
Tue Mar 9 14:55:17 CST 2021


Module: wine
Branch: master
Commit: 7b540f8bc8114c7cd51c03473307f2c3cf22975d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7b540f8bc8114c7cd51c03473307f2c3cf22975d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Mar  8 11:30:47 2021 +0300

dwrite: Limit to exactly one font file per fontface.

Multiple files only existed in initial API version, formats using multiple
files were never supported, and newer API often operates on a single file
instance.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/dwrite_private.h |  6 ++---
 dlls/dwrite/font.c           | 59 ++++++++++++++------------------------------
 dlls/dwrite/main.c           |  3 +--
 3 files changed, 22 insertions(+), 46 deletions(-)

diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index d28c6cef870..4628a2a3704 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -154,9 +154,8 @@ struct fontface_desc
 {
     IDWriteFactory7 *factory;
     DWRITE_FONT_FACE_TYPE face_type;
-    IDWriteFontFile * const *files;
+    IDWriteFontFile *file;
     IDWriteFontFileStream *stream;
-    UINT32 files_number;
     UINT32 index;
     DWRITE_FONT_SIMULATIONS simulations;
     struct dwrite_font_data *font_data; /* could be NULL when face is created directly with IDWriteFactory::CreateFontFace() */
@@ -243,8 +242,7 @@ struct dwrite_fontface
     LONG refcount;
 
     IDWriteFontFileStream *stream;
-    IDWriteFontFile **files;
-    UINT32 file_count;
+    IDWriteFontFile *file;
     UINT32 index;
 
     IDWriteFactory7 *factory;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c
index 8a5033ab64f..9386e9bec3f 100644
--- a/dlls/dwrite/font.c
+++ b/dlls/dwrite/font.c
@@ -639,14 +639,10 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface)
             IDWriteFontFace5_ReleaseFontTable(iface, fontface->cpal.context);
         if (fontface->colr.context)
             IDWriteFontFace5_ReleaseFontTable(iface, fontface->colr.context);
-        for (i = 0; i < fontface->file_count; i++)
-        {
-            if (fontface->files[i])
-                IDWriteFontFile_Release(fontface->files[i]);
-        }
+        if (fontface->file)
+            IDWriteFontFile_Release(fontface->file);
         if (fontface->stream)
             IDWriteFontFileStream_Release(fontface->stream);
-        heap_free(fontface->files);
         if (fontface->names)
             IDWriteLocalizedStrings_Release(fontface->names);
         if (fontface->family_names)
@@ -683,24 +679,20 @@ static HRESULT WINAPI dwritefontface_GetFiles(IDWriteFontFace5 *iface, UINT32 *n
     IDWriteFontFile **fontfiles)
 {
     struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface);
-    int i;
 
     TRACE("%p, %p, %p.\n", iface, number_of_files, fontfiles);
 
-    if (fontfiles == NULL)
+    if (!fontfiles)
     {
-        *number_of_files = fontface->file_count;
+        *number_of_files = 1;
         return S_OK;
     }
 
-    if (*number_of_files < fontface->file_count)
+    if (!*number_of_files)
         return E_INVALIDARG;
 
-    for (i = 0; i < fontface->file_count; i++)
-    {
-        IDWriteFontFile_AddRef(fontface->files[i]);
-        fontfiles[i] = fontface->files[i];
-    }
+    IDWriteFontFile_AddRef(fontface->file);
+    *fontfiles = fontface->file;
 
     return S_OK;
 }
@@ -1603,7 +1595,7 @@ static HRESULT WINAPI dwritefontface5_GetFontResource(IDWriteFontFace5 *iface, I
 
     TRACE("%p, %p.\n", iface, resource);
 
-    return IDWriteFactory7_CreateFontResource(fontface->factory, fontface->files[0], fontface->index, resource);
+    return IDWriteFactory7_CreateFontResource(fontface->factory, fontface->file, fontface->index, resource);
 }
 
 static BOOL WINAPI dwritefontface5_Equals(IDWriteFontFace5 *iface, IDWriteFontFace *other)
@@ -1619,7 +1611,7 @@ static BOOL WINAPI dwritefontface5_Equals(IDWriteFontFace5 *iface, IDWriteFontFa
 
     return fontface->index == other_face->index &&
             fontface->simulations == other_face->simulations &&
-            is_same_fontfile(fontface->files[0], other_face->files[0]);
+            is_same_fontfile(fontface->file, other_face->file);
 }
 
 static const IDWriteFontFace5Vtbl dwritefontfacevtbl =
@@ -1728,11 +1720,11 @@ static HRESULT WINAPI dwritefontface_reference_CreateFontFaceWithSimulations(IDW
 
     TRACE("%p, %#x, %p.\n", iface, simulations, ret);
 
-    hr = IDWriteFontFile_Analyze(fontface->files[0], &is_supported, &file_type, &face_type, &face_num);
+    hr = IDWriteFontFile_Analyze(fontface->file, &is_supported, &file_type, &face_type, &face_num);
     if (FAILED(hr))
         return hr;
 
-    hr = IDWriteFactory7_CreateFontFace(fontface->factory, face_type, 1, fontface->files, fontface->index,
+    hr = IDWriteFactory7_CreateFontFace(fontface->factory, face_type, 1, &fontface->file, fontface->index,
             simulations, &face);
     if (SUCCEEDED(hr))
     {
@@ -1774,7 +1766,7 @@ static HRESULT WINAPI dwritefontface_reference_GetFontFile(IDWriteFontFaceRefere
 
     TRACE("%p, %p.\n", iface, file);
 
-    *file = fontface->files[0];
+    *file = fontface->file;
     IDWriteFontFile_AddRef(*file);
 
     return S_OK;
@@ -1879,8 +1871,7 @@ static HRESULT get_fontface_from_font(struct dwrite_font *font, IDWriteFontFace5
 
     desc.factory = font->family->collection->factory;
     desc.face_type = data->face_type;
-    desc.files = &data->file;
-    desc.files_number = 1;
+    desc.file = data->file;
     desc.index = data->face_index;
     desc.simulations = data->simulations;
     desc.font_data = data;
@@ -3979,7 +3970,7 @@ static HRESULT init_font_data(const struct fontface_desc *desc, struct dwrite_fo
         return E_OUTOFMEMORY;
 
     data->ref = 1;
-    data->file = desc->files[0];
+    data->file = desc->file;
     data->face_index = desc->index;
     data->face_type = desc->face_type;
     IDWriteFontFile_AddRef(data->file);
@@ -4388,9 +4379,8 @@ HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerat
 
             desc.factory = factory;
             desc.face_type = face_type;
-            desc.files = &file;
+            desc.file = file;
             desc.stream = stream;
-            desc.files_number = 1;
             desc.index = i;
             desc.simulations = DWRITE_FONT_SIMULATIONS_NONE;
             desc.font_data = NULL;
@@ -4729,13 +4719,12 @@ static HRESULT eudc_collection_add_family(IDWriteFactory7 *factory, struct dwrit
         struct dwrite_font_data *font_data;
         struct fontface_desc desc;
 
-        /* alloc and init new font data structure */
+        /* Allocate new font data structure. */
         desc.factory = factory;
         desc.face_type = face_type;
         desc.index = i;
-        desc.files = &file;
+        desc.file = file;
         desc.stream = stream;
-        desc.files_number = 1;
         desc.simulations = DWRITE_FONT_SIMULATIONS_NONE;
         desc.font_data = NULL;
 
@@ -4983,17 +4972,10 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
     if (!fontface)
         return E_OUTOFMEMORY;
 
-    fontface->files = heap_alloc_zero(sizeof(*fontface->files) * desc->files_number);
-    if (!fontface->files) {
-        heap_free(fontface);
-        return E_OUTOFMEMORY;
-    }
-
     fontface->IDWriteFontFace5_iface.lpVtbl = &dwritefontfacevtbl;
     fontface->IDWriteFontFaceReference_iface.lpVtbl = &dwritefontface_reference_vtbl;
     fontface->refcount = 1;
     fontface->type = desc->face_type;
-    fontface->file_count = desc->files_number;
     fontface->vdmx.exists = TRUE;
     fontface->gasp.exists = TRUE;
     fontface->cpal.exists = TRUE;
@@ -5002,11 +4984,8 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
     fontface->simulations = desc->simulations;
     fontface->factory = desc->factory;
     IDWriteFactory7_AddRef(fontface->factory);
-
-    for (i = 0; i < fontface->file_count; i++) {
-        fontface->files[i] = desc->files[i];
-        IDWriteFontFile_AddRef(fontface->files[i]);
-    }
+    fontface->file = desc->file;
+    IDWriteFontFile_AddRef(fontface->file);
     fontface->stream = desc->stream;
     IDWriteFontFileStream_AddRef(fontface->stream);
 
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 864a44936c1..d66a27d7f68 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1033,9 +1033,8 @@ static HRESULT WINAPI dwritefactory_CreateFontFace(IDWriteFactory7 *iface, DWRIT
 
     desc.factory = iface;
     desc.face_type = req_facetype;
-    desc.files = font_files;
+    desc.file = *font_files;
     desc.stream = stream;
-    desc.files_number = files_number;
     desc.index = index;
     desc.simulations = simulations;
     desc.font_data = NULL;




More information about the wine-cvs mailing list