diff options
author | Owen Taylor <otaylor@redhat.com> | 2005-02-03 20:23:19 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2005-02-03 20:23:19 +0000 |
commit | 7782bba2c87b79bff8fa4e62ed84b95b74574617 (patch) | |
tree | 79d989164f0c8ab27e825ef98ef3c47a14c39228 /pango | |
parent | c7e3de50fdaec8436fd78b229bbdf04c6c9271d3 (diff) | |
download | pango-7782bba2c87b79bff8fa4e62ed84b95b74574617.tar.gz |
Open the file with mode "wb", include cairo-png.h.
2005-02-03 Owen Taylor <otaylor@redhat.com>
* examples/cairosimple.c: Open the file with mode "wb", include
cairo-png.h.
* examples/xftview.c examples/cairoview.c: Set WM_NORMAL_HINTS to avoid
triggering a metacity bug.
* examples/cairoview.c: Include cairo-xlib.h.
* configure.in: Add checks for the Win32 Cairo backend. (not committing
the code yet).
* examples/Makefile.am pango/Makefile.am: add CAIRO_CFLAGS.
* pango/pangocairo-fc.h pango/pangocairo-fcfont.c
pango/pangocairo-fcfontmap.c pango/pangofc-fontmap.[ch]: Rework
Cairo/Fontconfig backend to use the current Cairo API. Make
some PangoFcFontMap changes to enable that.
* pango/pango/pangocairo-private.h pango/pangocairo-render.c:
Update for cairo_font_t changes.
Diffstat (limited to 'pango')
-rw-r--r-- | pango/Makefile.am | 1 | ||||
-rw-r--r-- | pango/pangocairo-fc.h | 8 | ||||
-rw-r--r-- | pango/pangocairo-fcfont.c | 498 | ||||
-rw-r--r-- | pango/pangocairo-fcfontmap.c | 22 | ||||
-rw-r--r-- | pango/pangocairo-font.c | 12 | ||||
-rw-r--r-- | pango/pangocairo-private.h | 6 | ||||
-rw-r--r-- | pango/pangocairo-render.c | 3 | ||||
-rw-r--r-- | pango/pangofc-fontmap.c | 77 | ||||
-rw-r--r-- | pango/pangofc-fontmap.h | 5 |
9 files changed, 273 insertions, 359 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am index 7142b8d3..f9e9697f 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -23,6 +23,7 @@ INCLUDES = \ $(PANGO_DEBUG_FLAGS) \ $(GLIB_CFLAGS) \ $(XFT_CFLAGS) \ + $(CAIRO_CFLAGS) \ $(FREETYPE_CFLAGS) \ $(X_CFLAGS) \ -I$(top_srcdir) diff --git a/pango/pangocairo-fc.h b/pango/pangocairo-fc.h index 22fd1b60..8d978cb1 100644 --- a/pango/pangocairo-fc.h +++ b/pango/pangocairo-fc.h @@ -46,8 +46,16 @@ struct _PangoCairoFcFontMap GType pango_cairo_fc_font_map_get_type (void); PangoFcFont *_pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap, + PangoContext *context, FcPattern *pattern); +gboolean _pango_cairo_get_render_key (PangoCairoFcFontMap *cffontmap, + PangoContext *context, + const PangoFontDescription *desc, + int *xsize, + int *ysize, + guint *flags); + G_END_DECLS #endif /* __PANGOCAIRO_FC_H__ */ diff --git a/pango/pangocairo-fcfont.c b/pango/pangocairo-fcfont.c index b8f4a32b..8334a385 100644 --- a/pango/pangocairo-fcfont.c +++ b/pango/pangocairo-fcfont.c @@ -21,6 +21,7 @@ #include "config.h" +#include <math.h> #include <stdlib.h> #include "pango-fontmap.h" @@ -43,13 +44,9 @@ struct _PangoCairoFcFont { PangoFcFont font; - FT_Face face; cairo_font_t *cairo_font; - - int load_flags; - gboolean have_size; - - GHashTable *glyph_info; + cairo_matrix_t *font_matrix; + cairo_matrix_t *total_matrix; }; struct _PangoCairoFcFontClass @@ -63,169 +60,30 @@ GType pango_cairo_fc_font_get_type (void); * Utility functions * *******************************/ -static FT_Face -load_face (PangoCairoFcFont *cffont) -{ - PangoFcFont *fcfont = PANGO_FC_FONT (cffont); - FT_Library library = PANGO_CAIRO_FC_FONT_MAP (fcfont->fontmap)->library; - FT_Error error; - FcPattern *pattern; - FcChar8 *filename; - FcBool antialias, hinting, autohint; - FT_Face face = NULL; - int id; - - pattern = fcfont->font_pattern; - - cffont->load_flags = 0; - - /* disable antialiasing if requested */ - if (FcPatternGetBool (pattern, - FC_ANTIALIAS, 0, &antialias) != FcResultMatch) - antialias = FcTrue; - - if (antialias) - cffont->load_flags |= FT_LOAD_NO_BITMAP; - else - cffont->load_flags |= FT_LOAD_TARGET_MONO; - - /* disable hinting if requested */ - if (FcPatternGetBool (pattern, - FC_HINTING, 0, &hinting) != FcResultMatch) - hinting = FcTrue; - - if (!hinting) - cffont->load_flags |= FT_LOAD_NO_HINTING; - - /* force autohinting if requested */ - if (FcPatternGetBool (pattern, - FC_AUTOHINT, 0, &autohint) != FcResultMatch) - autohint = FcFalse; - - if (autohint) - cffont->load_flags |= FT_LOAD_FORCE_AUTOHINT; - - if (FcPatternGetString (pattern, FC_FILE, 0, &filename) != FcResultMatch) - goto bail; - - if (FcPatternGetInteger (pattern, FC_INDEX, 0, &id) != FcResultMatch) - goto bail; - - error = FT_New_Face (library, (char *) filename, id, &face); - - bail: - return face; -} - -static FT_Face -load_fallback_face (PangoCairoFcFont *cffont) -{ - PangoFcFont *fcfont = PANGO_FC_FONT (cffont); - FT_Library library = PANGO_CAIRO_FC_FONT_MAP (fcfont->fontmap)->library; - FcPattern *sans; - FcPattern *matched; - FcResult result; - FT_Error error; - FcChar8 *filename = NULL; - FT_Face face = NULL; - int id; - - /* FIXME: pass in a size in case Sans is bitmap */ - sans = FcPatternBuild (NULL, - FC_FAMILY, FcTypeString, "sans", - NULL); - - matched = FcFontMatch (NULL, sans, &result); - - if (FcPatternGetString (matched, FC_FILE, 0, &filename) != FcResultMatch) - goto bail; - - if (FcPatternGetInteger (matched, FC_INDEX, 0, &id) != FcResultMatch) - goto bail; - - face = NULL; - error = FT_New_Face (library, (char *) filename, id, &face); - - if (error) - { - bail: - g_warning ("Unable to open font file %s for Sans, exiting", filename); - exit (1); - } - - FcPatternDestroy (sans); - FcPatternDestroy (matched); - - return face; -} - static cairo_font_t * -get_cairo_font (PangoCairoFcFont *cffont) +pango_cairo_fc_font_get_cairo_font (PangoCairoFont *font) { + PangoCairoFcFont *cffont = PANGO_CAIRO_FC_FONT (font); PangoFcFont *fcfont = PANGO_FC_FONT (cffont); if (cffont->cairo_font == NULL) { - FT_Face face = load_face (cffont); + cffont->cairo_font = cairo_ft_font_create (fcfont->font_pattern, cffont->total_matrix); - if (face) - cffont->cairo_font = cairo_ft_font_create_for_ft_face (face); - + /* Failure of the above should only occur for out of memory, + * we can't proceed at that point + */ if (!cffont->cairo_font) - { - gchar *name = pango_font_description_to_string (fcfont->description); - g_warning ("Cannot open font file for font %s, trying Sans", name); - g_free (name); - - if (face) - FT_Done_Face (face); - - face = load_fallback_face (cffont); - - if (face) - cffont->cairo_font = cairo_ft_font_create_for_ft_face (face); - - if (!cffont->cairo_font) - { - g_warning ("Unable create Cairo font for Sans, exiting"); - exit (1); - } - } - - cffont->face = face; + g_error ("Unable create Cairo font"); } return cffont->cairo_font; } static void -make_current (PangoCairoFcFont *cffont, - cairo_t *cr) -{ - PangoFcFont *fcfont = PANGO_FC_FONT (cffont); - double scale; - - if (pango_font_description_get_size_is_absolute (fcfont->description)) - scale = pango_font_description_get_size (fcfont->description); - else - scale = (PANGO_CAIRO_FC_FONT_MAP (fcfont->fontmap)->dpi * - pango_font_description_get_size (fcfont->description)) / (PANGO_SCALE * 72.); - - cairo_set_font (cr, get_cairo_font (cffont)); - cairo_scale_font (cr, scale); -} - -static void -pango_cairo_fc_font_make_current (PangoCairoFont *font, - cairo_t *cr) -{ - make_current (PANGO_CAIRO_FC_FONT (font), cr); -} - -static void cairo_font_iface_init (PangoCairoFontIface *iface) { - iface->make_current = pango_cairo_fc_font_make_current; + iface->get_cairo_font = pango_cairo_fc_font_get_cairo_font; } G_DEFINE_TYPE_WITH_CODE (PangoCairoFcFont, pango_cairo_fc_font, PANGO_TYPE_FC_FONT, @@ -241,77 +99,54 @@ pango_cairo_fc_font_finalize (GObject *object) PangoCairoFcFont *cffont = PANGO_CAIRO_FC_FONT (object); if (cffont->cairo_font) - { - cairo_font_destroy (cffont->cairo_font); - cffont->cairo_font = NULL; - - FT_Done_Face (cffont->face); - cffont->face = NULL; - } + cairo_font_destroy (cffont->cairo_font); - if (cffont->glyph_info) - g_hash_table_destroy (cffont->glyph_info); + cairo_matrix_destroy (cffont->total_matrix); + cairo_matrix_destroy (cffont->font_matrix); G_OBJECT_CLASS (pango_cairo_fc_font_parent_class)->finalize (object); } -static cairo_t * -get_temporary_context (PangoCairoFcFont *cffont) -{ - PangoFcFont *fcfont = PANGO_FC_FONT (cffont); - FcMatrix *fc_matrix; - cairo_t *cr; - - cr = cairo_create (); - - if (FcPatternGetMatrix (fcfont->font_pattern, - FC_MATRIX, 0, &fc_matrix) == FcResultMatch) - { - cairo_matrix_t *cairo_matrix = cairo_matrix_create (); - cairo_matrix_set_affine (cairo_matrix, - fc_matrix->xx, fc_matrix->yx, - fc_matrix->xy, fc_matrix->yy, - 0, 0); - cairo_set_matrix (cr, cairo_matrix); - cairo_matrix_destroy (cairo_matrix); - } - - make_current (cffont, cr); - - return cr; -} - static void get_ascent_descent (PangoCairoFcFont *cffont, int *ascent, int *descent) { + PangoFcFont *fcfont = PANGO_FC_FONT (cffont); + FT_Face face; + + face = pango_fc_font_lock_face (fcfont); + /* This is complicated in general (see pangofc-font.c:get_face_metrics(), * but simple for hinted, untransformed fonts. cairo_glyph_extents() will * have set up the right size on the font as a side-effect. */ - *descent = - PANGO_UNITS_26_6 (cffont->face->size->metrics.descender); - *ascent = PANGO_UNITS_26_6 (cffont->face->size->metrics.ascender); + *descent = - PANGO_UNITS_26_6 (face->size->metrics.descender); + *ascent = PANGO_UNITS_26_6 (face->size->metrics.ascender); + + pango_fc_font_unlock_face (fcfont); } static void -get_glyph_extents_cairo (PangoFcFont *fcfont, - PangoGlyph glyph, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) +pango_cairo_fc_font_get_glyph_extents (PangoFont *font, + PangoGlyph glyph, + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { - PangoCairoFcFont *cffont = PANGO_CAIRO_FC_FONT (fcfont); + PangoCairoFcFont *cffont = PANGO_CAIRO_FC_FONT (font); + cairo_font_t *cairo_font; cairo_text_extents_t extents; cairo_glyph_t cairo_glyph; - cairo_t *cr; + + cairo_font = pango_cairo_fc_font_get_cairo_font (PANGO_CAIRO_FONT (font)); cairo_glyph.index = glyph; cairo_glyph.x = 0; cairo_glyph.y = 0; - - cr = get_temporary_context (cffont); - cairo_glyph_extents (cr, &cairo_glyph, 1, &extents); - cairo_destroy (cr); + + cairo_font_glyph_extents (cairo_font, + cffont->font_matrix, + &cairo_glyph, 1, &extents); if (ink_rect) { @@ -334,117 +169,16 @@ get_glyph_extents_cairo (PangoFcFont *fcfont, } } -typedef struct -{ - PangoRectangle ink_rect; - PangoRectangle logical_rect; -} Extents; - -static void -get_glyph_extents_raw (PangoCairoFcFont *cffont, - PangoGlyph glyph, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) -{ - Extents *extents; - - if (!cffont->glyph_info) - cffont->glyph_info = g_hash_table_new_full (NULL, NULL, - NULL, (GDestroyNotify)g_free); - - extents = g_hash_table_lookup (cffont->glyph_info, - GUINT_TO_POINTER (glyph)); - - if (!extents) - { - extents = g_new (Extents, 1); - - pango_fc_font_get_raw_extents (PANGO_FC_FONT (cffont), - FT_LOAD_NO_BITMAP | FT_LOAD_NO_HINTING, - glyph, - &extents->ink_rect, - &extents->logical_rect); - - g_hash_table_insert (cffont->glyph_info, - GUINT_TO_POINTER (glyph), - extents); - } - - if (ink_rect) - *ink_rect = extents->ink_rect; - - if (logical_rect) - *logical_rect = extents->logical_rect; -} - -static void -pango_cairo_fc_font_get_glyph_extents (PangoFont *font, - PangoGlyph glyph, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) -{ - PangoCairoFcFont *cffont = PANGO_CAIRO_FC_FONT (font); - PangoFcFont *fcfont = PANGO_FC_FONT (font); - - if (!fcfont->fontmap) /* Display closed */ - goto fallback; - - if (glyph == (PangoGlyph)-1) - glyph = 0; - - if (glyph) - { - if (!fcfont->is_transformed && fcfont->is_hinted) - get_glyph_extents_cairo (fcfont, glyph, ink_rect, logical_rect); - else - get_glyph_extents_raw (cffont, glyph, ink_rect, logical_rect); - } - else - { - fallback: - - if (ink_rect) - { - ink_rect->x = 0; - ink_rect->width = 0; - ink_rect->y = 0; - ink_rect->height = 0; - } - if (logical_rect) - { - logical_rect->x = 0; - logical_rect->width = 0; - logical_rect->y = 0; - logical_rect->height = 0; - } - } -} - static FT_Face pango_cairo_fc_font_lock_face (PangoFcFont *font) { - PangoCairoFcFont *cffont = PANGO_CAIRO_FC_FONT (font); - - /* Horrible hack, we need the font's face to be sized when - * locked, but sizing is only done as a side-effect - */ - if (!cffont->have_size) - { - cairo_t *cr = get_temporary_context (cffont); - cairo_font_extents_t extents; - - cairo_current_font_extents (cr, &extents); - cairo_destroy (cr); - - cffont->have_size = TRUE; - } - - return cairo_ft_font_face (cffont->cairo_font); + return cairo_ft_font_lock_face (pango_cairo_fc_font_get_cairo_font (PANGO_CAIRO_FONT (font))); } static void pango_cairo_fc_font_unlock_face (PangoFcFont *font) { + cairo_ft_font_unlock_face (pango_cairo_fc_font_get_cairo_font (PANGO_CAIRO_FONT (font))); } static PangoGlyph @@ -462,9 +196,6 @@ pango_cairo_fc_font_shutdown (PangoFcFont *fcfont) { cairo_font_destroy (cffont->cairo_font); cffont->cairo_font = NULL; - - FT_Done_Face (cffont->face); - cffont->face = NULL; } } @@ -494,15 +225,162 @@ pango_cairo_fc_font_init (PangoCairoFcFont *cffont) * Private API * ********************/ +static double +transformed_length (const PangoMatrix *matrix, + double dx, + double dy) +{ + double tx = (dx * matrix->xx + dy * matrix->xy); + double ty = (dx * matrix->yx + dy * matrix->yy); + + return sqrt (tx * tx + ty * ty); +} + +/* Adapted from cairo_matrix.c:_cairo_matrix_compute_scale_factors. + */ +static void +compute_scale_factors (const PangoMatrix *matrix, + double *sx, + double *sy) +{ + double det; + + det = matrix->xx * matrix->yy - matrix->xy * matrix->xx; + + if (det == 0) + *sx = *sy = 0; + else + { + double major, minor; + + major = transformed_length (matrix, 1, 0); + /* + * ignore mirroring + */ + if (det < 0) + det = -det; + if (major) + minor = det / major; + else + minor = 0.0; + + *sx = major; + *sy = minor; + } +} + +gboolean +_pango_cairo_fc_get_render_key (PangoCairoFcFontMap *cffontmap, + PangoContext *context, + const PangoFontDescription *desc, + int *xsize, + int *ysize, + guint *flags) +{ + const PangoMatrix *matrix; + double xscale, yscale; + double size; + + matrix = pango_context_get_matrix (context); + if (matrix) + { + compute_scale_factors (matrix, &xscale, &yscale); + } + else + { + xscale = 1.; + yscale = 1.; + } + + if (pango_font_description_get_size_is_absolute (desc)) + size = pango_font_description_get_size (desc); + else + size = cffontmap->dpi * pango_font_description_get_size (desc) / 72.; + + *xsize = (int) (xscale * size + 0.5); + *ysize = (int) (xscale * size + 0.5); + + *flags = 0; + + if (matrix) + { + if (xscale == 0. && yscale == 0.) + return FALSE; + else + { + return (matrix->yx / xscale < 1. / 65536. && + matrix->xy / yscale < 1. / 65536. && + matrix->xx > 0 && + matrix->yy > 0); + } + } + else + return TRUE; +} + PangoFcFont * _pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap, + PangoContext *context, FcPattern *pattern) { + PangoCairoFcFont *cffont; + FcResult result; + const PangoMatrix *pango_ctm; + FcMatrix *fc_matrix; + double pixel_size; + g_return_val_if_fail (PANGO_IS_CAIRO_FC_FONT_MAP (cffontmap), NULL); g_return_val_if_fail (pattern != NULL, NULL); - return g_object_new (PANGO_TYPE_CAIRO_FC_FONT, - "pattern", pattern, - NULL); -} + cffont = g_object_new (PANGO_TYPE_CAIRO_FC_FONT, + "pattern", pattern, + NULL); + + cffont->font_matrix = cairo_matrix_create (); + if (FcPatternGetMatrix (pattern, + FC_MATRIX, 0, &fc_matrix) == FcResultMatch) + { + cairo_matrix_t *tmp_matrix; + + tmp_matrix = cairo_matrix_create (); + cairo_matrix_set_affine (tmp_matrix, + fc_matrix->xx, + - fc_matrix->yx, + - fc_matrix->xy, + fc_matrix->yy, + 0., 0.); + + cairo_matrix_multiply (cffont->font_matrix, + cffont->font_matrix, tmp_matrix); + cairo_matrix_destroy (tmp_matrix); + } + + result = FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &pixel_size); + g_assert (result == FcResultMatch); + + cairo_matrix_scale (cffont->font_matrix, pixel_size, pixel_size); + + cffont->total_matrix = cairo_matrix_create (); + + pango_ctm = pango_context_get_matrix (context); + if (pango_ctm) + { + cairo_matrix_t *ctm; + + ctm = cairo_matrix_create (); + cairo_matrix_set_affine (ctm, + pango_ctm->xx, + pango_ctm->yx, + pango_ctm->xy, + pango_ctm->yy, + 0., 0.); + + cairo_matrix_multiply (cffont->total_matrix, cffont->font_matrix, ctm); + cairo_matrix_destroy (ctm); + } + else + cairo_matrix_copy (cffont->total_matrix, cffont->font_matrix); + + return PANGO_FC_FONT (cffont); +} diff --git a/pango/pangocairo-fcfontmap.c b/pango/pangocairo-fcfontmap.c index 0d05c422..e05fd279 100644 --- a/pango/pangocairo-fcfontmap.c +++ b/pango/pangocairo-fcfontmap.c @@ -99,11 +99,24 @@ pango_cairo_fc_font_map_default_substitute (PangoFcFontMap *fcfontmap, FcDefaultSubstitute (pattern); } +static gboolean +pango_cairo_fc_font_map_get_render_key (PangoFcFontMap *fcfontmap, + PangoContext *context, + const PangoFontDescription *desc, + int *xsize, + int *ysize, + guint *flags) +{ + return _pango_cairo_fc_get_render_key (PANGO_CAIRO_FC_FONT_MAP (fcfontmap), + context, desc, xsize, ysize, flags); +} + static PangoFcFont * -pango_cairo_fc_font_map_new_font (PangoFcFontMap *fcfontmap, - FcPattern *pattern) +pango_cairo_fc_font_map_create_font (PangoFcFontMap *fcfontmap, + PangoContext *context, + FcPattern *pattern) { - return _pango_cairo_fc_font_new (PANGO_CAIRO_FC_FONT_MAP (fcfontmap), pattern); + return _pango_cairo_fc_font_new (PANGO_CAIRO_FC_FONT_MAP (fcfontmap), context, pattern); } static void @@ -114,7 +127,8 @@ pango_cairo_fc_font_map_class_init (PangoCairoFcFontMapClass *class) gobject_class->finalize = pango_cairo_fc_font_map_finalize; fcfontmap_class->default_substitute = pango_cairo_fc_font_map_default_substitute; - fcfontmap_class->new_font = pango_cairo_fc_font_map_new_font; + fcfontmap_class->get_render_key = pango_cairo_fc_font_map_get_render_key; + fcfontmap_class->create_font = pango_cairo_fc_font_map_create_font; } static void diff --git a/pango/pangocairo-font.c b/pango/pangocairo-font.c index 7aae83ec..756e1044 100644 --- a/pango/pangocairo-font.c +++ b/pango/pangocairo-font.c @@ -55,15 +55,13 @@ pango_cairo_font_get_type (void) /** * _pango_cairo_font_get_cairo_font: * @font: a #PangoCairoFont - * @cr: a #CairoConext * - * Install the font and size of @font onto @cr + * Get the cairo_font_t for a PangoCairoFont. **/ -void -_pango_cairo_font_make_current (PangoCairoFont *font, - cairo_t *cr) +cairo_font_t * +_pango_cairo_font_get_cairo_font (PangoCairoFont *font) { - g_return_if_fail (PANGO_IS_CAIRO_FONT (font)); + g_return_val_if_fail (PANGO_IS_CAIRO_FONT (font), NULL); - return (* PANGO_CAIRO_FONT_GET_IFACE (font)->make_current) (font, cr); + return (* PANGO_CAIRO_FONT_GET_IFACE (font)->get_cairo_font) (font); } diff --git a/pango/pangocairo-private.h b/pango/pangocairo-private.h index 64e9a4d9..b964d7f4 100644 --- a/pango/pangocairo-private.h +++ b/pango/pangocairo-private.h @@ -56,14 +56,12 @@ struct _PangoCairoFontIface { GTypeInterface g_iface; - void (*make_current) (PangoCairoFont *font, - cairo_t *cr); + cairo_font_t *(*get_cairo_font) (PangoCairoFont *font); }; GType pango_cairo_font_get_type (void); -void _pango_cairo_font_make_current (PangoCairoFont *font, - cairo_t *cr); +cairo_font_t *_pango_cairo_font_get_cairo_font (PangoCairoFont *font); #define PANGO_TYPE_CAIRO_RENDERER (pango_cairo_renderer_get_type()) #define PANGO_CAIRO_RENDERER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_CAIRO_RENDERER, PangoCairoRenderer)) diff --git a/pango/pangocairo-render.c b/pango/pangocairo-render.c index 305a5e08..5264131d 100644 --- a/pango/pangocairo-render.c +++ b/pango/pangocairo-render.c @@ -91,7 +91,8 @@ pango_cairo_renderer_draw_glyphs (PangoRenderer *renderer, x_position += gi->geometry.width; } - _pango_cairo_font_make_current (PANGO_CAIRO_FONT (font), crenderer->cr); + cairo_set_font (crenderer->cr, + _pango_cairo_font_get_cairo_font (PANGO_CAIRO_FONT (font))); cairo_show_glyphs (crenderer->cr, cairo_glyphs, glyphs->num_glyphs); if (glyphs->num_glyphs > MAX_STACK) diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 9dad20b9..efbf284c 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -683,10 +683,12 @@ pango_fc_make_pattern (const PangoFontDescription *description) } static PangoFont * -pango_fc_font_map_new_font (PangoFontMap *fontmap, - const PangoMatrix *pango_matrix, - FcPattern *match) +pango_fc_font_map_new_font (PangoFontMap *fontmap, + PangoContext *context, + FcPattern *match, + gboolean cache) { + PangoFcFontMapClass *class; PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap; PangoFcFontMapPrivate *priv = fcfontmap->priv; FcPattern *pattern; @@ -703,7 +705,7 @@ pango_fc_font_map_new_font (PangoFontMap *fontmap, return NULL; /* Look up cache */ - if (!pango_matrix) + if (cache) { fcfont = g_hash_table_lookup (priv->fonts, match); @@ -711,30 +713,48 @@ pango_fc_font_map_new_font (PangoFontMap *fontmap, return g_object_ref (fcfont); } - if (pango_matrix) - { - FcMatrix fc_matrix; + class = PANGO_FC_FONT_MAP_GET_CLASS (fontmap); - /* FontConfig has the Y axis pointing up, Pango, down. - */ - fc_matrix.xx = pango_matrix->xx; - fc_matrix.xy = - pango_matrix->xy; - fc_matrix.yx = - pango_matrix->yx; - fc_matrix.yy = pango_matrix->yy; - - pattern = FcPatternDuplicate (match); - FcPatternAddMatrix (pattern, FC_MATRIX, &fc_matrix); + if (class->create_font) + { + fcfont = PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->create_font (fcfontmap, + context, + match); } else - pattern = match; + { + const PangoMatrix *pango_matrix; - fcfont = PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->new_font (fcfontmap, pattern); + if (context) + pango_matrix = pango_context_get_matrix (context); + else + pango_matrix = NULL; - if (!pango_matrix) - pango_fc_font_map_add (fcfontmap, fcfont); + if (pango_matrix) + { + FcMatrix fc_matrix; + + /* FontConfig has the Y axis pointing up, Pango, down. + */ + fc_matrix.xx = pango_matrix->xx; + fc_matrix.xy = - pango_matrix->xy; + fc_matrix.yx = - pango_matrix->yx; + fc_matrix.yy = pango_matrix->yy; + + pattern = FcPatternDuplicate (match); + FcPatternAddMatrix (pattern, FC_MATRIX, &fc_matrix); + } + else + pattern = match; + + fcfont = PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->new_font (fcfontmap, pattern); - if (pango_matrix) - FcPatternDestroy (pattern); + if (pango_matrix) + FcPatternDestroy (pattern); + } + + if (cache) + pango_fc_font_map_add (fcfontmap, fcfont); fcfont->fontmap = g_object_ref (fcfontmap); @@ -956,9 +976,8 @@ pango_fc_font_map_load_font (PangoFontMap *fontmap, if (patterns->n_patterns > 0) { - return pango_fc_font_map_new_font (fontmap, - context ? pango_context_get_matrix (context) : NULL, - patterns->patterns[0]); + return pango_fc_font_map_new_font (fontmap, context, + patterns->patterns[0], FALSE); } return NULL; @@ -1034,20 +1053,14 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap, if (!patterns->fontset || !cache) { PangoFontsetSimple *simple; - const PangoMatrix *matrix; simple = pango_fontset_simple_new (language); result = PANGO_FONTSET (simple); - if (context) - matrix = pango_context_get_matrix (context); - else - matrix = NULL; - for (i = 0; i < patterns->n_patterns; i++) { PangoFont *font; - font = pango_fc_font_map_new_font (fontmap, matrix, patterns->patterns[i]); + font = pango_fc_font_map_new_font (fontmap, context, patterns->patterns[i], cache); if (font) pango_fontset_simple_append (simple, font); } diff --git a/pango/pangofc-fontmap.h b/pango/pangofc-fontmap.h index 9302a701..925a1467 100644 --- a/pango/pangofc-fontmap.h +++ b/pango/pangofc-fontmap.h @@ -84,6 +84,7 @@ struct _PangoFcFontMapClass /*< public >*/ void (*default_substitute) (PangoFcFontMap *fontmap, FcPattern *pattern); + /* Deprecated in favor of create_font */ PangoFcFont *(*new_font) (PangoFcFontMap *fontmap, FcPattern *pattern); @@ -93,12 +94,14 @@ struct _PangoFcFontMapClass int *xsize, int *ysize, guint *flags); + PangoFcFont *(*create_font) (PangoFcFontMap *fontmap, + PangoContext *context, + FcPattern *pattern); /*< private >*/ /* Padding for future expansion */ void (*_pango_reserved1) (void); void (*_pango_reserved2) (void); - void (*_pango_reserved3) (void); }; PangoContext * pango_fc_font_map_create_context (PangoFcFontMap *fcfontmap); |