Module: wine Branch: master Commit: 274a82b33c2907a2d28a50ba6919711cfabf1b20 URL: http://source.winehq.org/git/wine.git/?a=commit;h=274a82b33c2907a2d28a50ba69...
Author: Nikolay Sivov nsivov@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@codeweavers.com Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@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);