mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-04 10:39:07 +02:00
[quartz] Store the CGFontRef and reuse it for rendering
Previously the CGFontRef was recreated each time in show_glyphs; this caused the font to get re-embedded in any PDF files that were being generated through Quartz.
This commit is contained in:
parent
968eaf3c44
commit
57c2b75c22
3 changed files with 23 additions and 8 deletions
|
|
@ -87,6 +87,7 @@ struct _cairo_atsui_font {
|
|||
|
||||
Fixed size;
|
||||
CGAffineTransform font_matrix;
|
||||
CGFontRef cgfref;
|
||||
};
|
||||
|
||||
struct _cairo_atsui_font_face {
|
||||
|
|
@ -299,6 +300,7 @@ _cairo_atsui_font_create_scaled (cairo_font_face_t *font_face,
|
|||
|
||||
status = _cairo_atsui_font_set_metrics (font);
|
||||
|
||||
font->cgfref = 0;
|
||||
FAIL:
|
||||
if (status) {
|
||||
if (font) {
|
||||
|
|
@ -447,6 +449,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
|
||||
|
|
@ -942,6 +947,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,
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -1524,9 +1524,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
|
||||
|
|
@ -1568,12 +1565,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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue