summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2005-02-03 20:23:19 +0000
committerOwen Taylor <otaylor@src.gnome.org>2005-02-03 20:23:19 +0000
commit7782bba2c87b79bff8fa4e62ed84b95b74574617 (patch)
tree79d989164f0c8ab27e825ef98ef3c47a14c39228 /pango
parentc7e3de50fdaec8436fd78b229bbdf04c6c9271d3 (diff)
downloadpango-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.am1
-rw-r--r--pango/pangocairo-fc.h8
-rw-r--r--pango/pangocairo-fcfont.c498
-rw-r--r--pango/pangocairo-fcfontmap.c22
-rw-r--r--pango/pangocairo-font.c12
-rw-r--r--pango/pangocairo-private.h6
-rw-r--r--pango/pangocairo-render.c3
-rw-r--r--pango/pangofc-fontmap.c77
-rw-r--r--pango/pangofc-fontmap.h5
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);