summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-08-28 13:34:48 +0000
committerMatthias Clasen <mclasen@redhat.com>2022-08-28 13:34:48 +0000
commiteb973b9bdfd11467f63f1626f16d5d4005eb82a7 (patch)
treec19e9caf133b53f97ad8f155129eaef068009b19
parenta3517dcc6de9bae1193075b7112aa7db97b39dcc (diff)
parentda5b42263675acc7e615b8893a3a716646e910db (diff)
downloadpango-eb973b9bdfd11467f63f1626f16d5d4005eb82a7.tar.gz
Merge branch 'strdup-avoidance' into 'main'
fc: Avoid extra copies of family names See merge request GNOME/pango!636
-rw-r--r--pango/itemize.c11
-rw-r--r--pango/pango-font-private.h22
-rw-r--r--pango/pangofc-font.c40
-rw-r--r--pango/pangofc-fontmap-private.h3
-rw-r--r--pango/pangofc-fontmap.c25
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;