diff options
author | Owen Taylor <otaylor@redhat.com> | 2004-05-28 22:53:24 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2004-05-28 22:53:24 +0000 |
commit | 31e0850c421fcc777c452121eb5c68fcf2ce3cda (patch) | |
tree | 3ff00cfd6e238df998bcf3c1b95fc059582ab1ce /pango/pangofc-fontmap.c | |
parent | 3ef5e7edc246615f45accafca5d83739b14ca66b (diff) | |
download | pango-31e0850c421fcc777c452121eb5c68fcf2ce3cda.tar.gz |
Add PangoMatrix type for affine transforms.
Fri May 28 11:39:39 2004 Owen Taylor <otaylor@redhat.com>
* pango/pango-types.h pango/pango-utils.c: Add PangoMatrix
type for affine transforms.
* configure.in pango.pc.in pango/Makefile.am: Add a -lm
dependency for PangoMatrix operations.
* pango/pango-context.[ch]: Add pango_context_set/get_matrix().
* pango/pangoft2-render.c pango/pangoft2-private.h: Add
code for drawing antialiased transformed rectangles and
squiggly error underlines.
* pango/pangoft2.[ch]: Add pango_ft2_render_transformed(),
pango_ft2_render_layout_subpixel(),
pango_ft2_render_layout_line_subpixel(), implement transformed
rendering.
* pango/pangofc-font.c: Pass any transformation matrix on to
fontconfig when creating the pattern for a PangoFcFont.
Diffstat (limited to 'pango/pangofc-fontmap.c')
-rw-r--r-- | pango/pangofc-fontmap.c | 87 |
1 files changed, 67 insertions, 20 deletions
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index 26129836..5321e587 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -359,7 +359,6 @@ pango_fc_font_map_add (PangoFcFontMap *fcfontmap, g_assert (fcfont->fontmap == NULL); - fcfont->fontmap = g_object_ref (fcfontmap); g_hash_table_insert (priv->fonts, fcfont->font_pattern, fcfont); @@ -588,10 +587,12 @@ pango_fc_make_pattern (const PangoFontDescription *description) static PangoFont * pango_fc_font_map_new_font (PangoFontMap *fontmap, - FcPattern *match) + PangoMatrix *pango_matrix, + FcPattern *match) { PangoFcFontMap *fcfontmap = (PangoFcFontMap *)fontmap; PangoFcFontMapPrivate *priv = fcfontmap->priv; + FcPattern *pattern; PangoFcFont *fcfont; /* Returning NULL here actually violates a contract @@ -604,14 +605,40 @@ pango_fc_font_map_new_font (PangoFontMap *fontmap, return NULL; /* Look up cache */ - fcfont = g_hash_table_lookup (priv->fonts, match); + if (!pango_matrix) + { + fcfont = g_hash_table_lookup (priv->fonts, match); - if (fcfont) - return g_object_ref (fcfont); + if (fcfont) + return g_object_ref (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); - fcfont = PANGO_FC_FONT_MAP_GET_CLASS (fontmap)->new_font (fcfontmap, match); + if (!pango_matrix) + pango_fc_font_map_add (fcfontmap, fcfont); - pango_fc_font_map_add (fcfontmap, fcfont); + if (pango_matrix) + FcPatternDestroy (pattern); + + fcfont->fontmap = g_object_ref (fcfontmap); return (PangoFont *)fcfont; } @@ -736,15 +763,19 @@ pango_fc_font_map_get_patterns (PangoFontMap *fontmap, static PangoFont * pango_fc_font_map_load_font (PangoFontMap *fontmap, - PangoContext *context, - const PangoFontDescription *description) + PangoContext *context, + const PangoFontDescription *description) { PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, description, NULL); if (!patterns) return NULL; if (patterns->n_patterns > 0) - return pango_fc_font_map_new_font (fontmap, patterns->patterns[0]); + { + return pango_fc_font_map_new_font (fontmap, + context ? pango_context_get_matrix (context) : NULL, + patterns->patterns[0]); + } return NULL; } @@ -809,35 +840,51 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap, PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language); PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (fontmap); PangoFcFontMapPrivate *priv = fcfontmap->priv; + PangoFontset *result; + PangoMatrix *matrix; int i; if (!patterns) return NULL; - if (!patterns->fontset) + if (context) + matrix = pango_context_get_matrix (context); + else + matrix = NULL; + + /* We never cache fontsets when a transformation is in place + */ + if (!patterns->fontset || matrix) { PangoFontsetSimple *simple; simple = pango_fontset_simple_new (language); + result = PANGO_FONTSET (simple); for (i = 0; i < patterns->n_patterns; i++) { - PangoFont *font = pango_fc_font_map_new_font (fontmap, patterns->patterns[i]); + PangoFont *font; + + font = pango_fc_font_map_new_font (fontmap, matrix, patterns->patterns[i]); if (font) pango_fontset_simple_append (simple, font); } - - patterns->fontset = PANGO_FONTSET (simple); - g_object_add_weak_pointer (G_OBJECT (patterns->fontset), - (gpointer *)&patterns->fontset); + + if (!matrix) + { + patterns->fontset = PANGO_FONTSET (simple); + g_object_add_weak_pointer (G_OBJECT (patterns->fontset), + (gpointer *)&patterns->fontset); + } } else - g_object_ref (patterns->fontset); + result = g_object_ref (patterns->fontset); - if (!patterns->cache_link || - patterns->cache_link != priv->fontset_cache->head) + if (!matrix && + (!patterns->cache_link || + patterns->cache_link != priv->fontset_cache->head)) pango_fc_font_map_cache_fontset (fcfontmap, patterns); - return patterns->fontset; + return result; } static void |