diff --git a/gfx/cairo/cairo/src/cairo-atsui-font.c b/gfx/cairo/cairo/src/cairo-atsui-font.c index 1de5e7ec348..b8ea4443cfa 100644 --- a/gfx/cairo/cairo/src/cairo-atsui-font.c +++ b/gfx/cairo/cairo/src/cairo-atsui-font.c @@ -90,6 +90,7 @@ struct _cairo_atsui_font { Fixed size; CGAffineTransform font_matrix; + CGFontRef cgfref; }; struct _cairo_atsui_font_face { @@ -281,6 +282,8 @@ _cairo_atsui_font_create_scaled (cairo_font_face_t *font_face, status = _cairo_atsui_font_set_metrics (font); + font->cgfref = NULL; + FAIL: if (status) { cairo_scaled_font_destroy (&font->base); @@ -408,6 +411,9 @@ _cairo_atsui_font_fini(void *abstract_font) ATSUDisposeStyle(font->style); if (font->unscaled_style) ATSUDisposeStyle(font->unscaled_style); + if (font->cgfref) + CGFontRelease(font->cgfref); + } static GlyphID @@ -861,6 +867,19 @@ _cairo_atsui_scaled_font_get_atsu_font_id (cairo_scaled_font_t *sfont) return afont->fontID; } +CGFontRef +_cairo_atsui_scaled_font_get_cg_font_ref (cairo_scaled_font_t *sfont) +{ + cairo_atsui_font_t *afont = (cairo_atsui_font_t *) sfont; + + if (!afont->cgfref) { + ATSFontRef atsfref = FMGetATSFontRefFromFont (afont->fontID); + afont->cgfref = CGFontCreateWithPlatformFont (&atsfref); + } + return afont->cgfref; +} + + static cairo_int_status_t _cairo_atsui_load_truetype_table (void *abstract_font, unsigned long tag, diff --git a/gfx/cairo/cairo/src/cairo-quartz-private.h b/gfx/cairo/cairo/src/cairo-quartz-private.h index 5e46e8d4941..52a3d7fb667 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-private.h +++ b/gfx/cairo/cairo/src/cairo-quartz-private.h @@ -72,6 +72,9 @@ _cairo_atsui_scaled_font_get_atsu_style (cairo_scaled_font_t *sfont); ATSUFontID _cairo_atsui_scaled_font_get_atsu_font_id (cairo_scaled_font_t *sfont); + +CGFontRef +_cairo_atsui_scaled_font_get_cg_font_ref (cairo_scaled_font_t *sfont); #endif /* CAIRO_HAS_ATSUI_FONT */ #endif /* CAIRO_QUARTZ_PRIVATE_H */ diff --git a/gfx/cairo/cairo/src/cairo-quartz-surface.c b/gfx/cairo/cairo/src/cairo-quartz-surface.c index 8488f384a92..2b6025a86a9 100644 --- a/gfx/cairo/cairo/src/cairo-quartz-surface.c +++ b/gfx/cairo/cairo/src/cairo-quartz-surface.c @@ -1369,9 +1369,6 @@ _cairo_quartz_surface_show_glyphs (void *abstract_surface, int num_glyphs, cairo_scaled_font_t *scaled_font) { - ATSUFontID fid; - ATSFontRef atsfref; - CGFontRef cgfref; CGAffineTransform cairoTextTransform, textTransform, ctm; // XXXtodo/perf: stack storage for glyphs/sizes #define STATIC_BUF_SIZE 64 @@ -1410,12 +1407,9 @@ _cairo_quartz_surface_show_glyphs (void *abstract_surface, CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); - fid = _cairo_atsui_scaled_font_get_atsu_font_id (scaled_font); - atsfref = FMGetATSFontRefFromFont (fid); - cgfref = CGFontCreateWithPlatformFont (&atsfref); - + /* this doesn't addref */ + CGFontRef cgfref = _cairo_atsui_scaled_font_get_cg_font_ref (scaled_font); CGContextSetFont (surface->cgContext, cgfref); - CGFontRelease (cgfref); /* So this should include the size; I don't know if I need to extract the * size from this and call CGContextSetFontSize.. will I get crappy hinting