[PATCH] dwrite: Let freetype face cache manage lifetime of requested file fragments
Nikolay Sivov
nsivov at codeweavers.com
Wed Jan 18 14:02:41 CST 2017
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
For https://bugs.winehq.org/show_bug.cgi?id=42243
This affects custom font loaders, for local font loader it's
basically a no-op with current implementation of it,
because ReleaseFileFragment() does not do anything.
Solution is explicitly suggested in cache API documentation.
dlls/dwrite/freetype.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c
index 31794389de..9cc157e122 100644
--- a/dlls/dwrite/freetype.c
+++ b/dlls/dwrite/freetype.c
@@ -93,6 +93,22 @@ MAKE_FUNCPTR(FTC_Manager_LookupSize);
MAKE_FUNCPTR(FTC_Manager_RemoveFaceID);
#undef MAKE_FUNCPTR
+struct face_finalizer_data
+{
+ IDWriteFontFileStream *stream;
+ void *context;
+};
+
+static void face_finalizer(void *object)
+{
+ FT_Face face = object;
+ struct face_finalizer_data *data = (struct face_finalizer_data *)face->generic.data;
+
+ IDWriteFontFileStream_ReleaseFileFragment(data->stream, data->context);
+ IDWriteFontFileStream_Release(data->stream);
+ heap_free(data);
+}
+
static FT_Error face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *face)
{
IDWriteFontFace *fontface = (IDWriteFontFace*)face_id;
@@ -136,7 +152,19 @@ static FT_Error face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointe
index = IDWriteFontFace_GetIndex(fontface);
fterror = pFT_New_Memory_Face(library, data_ptr, data_size, index, face);
- IDWriteFontFileStream_ReleaseFileFragment(stream, context);
+ if (fterror == FT_Err_Ok) {
+ struct face_finalizer_data *data;
+
+ data = heap_alloc(sizeof(*data));
+ data->stream = stream;
+ data->context = context;
+
+ (*face)->generic.data = data;
+ (*face)->generic.finalizer = face_finalizer;
+ return fterror;
+ }
+ else
+ IDWriteFontFileStream_ReleaseFileFragment(stream, context);
fail:
IDWriteFontFileStream_Release(stream);
--
2.11.0
More information about the wine-patches
mailing list