Nikolay Sivov : dwrite: Let freetype face cache manage lifetime of requested file fragments.

Alexandre Julliard julliard at winehq.org
Wed Jan 18 16:34:19 CST 2017


Module: wine
Branch: master
Commit: 274a82b33c2907a2d28a50ba6919711cfabf1b20
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=274a82b33c2907a2d28a50ba6919711cfabf1b20

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jan 18 23:02:41 2017 +0300

dwrite: Let freetype face cache manage lifetime of requested file fragments.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 3179438..9cc157e 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);




More information about the wine-cvs mailing list