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