diff options
-rw-r--r-- | pango/itemize.c | 11 | ||||
-rw-r--r-- | pango/pango-font-private.h | 22 | ||||
-rw-r--r-- | pango/pangofc-font.c | 40 | ||||
-rw-r--r-- | pango/pangofc-fontmap-private.h | 3 | ||||
-rw-r--r-- | pango/pangofc-fontmap.c | 25 |
5 files changed, 71 insertions, 30 deletions
diff --git a/pango/itemize.c b/pango/itemize.c index 728ad7d9..cf9d6a8f 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -1296,17 +1296,10 @@ variant_supported (PangoItem *item, static PangoVariant get_font_variant (PangoItem *item) { - PangoFontDescription *desc; - PangoVariant variant = PANGO_VARIANT_NORMAL; - if (item->analysis.font) - { - desc = pango_font_describe (item->analysis.font); - variant = pango_font_description_get_variant (desc); - pango_font_description_free (desc); - } + return pango_font_get_variant (item->analysis.font); - return variant; + return PANGO_VARIANT_NORMAL; } static PangoTextTransform diff --git a/pango/pango-font-private.h b/pango/pango-font-private.h index 885e38c1..e95abc7a 100644 --- a/pango/pango-font-private.h +++ b/pango/pango-font-private.h @@ -48,6 +48,7 @@ typedef struct { void (* get_matrix) (PangoFont *font, PangoMatrix *matrix); int (* get_absolute_size) (PangoFont *font); + PangoVariant (* get_variant) (PangoFont *font); } PangoFontClassPrivate; gboolean pango_font_is_hinted (PangoFont *font); @@ -56,6 +57,7 @@ void pango_font_get_scale_factors (PangoFont *font, double *y_scale); void pango_font_get_matrix (PangoFont *font, PangoMatrix *matrix); + static inline int pango_font_get_absolute_size (PangoFont *font) { GTypeClass *klass = (GTypeClass *) PANGO_FONT_GET_CLASS (font); @@ -63,6 +65,26 @@ static inline int pango_font_get_absolute_size (PangoFont *font) return priv->get_absolute_size (font); } +static inline PangoVariant +pango_font_get_variant (PangoFont *font) +{ + GTypeClass *klass = (GTypeClass *) PANGO_FONT_GET_CLASS (font); + PangoFontClassPrivate *priv = g_type_class_get_private (klass, PANGO_TYPE_FONT); + if (priv->get_variant) + return priv->get_variant (font); + else + { + PangoFontDescription *desc; + PangoVariant variant; + + desc = pango_font_describe (font); + variant = pango_font_description_get_variant (desc); + pango_font_description_free (desc); + + return variant; + } +} + G_END_DECLS #endif /* __PANGO_FONT_PRIVATE_H__ */ diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index 9d555a37..053e93cd 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -24,6 +24,7 @@ #include "pango-font-private.h" #include "pangofc-font-private.h" #include "pangofc-fontmap.h" +#include "pangofc-fontmap-private.h" #include "pangofc-private.h" #include "pango-layout.h" #include "pango-impl-utils.h" @@ -78,6 +79,7 @@ static void _pango_fc_font_get_scale_factors (PangoFont *fon static void pango_fc_font_get_matrix (PangoFont *font, PangoMatrix *matrix); static int pango_fc_font_get_absolute_size (PangoFont *font); +static PangoVariant pango_fc_font_get_variant (PangoFont *font); #define PANGO_FC_FONT_LOCK_FACE(font) (PANGO_FC_FONT_GET_CLASS (font)->lock_face (font)) #define PANGO_FC_FONT_UNLOCK_FACE(font) (PANGO_FC_FONT_GET_CLASS (font)->unlock_face (font)) @@ -114,6 +116,7 @@ pango_fc_font_class_init (PangoFcFontClass *class) pclass->get_scale_factors = _pango_fc_font_get_scale_factors; pclass->get_matrix = pango_fc_font_get_matrix; pclass->get_absolute_size = pango_fc_font_get_absolute_size; + pclass->get_variant = pango_fc_font_get_variant; /** * PangoFcFont:pattern: @@ -172,8 +175,8 @@ pango_fc_font_finalize (GObject *object) g_object_unref (fontmap); } - FcPatternDestroy (fcfont->font_pattern); pango_font_description_free (fcfont->description); + FcPatternDestroy (fcfont->font_pattern); if (priv->decoder) _pango_fc_font_set_decoder (fcfont, NULL); @@ -209,9 +212,9 @@ pattern_is_transformed (FcPattern *pattern) static void pango_fc_font_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) + guint prop_id, + const GValue *value, + GParamSpec *pspec) { PangoFcFont *fcfont = PANGO_FC_FONT (object); @@ -219,25 +222,25 @@ pango_fc_font_set_property (GObject *object, { case PROP_PATTERN: { - FcPattern *pattern = g_value_get_pointer (value); + FcPattern *pattern = g_value_get_pointer (value); - g_return_if_fail (pattern != NULL); - g_return_if_fail (fcfont->font_pattern == NULL); + g_return_if_fail (pattern != NULL); + g_return_if_fail (fcfont->font_pattern == NULL); - FcPatternReference (pattern); - fcfont->font_pattern = pattern; - fcfont->description = pango_fc_font_description_from_pattern (pattern, TRUE); - fcfont->is_hinted = pattern_is_hinted (pattern); - fcfont->is_transformed = pattern_is_transformed (pattern); + FcPatternReference (pattern); + fcfont->font_pattern = pattern; + fcfont->description = font_description_from_pattern (pattern, TRUE, TRUE); + fcfont->is_hinted = pattern_is_hinted (pattern); + fcfont->is_transformed = pattern_is_transformed (pattern); } goto set_decoder; case PROP_FONTMAP: { - PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (g_value_get_object (value)); + PangoFcFontMap *fcfontmap = PANGO_FC_FONT_MAP (g_value_get_object (value)); - g_return_if_fail (fcfont->fontmap == NULL); - g_weak_ref_set ((GWeakRef *) &fcfont->fontmap, fcfontmap); + g_return_if_fail (fcfont->fontmap == NULL); + g_weak_ref_set ((GWeakRef *) &fcfont->fontmap, fcfontmap); } goto set_decoder; @@ -314,6 +317,13 @@ pango_fc_font_get_absolute_size (PangoFont *font) return 0; } +static PangoVariant +pango_fc_font_get_variant (PangoFont *font) +{ + PangoFcFont *fcfont = (PangoFcFont *)font; + return pango_font_description_get_variant (fcfont->description); +} + static PangoCoverage * pango_fc_font_get_coverage (PangoFont *font, PangoLanguage *language G_GNUC_UNUSED) diff --git a/pango/pangofc-fontmap-private.h b/pango/pangofc-fontmap-private.h index 68daea6c..42fa7e3d 100644 --- a/pango/pangofc-fontmap-private.h +++ b/pango/pangofc-fontmap-private.h @@ -191,6 +191,9 @@ struct _PangoFcFontMapClass void (*_pango_reserved4) (void); }; +PangoFontDescription *font_description_from_pattern (FcPattern *pattern, + gboolean include_size, + gboolean shallow); G_END_DECLS diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c index e21032f3..51f71cb1 100644 --- a/pango/pangofc-fontmap.c +++ b/pango/pangofc-fontmap.c @@ -2774,6 +2774,14 @@ pango_fc_convert_width_to_pango (int fc_stretch) PangoFontDescription * pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_size) { + return font_description_from_pattern (pattern, include_size, FALSE); +} + +PangoFontDescription * +font_description_from_pattern (FcPattern *pattern, + gboolean include_size, + gboolean shallow) +{ PangoFontDescription *desc; PangoStyle style; PangoWeight weight; @@ -2782,8 +2790,7 @@ pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_siz PangoGravity gravity; PangoVariant variant; gboolean all_caps; - - FcChar8 *s; + const char *s; int i; double d; FcResult res; @@ -2793,7 +2800,10 @@ pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_siz res = FcPatternGetString (pattern, FC_FAMILY, 0, (FcChar8 **) &s); g_assert (res == FcResultMatch); - pango_font_description_set_family (desc, (gchar *)s); + if (shallow) + pango_font_description_set_family_static (desc, s); + else + pango_font_description_set_family (desc, s); if (FcPatternGetInteger (pattern, FC_SLANT, 0, &i) == FcResultMatch) style = pango_fc_convert_slant_to_pango (i); @@ -2821,8 +2831,6 @@ pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_siz for (int i = 0; i < 32; i++) { - const char *s; - if (FcPatternGetString (pattern, FC_FONT_FEATURES, i, (FcChar8 **)&s) == FcResultMatch) { if (strcmp (s, "smcp=1") == 0) @@ -2907,7 +2915,12 @@ pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_siz if (include_size && FcPatternGetString (pattern, FC_FONT_VARIATIONS, 0, (FcChar8 **)&s) == FcResultMatch) { if (s && *s) - pango_font_description_set_variations (desc, (char *)s); + { + if (shallow) + pango_font_description_set_variations_static (desc, s); + else + pango_font_description_set_variations (desc, s); + } } return desc; |