summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-06-11 14:26:03 -0400
committerMatthias Clasen <mclasen@redhat.com>2022-06-22 13:54:01 -0400
commite28aadd278121b2c4e48f9ab77fc28b61e28f605 (patch)
tree47eb7b2b10e6032fbb3950e32cb0fd78ebda5f5e
parenta2e3fc9337499b040bf330cfb5781920e618dc1e (diff)
downloadpango-e28aadd278121b2c4e48f9ab77fc28b61e28f605.tar.gz
Clean up the PangoFont hierarchy
Move shared data up, add private setters.
-rw-r--r--pango/pango-font-private.h45
-rw-r--r--pango/pango-font.c27
-rw-r--r--pango/pango-hbfont-private.h19
-rw-r--r--pango/pango-hbfont.c165
-rw-r--r--pango/pango-hbfont.h5
-rw-r--r--pango/pango-userfont-private.h9
-rw-r--r--pango/pango-userfont.c130
-rw-r--r--pango/pangocairo-font.c66
-rw-r--r--pango/shape.c13
9 files changed, 237 insertions, 242 deletions
diff --git a/pango/pango-font-private.h b/pango/pango-font-private.h
index 82389f0e..85928b23 100644
--- a/pango/pango-font-private.h
+++ b/pango/pango-font-private.h
@@ -33,7 +33,15 @@ struct _PangoFont
{
GObject parent_instance;
+ PangoFontFace *face;
+
hb_font_t *hb_font;
+
+ int size; /* point size, scaled by PANGO_SCALE */
+ float dpi;
+ PangoGravity gravity;
+ PangoMatrix matrix;
+
#ifdef HAVE_CAIRO
cairo_font_options_t *options;
#endif
@@ -51,7 +59,6 @@ struct _PangoFontClass
PangoRectangle *logical_rect);
PangoFontMetrics * (* get_metrics) (PangoFont *font,
PangoLanguage *language);
- PangoFontDescription * (* describe_absolute) (PangoFont *font);
void (* get_features) (PangoFont *font,
hb_feature_t *features,
guint len,
@@ -64,7 +71,6 @@ struct _PangoFontClass
double *y_scale);
gboolean (* has_char) (PangoFont *font,
gunichar wc);
- PangoFontFace * (* get_face) (PangoFont *font);
void (* get_matrix) (PangoFont *font,
PangoMatrix *matrix);
int (* get_absolute_size) (PangoFont *font);
@@ -73,6 +79,41 @@ struct _PangoFontClass
#define PANGO_FONT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_FONT, PangoFontClass))
#define PANGO_FONT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_FONT, PangoFontClass))
+static inline void
+pango_font_set_face (PangoFont *font,
+ PangoFontFace *face)
+{
+ font->face = g_object_ref (face);
+}
+
+static inline void
+pango_font_set_size (PangoFont *font,
+ int size)
+{
+ font->size = size;
+}
+
+static inline void
+pango_font_set_dpi (PangoFont *font,
+ float dpi)
+{
+ font->dpi = dpi;
+}
+
+static inline void
+pango_font_set_gravity (PangoFont *font,
+ PangoGravity gravity)
+{
+ font->gravity = gravity;
+}
+
+static inline void
+pango_font_set_matrix (PangoFont *font,
+ const PangoMatrix *matrix)
+{
+ font->matrix = *matrix;
+}
+
gboolean pango_font_is_hinted (PangoFont *font);
void pango_font_get_scale_factors (PangoFont *font,
double *x_scale,
diff --git a/pango/pango-font.c b/pango/pango-font.c
index 698763ca..96f24b09 100644
--- a/pango/pango-font.c
+++ b/pango/pango-font.c
@@ -46,6 +46,7 @@ pango_font_finalize (GObject *object)
{
PangoFont *font = PANGO_FONT (object);
+ g_object_unref (font->face);
hb_font_destroy (font->hb_font);
G_OBJECT_CLASS (pango_font_parent_class)->finalize (object);
@@ -54,7 +55,7 @@ pango_font_finalize (GObject *object)
static PangoLanguage **
pango_font_default_get_languages (PangoFont *font)
{
- return pango_font_face_get_languages (pango_font_get_face (font));
+ return pango_font_face_get_languages (font->face);
}
static gboolean
@@ -78,12 +79,6 @@ pango_font_default_has_char (PangoFont *font,
return FALSE;
}
-static PangoFontFace *
-pango_font_default_get_face (PangoFont *font)
-{
- return NULL;
-}
-
static void
pango_font_default_get_matrix (PangoFont *font,
PangoMatrix *matrix)
@@ -115,14 +110,15 @@ pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED)
class->is_hinted = pango_font_default_is_hinted;
class->get_scale_factors = pango_font_default_get_scale_factors;
class->has_char = pango_font_default_has_char;
- class->get_face = pango_font_default_get_face;
class->get_matrix = pango_font_default_get_matrix;
class->get_absolute_size = pango_font_default_get_absolute_size;
}
static void
-pango_font_init (PangoFont *font G_GNUC_UNUSED)
+pango_font_init (PangoFont *font)
{
+ font->gravity = PANGO_GRAVITY_AUTO;
+ font->matrix = (PangoMatrix) PANGO_MATRIX_INIT;
}
/**
@@ -158,15 +154,14 @@ pango_font_describe (PangoFont *font)
PangoFontDescription *
pango_font_describe_with_absolute_size (PangoFont *font)
{
+ PangoFontDescription *desc;
+
g_return_val_if_fail (font != NULL, NULL);
- if (G_UNLIKELY (!PANGO_FONT_GET_CLASS (font)->describe_absolute))
- {
- g_warning ("describe_absolute not implemented for this font class, report this as a bug");
- return pango_font_describe (font);
- }
+ desc = pango_font_describe (font);
+ pango_font_description_set_absolute_size (desc, font->size * font->dpi / 72.);
- return PANGO_FONT_GET_CLASS (font)->describe_absolute (font);
+ return desc;
}
/**
@@ -270,7 +265,7 @@ pango_font_get_metrics (PangoFont *font,
PangoFontFace *
pango_font_get_face (PangoFont *font)
{
- return PANGO_FONT_GET_CLASS (font)->get_face (font);
+ return font->face;
}
/**
diff --git a/pango/pango-hbfont-private.h b/pango/pango-hbfont-private.h
index dbaa55cb..6fef1a9c 100644
--- a/pango/pango-hbfont-private.h
+++ b/pango/pango-hbfont-private.h
@@ -40,29 +40,10 @@ struct _HexBoxInfo
double box_height;
};
-typedef struct _CommonFont CommonFont;
-struct _CommonFont
-{
- PangoFont parent_instance;
-
- int size;
- float dpi;
- PangoGravity gravity;
- PangoMatrix matrix;
-};
-
struct _PangoHbFont
{
PangoFont parent_instance;
- int size; /* point size, scaled by PANGO_SCALE */
- float dpi;
- PangoGravity gravity;
- PangoMatrix matrix;
-
- /* up to here shared with PangoUserFont */
-
- PangoHbFace *face;
hb_feature_t *features;
unsigned int n_features;
hb_variation_t *variations;
diff --git a/pango/pango-hbfont.c b/pango/pango-hbfont.c
index 376b7da4..6fad5dde 100644
--- a/pango/pango-hbfont.c
+++ b/pango/pango-hbfont.c
@@ -331,6 +331,7 @@ collect_variations (hb_variation_t *variations,
static HexBoxInfo *
create_hex_box_info (PangoHbFont *self)
{
+ PangoFont *font = PANGO_FONT (self);
const char hexdigits[] = "0123456789ABCDEF";
hb_font_t *hb_font;
PangoFont *mini_font;
@@ -346,16 +347,16 @@ create_hex_box_info (PangoHbFont *self)
PangoContext *context;
PangoFontMap *map;
- if (!PANGO_FONT_FACE (self->face)->family)
+ if (!PANGO_FONT_FACE (font->face)->family)
return NULL;
- map = PANGO_FONT_FACE (self->face)->family->map;
+ map = PANGO_FONT_FACE (font->face)->family->map;
if (!map)
return NULL;
- desc = pango_font_describe_with_absolute_size (PANGO_FONT (self));
- hb_font = pango_font_get_hb_font (PANGO_FONT (self));
+ desc = pango_font_describe_with_absolute_size (font);
+ hb_font = pango_font_get_hb_font (font);
/* Create mini_font description */
@@ -370,19 +371,19 @@ create_hex_box_info (PangoHbFont *self)
pango_font_description_set_family_static (desc, "monospace");
rows = 2;
- mini_size = self->size / 2.2;
+ mini_size = font->size / 2.2;
if (mini_size < 6.0)
{
rows = 1;
- mini_size = MIN (MAX (self->size - 1, 0), 6.0);
+ mini_size = MIN (MAX (font->size - 1, 0), 6.0);
}
pango_font_description_set_size (desc, mini_size);
/* Load mini_font */
context = pango_font_map_create_context (map);
- pango_context_set_matrix (context, &self->matrix);
+ pango_context_set_matrix (context, &font->matrix);
pango_context_set_language (context, pango_script_get_sample_language (G_UNICODE_SCRIPT_LATIN));
mini_font = pango_font_map_load_font (map, context, desc);
@@ -429,12 +430,13 @@ get_space_extents (PangoHbFont *self,
PangoRectangle *ink_rect,
PangoRectangle *logical_rect)
{
- hb_font_t *hb_font = pango_font_get_hb_font (PANGO_FONT (self));
+ PangoFont *font = PANGO_FONT (self);
+ hb_font_t *hb_font = pango_font_get_hb_font (font);
int width;
hb_direction_t direction;
hb_font_extents_t font_extents;
- direction = PANGO_GRAVITY_IS_VERTICAL (self->gravity)
+ direction = PANGO_GRAVITY_IS_VERTICAL (font->gravity)
? HB_DIRECTION_TTB
: HB_DIRECTION_LTR;
@@ -442,7 +444,7 @@ get_space_extents (PangoHbFont *self,
/* See https://docs.microsoft.com/en-us/typography/develop/character-design-standards/whitespace */
- width = self->size / 4;
+ width = font->size / 4;
if (ink_rect)
{
@@ -527,8 +529,6 @@ G_DEFINE_TYPE (PangoHbFont, pango_hb_font, PANGO_TYPE_FONT)
static void
pango_hb_font_init (PangoHbFont *self)
{
- self->gravity = PANGO_GRAVITY_AUTO;
- self->matrix = (PangoMatrix) PANGO_MATRIX_INIT;
}
static void
@@ -543,7 +543,6 @@ pango_hb_font_finalize (GObject *object)
{
PangoHbFont *self = PANGO_HB_FONT (object);
- g_object_unref (self->face);
g_free (self->variations);
g_clear_pointer (&self->hex_box_info, hex_box_info_destroy);
@@ -554,26 +553,29 @@ static PangoFontDescription *
pango_hb_font_describe (PangoFont *font)
{
PangoHbFont *self = PANGO_HB_FONT (font);
+ PangoHbFace *face = PANGO_HB_FACE (font->face);
PangoFontDescription *desc;
PangoVariant variant;
- desc = pango_font_face_describe (PANGO_FONT_FACE (self->face));
- pango_font_description_set_gravity (desc, self->gravity);
+ desc = pango_font_face_describe (font->face);
+ pango_font_description_set_gravity (desc, font->gravity);
+ pango_font_description_set_size (desc, font->size);
+
variant = pango_variant_from_features (self->features, self->n_features);
if (variant != PANGO_VARIANT_NORMAL)
pango_font_description_set_variant (desc, variant);
- if (self->n_variations > 0)
+ if (self->n_variations > 0 || face->n_variations > 0)
{
hb_variation_t *variations;
unsigned int n_variations;
char *str;
- if (self->face->n_variations > 0)
+ if (face->n_variations > 0)
{
- variations = g_alloca (sizeof (hb_variation_t) * (self->n_variations + self->face->n_variations));
- n_variations = merge_variations (self->face->variations, self->face->n_variations,
+ variations = g_alloca (sizeof (hb_variation_t) * (self->n_variations + face->n_variations));
+ n_variations = merge_variations (face->variations, face->n_variations,
self->variations, self->n_variations,
- variations, self->n_variations + self->face->n_variations);
+ variations, self->n_variations + face->n_variations);
}
else
{
@@ -585,19 +587,6 @@ pango_hb_font_describe (PangoFont *font)
pango_font_description_set_variations (desc, str);
g_free (str);
}
- pango_font_description_set_size (desc, self->size);
-
- return desc;
-}
-
-static PangoFontDescription *
-pango_hb_font_describe_absolute (PangoFont *font)
-{
- PangoHbFont *self = PANGO_HB_FONT (font);
- PangoFontDescription *desc;
-
- desc = pango_hb_font_describe (font);
- pango_font_description_set_absolute_size (desc, self->size * self->dpi / 72.);
return desc;
}
@@ -609,12 +598,13 @@ pango_hb_font_get_glyph_extents (PangoFont *font,
PangoRectangle *logical_rect)
{
PangoHbFont *self = PANGO_HB_FONT (font);
+ PangoHbFace *face = PANGO_HB_FACE (font->face);
hb_font_t *hb_font = pango_font_get_hb_font (font);
hb_glyph_extents_t extents;
hb_direction_t direction;
hb_font_extents_t font_extents;
- direction = PANGO_GRAVITY_IS_VERTICAL (self->gravity)
+ direction = PANGO_GRAVITY_IS_VERTICAL (font->gravity)
? HB_DIRECTION_TTB
: HB_DIRECTION_LTR;
@@ -653,17 +643,17 @@ pango_hb_font_get_glyph_extents (PangoFont *font,
r.width = extents.width;
r.height = - extents.height;
- if (self->face->matrix)
+ if (face->matrix)
{
- m.xx = self->face->matrix->xx;
- m.yx = - self->face->matrix->yx;
- m.xy = - self->face->matrix->xy;
- m.yy = self->face->matrix->yy;
+ m.xx = face->matrix->xx;
+ m.yx = - face->matrix->yx;
+ m.xy = - face->matrix->xy;
+ m.yy = face->matrix->yy;
}
pango_matrix_transform_rectangle (&m, &r);
- switch (self->gravity)
+ switch (font->gravity)
{
case PANGO_GRAVITY_AUTO:
case PANGO_GRAVITY_SOUTH:
@@ -694,7 +684,7 @@ pango_hb_font_get_glyph_extents (PangoFont *font,
g_assert_not_reached ();
}
- if (PANGO_GRAVITY_IS_IMPROPER (self->gravity))
+ if (PANGO_GRAVITY_IS_IMPROPER (font->gravity))
{
PangoMatrix matrix = (PangoMatrix) PANGO_MATRIX_INIT;
pango_matrix_scale (&matrix, -1, -1);
@@ -713,7 +703,7 @@ pango_hb_font_get_glyph_extents (PangoFont *font,
logical_rect->x = 0;
logical_rect->height = extents.ascender - extents.descender;
- switch (self->gravity)
+ switch (font->gravity)
{
case PANGO_GRAVITY_AUTO:
case PANGO_GRAVITY_SOUTH:
@@ -736,7 +726,7 @@ pango_hb_font_get_glyph_extents (PangoFont *font,
g_assert_not_reached ();
}
- if (PANGO_GRAVITY_IS_IMPROPER (self->gravity))
+ if (PANGO_GRAVITY_IS_IMPROPER (font->gravity))
{
logical_rect->height = - logical_rect->height;
logical_rect->y = - logical_rect->y;
@@ -801,6 +791,7 @@ static hb_font_t *
pango_hb_font_create_hb_font (PangoFont *font)
{
PangoHbFont *self = PANGO_HB_FONT (font);
+ PangoHbFace *face = PANGO_HB_FACE (font->face);
hb_font_t *hb_font;
double x_scale, y_scale;
unsigned int n_axes;
@@ -808,45 +799,45 @@ pango_hb_font_create_hb_font (PangoFont *font)
float *coords;
int size;
- hb_font = hb_font_create (pango_hb_face_get_hb_face (self->face));
+ hb_font = hb_font_create (pango_hb_face_get_hb_face (face));
- size = self->size * self->dpi / 72.f;
- x_scale = self->face->x_scale;
- y_scale = self->face->y_scale;
+ size = font->size * font->dpi / 72.f;
+ x_scale = face->x_scale;
+ y_scale = face->y_scale;
- if (PANGO_GRAVITY_IS_IMPROPER (self->gravity))
+ if (PANGO_GRAVITY_IS_IMPROPER (font->gravity))
{
x_scale = - x_scale;
y_scale = - y_scale;
}
hb_font_set_scale (hb_font, size * x_scale, size * y_scale);
- hb_font_set_ptem (hb_font, self->size / PANGO_SCALE);
+ hb_font_set_ptem (hb_font, font->size / PANGO_SCALE);
#if HB_VERSION_ATLEAST (3, 3, 0)
- hb_font_set_synthetic_slant (hb_font, pango_matrix_get_slant_ratio (self->face->matrix));
+ hb_font_set_synthetic_slant (hb_font, pango_matrix_get_slant_ratio (face->matrix));
#endif
- if (self->face->instance_id >= 0)
- hb_font_set_var_named_instance (hb_font, self->face->instance_id);
+ if (face->instance_id >= 0)
+ hb_font_set_var_named_instance (hb_font, face->instance_id);
- if (self->n_variations > 0 || self->face->n_variations > 0)
+ if (self->n_variations > 0 || face->n_variations > 0)
{
- n_axes = hb_ot_var_get_axis_count (self->face->face);
+ n_axes = hb_ot_var_get_axis_count (face->face);
axes = g_alloca (sizeof (hb_ot_var_axis_info_t) * n_axes);
coords = g_alloca (sizeof (float) * n_axes);
- hb_ot_var_get_axis_infos (self->face->face, 0, &n_axes, axes);
+ hb_ot_var_get_axis_infos (face->face, 0, &n_axes, axes);
- if (self->face->instance_id >= 0)
- hb_ot_var_named_instance_get_design_coords (self->face->face, self->face->instance_id, &n_axes, coords);
+ if (face->instance_id >= 0)
+ hb_ot_var_named_instance_get_design_coords (face->face, face->instance_id, &n_axes, coords);
else
{
for (int i = 0; i < n_axes; i++)
coords[axes[i].axis_index] = axes[i].default_value;
}
- collect_variations (self->face->variations, self->face->n_variations, n_axes, axes, coords);
+ collect_variations (face->variations, face->n_variations, n_axes, axes, coords);
collect_variations (self->variations, self->n_variations, n_axes, axes, coords);
hb_font_set_var_coords_design (hb_font, coords, n_axes);
@@ -865,24 +856,16 @@ pango_hb_font_has_char (PangoFont *font,
return hb_font_get_nominal_glyph (hb_font, wc, &glyph);
}
-static PangoFontFace *
-pango_hb_font_get_face (PangoFont *font)
-{
- PangoHbFont *self = PANGO_HB_FONT (font);
-
- return PANGO_FONT_FACE (self->face);
-}
-
static void
pango_hb_font_get_matrix (PangoFont *font,
PangoMatrix *matrix)
{
- PangoHbFont *self = PANGO_HB_FONT (font);
+ PangoHbFace *face = PANGO_HB_FACE (font->face);
- if (self->face->matrix)
+ if (face->matrix)
{
- *matrix = *self->face->matrix;
- pango_matrix_scale (matrix, self->face->x_scale, self->face->y_scale);
+ *matrix = *face->matrix;
+ pango_matrix_scale (matrix, face->x_scale, face->y_scale);
}
else
*matrix = (PangoMatrix) PANGO_MATRIX_INIT;
@@ -909,14 +892,12 @@ pango_hb_font_class_init (PangoHbFontClass *class)
object_class->finalize = pango_hb_font_finalize;
font_class->describe = pango_hb_font_describe;
- font_class->describe_absolute = pango_hb_font_describe_absolute;
font_class->get_glyph_extents = pango_hb_font_get_glyph_extents;
font_class->get_metrics = pango_hb_font_get_metrics;
font_class->create_hb_font = pango_hb_font_create_hb_font;
font_class->get_features = pango_hb_font_get_features;
- font_class->has_char = pango_hb_font_has_char;
- font_class->get_face = pango_hb_font_get_face;
font_class->get_matrix = pango_hb_font_get_matrix;
+ font_class->has_char = pango_hb_font_has_char;
}
/* }}} */
@@ -950,6 +931,7 @@ pango_hb_font_new (PangoHbFace *face,
const PangoMatrix *matrix)
{
PangoHbFont *self;
+ PangoFont *font;
g_return_val_if_fail (PANGO_IS_HB_FACE (face), NULL);
g_return_val_if_fail (size > 0, NULL);
@@ -957,18 +939,19 @@ pango_hb_font_new (PangoHbFace *face,
self = g_object_new (PANGO_TYPE_HB_FONT, NULL);
- self->face = g_object_ref (face);
+ font = PANGO_FONT (self);
+
+ pango_font_set_face (font, PANGO_FONT_FACE (face));
+ pango_font_set_size (font, size);
+ pango_font_set_dpi (font, dpi);
+ pango_font_set_gravity (font, gravity);
+ if (matrix)
+ pango_font_set_matrix (font, matrix);
- self->size = size;
- self->dpi = dpi;
self->features = g_memdup2 (features, sizeof (hb_feature_t) * n_features);
self->n_features = n_features;
self->variations = g_memdup2 (variations, sizeof (hb_variation_t) * n_variations);
self->n_variations = n_variations;
- if (gravity != PANGO_GRAVITY_AUTO)
- self->gravity = gravity;
- if (matrix)
- self->matrix = *matrix;
return self;
}
@@ -1036,6 +1019,28 @@ pango_hb_font_new_for_description (PangoHbFace *face,
return pango_hb_font_new (face, size, features, n_features, variations, n_variations, gravity, dpi, matrix);
}
+/**
+ * hb_font_get_variations:
+ * @self: a `PangoHbFont`
+ * @n_variations: (nullable) (out caller-allocates): return location for
+ * the length of the returned array
+ *
+ * Gets the variations of the font.
+ *
+ * Returns: (nullable) (transfer none): the variations
+ */
+const hb_variation_t *
+pango_hb_font_get_variations (PangoHbFont *self,
+ unsigned int *n_variations)
+{
+ g_return_val_if_fail (PANGO_IS_HB_FONT (self), NULL);
+
+ if (n_variations)
+ *n_variations = self->n_variations;
+
+ return self->variations;
+}
+
/* }}} */
/* vim:set foldmethod=marker expandtab: */
diff --git a/pango/pango-hbfont.h b/pango/pango-hbfont.h
index 017a77ac..6c6fe0c0 100644
--- a/pango/pango-hbfont.h
+++ b/pango/pango-hbfont.h
@@ -48,4 +48,9 @@ PangoHbFont * pango_hb_font_new_for_description (PangoHbFace
float dpi,
const PangoMatrix *matrix);
+
+PANGO_AVAILABLE_IN_ALL
+const hb_variation_t * pango_hb_font_get_variations (PangoHbFont *self,
+ unsigned int *n_variations);
+
G_END_DECLS
diff --git a/pango/pango-userfont-private.h b/pango/pango-userfont-private.h
index a3669a09..a4e688b1 100644
--- a/pango/pango-userfont-private.h
+++ b/pango/pango-userfont-private.h
@@ -27,13 +27,4 @@
struct _PangoUserFont
{
PangoFont parent_instance;
-
- int size; /* point size, scaled by PANGO_SCALE */
- float dpi;
- PangoGravity gravity;
- PangoMatrix matrix;
-
- /* up to here shared with PangoHbFont */
-
- PangoUserFace *face;
};
diff --git a/pango/pango-userfont.c b/pango/pango-userfont.c
index cc1ea4d1..8649d7bd 100644
--- a/pango/pango-userfont.c
+++ b/pango/pango-userfont.c
@@ -47,43 +47,24 @@ struct _PangoUserFontClass
G_DEFINE_TYPE (PangoUserFont, pango_user_font, PANGO_TYPE_FONT)
static void
-pango_user_font_init (PangoUserFont *self)
+pango_user_font_init (PangoUserFont *self G_GNUC_UNUSED)
{
- self->gravity = PANGO_GRAVITY_AUTO;
- self->matrix = (PangoMatrix) PANGO_MATRIX_INIT;
}
static void
pango_user_font_finalize (GObject *object)
{
- PangoUserFont *self = PANGO_USER_FONT (object);
-
- g_object_unref (self->face);
-
G_OBJECT_CLASS (pango_user_font_parent_class)->finalize (object);
}
static PangoFontDescription *
pango_user_font_describe (PangoFont *font)
{
- PangoUserFont *self = PANGO_USER_FONT (font);
- PangoFontDescription *desc;
-
- desc = pango_font_face_describe (PANGO_FONT_FACE (self->face));
- pango_font_description_set_gravity (desc, self->gravity);
- pango_font_description_set_size (desc, self->size);
-
- return desc;
-}
-
-static PangoFontDescription *
-pango_user_font_describe_absolute (PangoFont *font)
-{
- PangoUserFont *self = PANGO_USER_FONT (font);
PangoFontDescription *desc;
- desc = pango_user_font_describe (font);
- pango_font_description_set_absolute_size (desc, self->size * self->dpi / 72.);
+ desc = pango_font_face_describe (PANGO_FONT_FACE (font->face));
+ pango_font_description_set_gravity (desc, font->gravity);
+ pango_font_description_set_size (desc, font->size);
return desc;
}
@@ -94,13 +75,12 @@ pango_user_font_get_glyph_extents (PangoFont *font,
PangoRectangle *ink_rect,
PangoRectangle *logical_rect)
{
- PangoUserFont *self = PANGO_USER_FONT (font);
hb_font_t *hb_font = pango_font_get_hb_font (font);
hb_glyph_extents_t extents;
hb_direction_t direction;
hb_font_extents_t font_extents;
- direction = PANGO_GRAVITY_IS_VERTICAL (self->gravity)
+ direction = PANGO_GRAVITY_IS_VERTICAL (font->gravity)
? HB_DIRECTION_TTB
: HB_DIRECTION_LTR;
@@ -132,7 +112,7 @@ pango_user_font_get_glyph_extents (PangoFont *font,
r.width = extents.width;
r.height = - extents.height;
- switch (self->gravity)
+ switch (font->gravity)
{
case PANGO_GRAVITY_AUTO:
case PANGO_GRAVITY_SOUTH:
@@ -163,7 +143,7 @@ pango_user_font_get_glyph_extents (PangoFont *font,
g_assert_not_reached ();
}
- if (PANGO_GRAVITY_IS_IMPROPER (self->gravity))
+ if (PANGO_GRAVITY_IS_IMPROPER (font->gravity))
{
PangoMatrix matrix = (PangoMatrix) PANGO_MATRIX_INIT;
pango_matrix_scale (&matrix, -1, -1);
@@ -184,7 +164,7 @@ pango_user_font_get_glyph_extents (PangoFont *font,
logical_rect->width = h_advance;
logical_rect->height = extents.ascender - extents.descender;
- switch (self->gravity)
+ switch (font->gravity)
{
case PANGO_GRAVITY_AUTO:
case PANGO_GRAVITY_SOUTH:
@@ -207,7 +187,7 @@ pango_user_font_get_glyph_extents (PangoFont *font,
g_assert_not_reached ();
}
- if (PANGO_GRAVITY_IS_IMPROPER (self->gravity))
+ if (PANGO_GRAVITY_IS_IMPROPER (font->gravity))
{
logical_rect->height = - logical_rect->height;
logical_rect->y = - logical_rect->y;
@@ -242,79 +222,82 @@ pango_user_font_get_metrics (PangoFont *font,
}
static hb_bool_t
-nominal_glyph_func (hb_font_t *font, void *font_data,
+nominal_glyph_func (hb_font_t *hb_font, void *font_data,
hb_codepoint_t unicode,
hb_codepoint_t *glyph,
void *user_data)
{
- PangoUserFont *self = font_data;
+ PangoFont *font = font_data;
+ PangoUserFace *face = PANGO_USER_FACE (font->face);
- return self->face->glyph_func (self->face, unicode, glyph, self->face->user_data);
+ return face->glyph_func (face, unicode, glyph, face->user_data);
}
static hb_position_t
-glyph_h_advance_func (hb_font_t *font, void *font_data,
+glyph_h_advance_func (hb_font_t *hb_font, void *font_data,
hb_codepoint_t glyph,
void *user_data)
{
- PangoUserFont *self = font_data;
- int size = self->size * self->dpi / 72.;
+ PangoFont *font = font_data;
+ PangoUserFace *face = PANGO_USER_FACE (font->face);
+ int size = font->size * font->dpi / 72.;
hb_position_t h_advance, v_advance;
hb_glyph_extents_t glyph_extents;
gboolean is_color;
- self->face->glyph_info_func (self->face, size, glyph,
- &glyph_extents,
- &h_advance, &v_advance,
- &is_color,
- self->face->user_data);
+ face->glyph_info_func (face, size, glyph,
+ &glyph_extents,
+ &h_advance, &v_advance,
+ &is_color,
+ face->user_data);
return h_advance;
}
static hb_bool_t
-glyph_extents_func (hb_font_t *font, void *font_data,
+glyph_extents_func (hb_font_t *hb_font, void *font_data,
hb_codepoint_t glyph,
hb_glyph_extents_t *extents,
void *user_data)
{
- PangoUserFont *self = font_data;
- int size = self->size * self->dpi / 72.;
+ PangoFont *font = font_data;
+ PangoUserFace *face = PANGO_USER_FACE (font->face);
+ int size = font->size * font->dpi / 72.;
hb_position_t h_advance, v_advance;
gboolean is_color;
- return self->face->glyph_info_func (self->face, size, glyph,
- extents,
- &h_advance, &v_advance,
- &is_color,
- self->face->user_data);
+ return face->glyph_info_func (face, size, glyph,
+ extents,
+ &h_advance, &v_advance,
+ &is_color,
+ face->user_data);
}
static hb_bool_t
-font_extents_func (hb_font_t *font, void *font_data,
+font_extents_func (hb_font_t *hb_font, void *font_data,
hb_font_extents_t *extents,
void *user_data)
{
- PangoUserFont *self = font_data;
- int size = self->size * self->dpi / 72.;
+ PangoFont *font = font_data;
+ PangoUserFace *face = PANGO_USER_FACE (font->face);
+ int size = font->size * font->dpi / 72.;
- return self->face->font_info_func (self->face, size, extents, self->face->user_data);
+ return face->font_info_func (face, size, extents, face->user_data);
}
static hb_font_t *
pango_user_font_create_hb_font (PangoFont *font)
{
- PangoUserFont *self = PANGO_USER_FONT (font);
- hb_font_t *hb_font;
double x_scale, y_scale;
int size;
hb_blob_t *blob;
- hb_face_t *face;
+ hb_face_t *hb_face;
+ hb_font_t *hb_font;
hb_font_funcs_t *funcs;
blob = hb_blob_create ("", 0, HB_MEMORY_MODE_READONLY, NULL, NULL);
- face = hb_face_create (blob, 0);
- hb_font = hb_font_create (face);
+ hb_face = hb_face_create (blob, 0);
+ hb_font = hb_font_create (hb_face);
funcs = hb_font_funcs_create ();
@@ -323,23 +306,23 @@ pango_user_font_create_hb_font (PangoFont *font)
hb_font_funcs_set_glyph_extents_func (funcs, glyph_extents_func, NULL, NULL);
hb_font_funcs_set_font_h_extents_func (funcs, font_extents_func, NULL, NULL);
- hb_font_set_funcs (hb_font, funcs, self, NULL);
+ hb_font_set_funcs (hb_font, funcs, font, NULL);
hb_font_funcs_destroy (funcs);
- hb_face_destroy (face);
+ hb_face_destroy (hb_face);
hb_blob_destroy (blob);
- size = self->size * self->dpi / 72.f;
+ size = font->size * font->dpi / 72.f;
x_scale = y_scale = 1;
- if (PANGO_GRAVITY_IS_IMPROPER (self->gravity))
+ if (PANGO_GRAVITY_IS_IMPROPER (font->gravity))
{
x_scale = - x_scale;
y_scale = - y_scale;
}
hb_font_set_scale (hb_font, size * x_scale, size * y_scale);
- hb_font_set_ptem (hb_font, self->size / PANGO_SCALE);
+ hb_font_set_ptem (hb_font, font->size / PANGO_SCALE);
return hb_font;
}
@@ -354,14 +337,6 @@ pango_user_font_has_char (PangoFont *font,
return hb_font_get_nominal_glyph (user_font, wc, &glyph);
}
-static PangoFontFace *
-pango_user_font_get_face (PangoFont *font)
-{
- PangoUserFont *self = PANGO_USER_FONT (font);
-
- return PANGO_FONT_FACE (self->face);
-}
-
static void
pango_user_font_class_init (PangoUserFontClass *class)
{
@@ -371,12 +346,10 @@ pango_user_font_class_init (PangoUserFontClass *class)
object_class->finalize = pango_user_font_finalize;
font_class->describe = pango_user_font_describe;
- font_class->describe_absolute = pango_user_font_describe_absolute;
font_class->get_glyph_extents = pango_user_font_get_glyph_extents;
font_class->get_metrics = pango_user_font_get_metrics;
font_class->create_hb_font = pango_user_font_create_hb_font;
font_class->has_char = pango_user_font_has_char;
- font_class->get_face = pango_user_font_get_face;
}
/* }}} */
@@ -402,17 +375,18 @@ pango_user_font_new (PangoUserFace *face,
const PangoMatrix *matrix)
{
PangoUserFont *self;
+ PangoFont *font;
self = g_object_new (PANGO_TYPE_USER_FONT, NULL);
- self->face = g_object_ref (face);
+ font = PANGO_FONT (self);
- self->size = size;
- self->dpi = dpi;
- if (gravity != PANGO_GRAVITY_AUTO)
- self->gravity = gravity;
+ pango_font_set_face (font, PANGO_FONT_FACE (face));
+ pango_font_set_size (font, size);
+ pango_font_set_dpi (font, dpi);
+ pango_font_set_gravity (font, gravity);
if (matrix)
- self->matrix = *matrix;
+ pango_font_set_matrix (font, matrix);
return self;
}
diff --git a/pango/pangocairo-font.c b/pango/pangocairo-font.c
index 996ae39c..5ca9a047 100644
--- a/pango/pangocairo-font.c
+++ b/pango/pangocairo-font.c
@@ -88,7 +88,8 @@ render_func (cairo_scaled_font_t *scaled_font,
cairo_text_extents_t *extents)
{
cairo_font_face_t *font_face;
- PangoUserFont *font;
+ PangoFont *font;
+ PangoUserFace *face;
hb_glyph_extents_t glyph_extents;
hb_position_t h_advance;
hb_position_t v_advance;
@@ -96,6 +97,7 @@ render_func (cairo_scaled_font_t *scaled_font,
font_face = cairo_scaled_font_get_font_face (scaled_font);
font = cairo_font_face_get_user_data (font_face, &cairo_user_data);
+ face = PANGO_USER_FACE (font->face);
extents->x_bearing = 0;
extents->y_bearing = 0;
@@ -104,12 +106,12 @@ render_func (cairo_scaled_font_t *scaled_font,
extents->x_advance = 0;
extents->y_advance = 0;
- if (!font->face->glyph_info_func (font->face, 1024,
- (hb_codepoint_t)glyph,
- &glyph_extents,
- &h_advance, &v_advance,
- &is_color,
- font->face->user_data))
+ if (!face->glyph_info_func (face, 1024,
+ (hb_codepoint_t)glyph,
+ &glyph_extents,
+ &h_advance, &v_advance,
+ &is_color,
+ face->user_data))
{
return CAIRO_STATUS_USER_FONT_ERROR;
}
@@ -121,11 +123,11 @@ render_func (cairo_scaled_font_t *scaled_font,
extents->x_advance = h_advance / (double) 1024;
extents->y_advance = v_advance / (double) 1024;
- if (!font->face->render_func (font->face, font->size,
- (hb_codepoint_t)glyph,
- font->face->user_data,
- "cairo",
- cr))
+ if (!face->render_func (face, font->size,
+ (hb_codepoint_t)glyph,
+ face->user_data,
+ "cairo",
+ cr))
{
return CAIRO_STATUS_USER_FONT_ERROR;
}
@@ -134,7 +136,7 @@ render_func (cairo_scaled_font_t *scaled_font,
}
static cairo_font_face_t *
-create_font_face_for_user_font (PangoUserFont *font)
+create_font_face_for_user_font (PangoFont *font)
{
cairo_font_face_t *cairo_face;
@@ -146,8 +148,9 @@ create_font_face_for_user_font (PangoUserFont *font)
}
static cairo_font_face_t *
-create_font_face_for_hb_font (PangoHbFont *font)
+create_font_face_for_hb_font (PangoFont *font)
{
+ PangoHbFace *face = PANGO_HB_FACE (font->face);
hb_blob_t *blob;
const char *blob_data;
unsigned int blob_length;
@@ -166,18 +169,18 @@ create_font_face_for_hb_font (PangoHbFont *font)
g_once_init_leave (&ft_library, library);
}
- blob = hb_face_reference_blob (hb_font_get_face (pango_font_get_hb_font (PANGO_FONT (font))));
+ hb_font = pango_font_get_hb_font (font);
+ blob = hb_face_reference_blob (hb_font_get_face (hb_font));
blob_data = hb_blob_get_data (blob, &blob_length);
hb_blob_destroy (blob);
if ((error = FT_New_Memory_Face (ft_library,
(const FT_Byte *) blob_data,
blob_length,
- hb_face_get_index (font->face->face),
+ hb_face_get_index (face->face),
&ft_face)) != 0)
g_error ("FT_New_Memory_Face failed: %d %s", error, FT_Error_String (error));
- hb_font = pango_font_get_hb_font (PANGO_FONT (font));
coords = hb_font_get_var_coords_normalized (hb_font, &num_coords);
if (num_coords > 0)
{
@@ -190,7 +193,7 @@ create_font_face_for_hb_font (PangoHbFont *font)
}
cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, FT_LOAD_NO_HINTING | FT_LOAD_COLOR);
- if (font->face->embolden)
+ if (face->embolden)
cairo_ft_font_face_set_synthesize (cairo_face, CAIRO_FT_SYNTHESIZE_BOLD);
cairo_font_face_set_user_data (cairo_face, &key,
ft_face, (cairo_destroy_func_t) FT_Done_Face);
@@ -215,9 +218,9 @@ _pango_cairo_font_private_get_scaled_font (PangoCairoFontPrivate *cf_priv)
}
if (PANGO_IS_HB_FONT (cf_priv->cfont))
- font_face = create_font_face_for_hb_font (PANGO_HB_FONT (cf_priv->cfont));
+ font_face = create_font_face_for_hb_font (cf_priv->cfont);
else if (PANGO_IS_USER_FONT (cf_priv->cfont))
- font_face = create_font_face_for_user_font (PANGO_USER_FONT (cf_priv->cfont));
+ font_face = create_font_face_for_user_font (cf_priv->cfont);
if (G_UNLIKELY (font_face == NULL))
goto done;
@@ -555,7 +558,6 @@ _pango_font_get_cairo_font_private (PangoFont *font)
cf_priv = g_object_get_data (G_OBJECT (font), "pango-hb-font-cairo_private");
if (!cf_priv)
{
- CommonFont *cf = (CommonFont *)font;
cairo_font_options_t *font_options;
cairo_matrix_t font_matrix;
double x_scale, y_scale;
@@ -566,20 +568,20 @@ _pango_font_get_cairo_font_private (PangoFont *font)
if (PANGO_IS_HB_FONT (font))
{
- PangoHbFont *hbfont = PANGO_HB_FONT (font);
- if (hbfont->face->matrix)
+ PangoHbFace *face = PANGO_HB_FACE (font->face);
+ if (face->matrix)
cairo_matrix_init (&font_matrix,
- hbfont->face->matrix->xx,
- - hbfont->face->matrix->yx,
- - hbfont->face->matrix->xy,
- hbfont->face->matrix->yy,
+ face->matrix->xx,
+ - face->matrix->yx,
+ - face->matrix->xy,
+ face->matrix->yy,
0., 0.);
- x_scale = hbfont->face->x_scale;
- y_scale = hbfont->face->y_scale;
+ x_scale = face->x_scale;
+ y_scale = face->y_scale;
}
- size = cf->size * cf->dpi / 72.;
+ size = font->size * font->dpi / 72.;
cairo_matrix_scale (&font_matrix,
x_scale * size / (double)PANGO_SCALE,
@@ -598,9 +600,9 @@ _pango_font_get_cairo_font_private (PangoFont *font)
cf_priv = g_new0 (PangoCairoFontPrivate, 1);
_pango_cairo_font_private_initialize (cf_priv,
font,
- cf->gravity,
+ font->gravity,
font_options,
- &cf->matrix,
+ &font->matrix,
&font_matrix);
cairo_font_options_destroy (font_options);
diff --git a/pango/shape.c b/pango/shape.c
index 68edda99..aed65f45 100644
--- a/pango/shape.c
+++ b/pango/shape.c
@@ -541,13 +541,14 @@ pango_user_shape (const char *text,
PangoGlyphString *glyphs,
PangoShapeFlags flags)
{
- PangoUserFont *font = PANGO_USER_FONT (analysis->font);
+ PangoFont *font = analysis->font;
+ PangoUserFace *face = PANGO_USER_FACE (font->face);
- font->face->shape_func (font->face, font->size,
- text, length,
- analysis,
- glyphs, flags,
- font->face->user_data);
+ face->shape_func (face, font->size,
+ text, length,
+ analysis,
+ glyphs, flags,
+ face->user_data);
}
/* }}} */