From b6881c39bc02918a3ba6c6b64cf9fd570a6a5c9c Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Tue, 22 Sep 2015 14:38:41 -0700 Subject: [PATCH] Improve Cairo bindings to hold a GC reference to Fonts used --- project/src/graphics/cairo/CairoBindings.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/project/src/graphics/cairo/CairoBindings.cpp b/project/src/graphics/cairo/CairoBindings.cpp index 7af22176e..2c22a4fcd 100644 --- a/project/src/graphics/cairo/CairoBindings.cpp +++ b/project/src/graphics/cairo/CairoBindings.cpp @@ -9,6 +9,9 @@ namespace lime { + cairo_user_data_key_t userData; + + void gc_cairo (value handle) { if (!val_is_null (handle)) { @@ -69,6 +72,14 @@ namespace lime { } + void gc_user_data (void* data) { + + AutoGCRoot* reference = (AutoGCRoot*)data; + delete reference; + + } + + void lime_cairo_arc (value handle, double xc, double yc, double radius, double angle1, double angle2) { cairo_arc ((cairo_t*)val_data (handle), xc, yc, radius, angle1, angle2); @@ -231,8 +242,12 @@ namespace lime { value lime_cairo_ft_font_face_create (value face, int flags) { #ifdef LIME_FREETYPE - Font *font = (Font*)val_data (face); + Font* font = (Font*)val_data (face); cairo_font_face_t* cairoFont = cairo_ft_font_face_create_for_ft_face ((FT_Face)font->face, flags); + + AutoGCRoot* fontReference = new AutoGCRoot (face); + cairo_font_face_set_user_data (cairoFont, &userData, fontReference, gc_user_data); + value handle = cffi::alloc_pointer (cairoFont); val_gc (handle, gc_cairo_font_face); return handle;