summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-08-02 01:29:03 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-08-02 01:29:03 +0000
commit626c131eaf3c040cf01da573e4c265144aeaa78d (patch)
tree199b590a2e956892477bf65450b2c2667b348ff0
parent524f0d78b37b7ad9c074d35e1e1ebbab68d35ecc (diff)
parenta2e14a48b21f22db08237c20d2f9d1521417c6e3 (diff)
downloadpango-626c131eaf3c040cf01da573e4c265144aeaa78d.tar.gz
Merge branch 'private-vfuncs' into 'main'
Start using private vfuncs See merge request GNOME/pango!383
-rw-r--r--meson.build2
-rw-r--r--pango/fonts.c75
-rw-r--r--pango/pango-font-private.h16
-rw-r--r--pango/pango-font.h3
-rw-r--r--pango/pango-glyph.h2
-rw-r--r--pango/pango-version-macros.h24
-rw-r--r--pango/pangofc-font.c43
-rw-r--r--pango/pangofc-font.h3
-rw-r--r--pango/shape.c80
9 files changed, 188 insertions, 60 deletions
diff --git a/meson.build b/meson.build
index a1add61d..de49eb0b 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('pango', 'c', 'cpp',
- version: '1.48.7',
+ version: '1.49.0',
license: 'LGPLv2.1+',
default_options: [
'buildtype=debugoptimized',
diff --git a/pango/fonts.c b/pango/fonts.c
index 79cf1251..cd30811c 100644
--- a/pango/fonts.c
+++ b/pango/fonts.c
@@ -1688,7 +1688,13 @@ typedef struct {
hb_font_t *hb_font;
} PangoFontPrivate;
-G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (PangoFont, pango_font, G_TYPE_OBJECT)
+#define PANGO_FONT_GET_CLASS_PRIVATE(font) ((PangoFontClassPrivate *) \
+ g_type_class_get_private ((GTypeClass *) PANGO_FONT_GET_CLASS (font), \
+ PANGO_TYPE_FONT))
+
+G_DEFINE_ABSTRACT_TYPE_WITH_CODE (PangoFont, pango_font, G_TYPE_OBJECT,
+ G_ADD_PRIVATE (PangoFont)
+ g_type_add_class_private (g_define_type_id, sizeof (PangoFontClassPrivate)))
static void
pango_font_finalize (GObject *object)
@@ -1701,12 +1707,39 @@ pango_font_finalize (GObject *object)
G_OBJECT_CLASS (pango_font_parent_class)->finalize (object);
}
+static PangoLanguage **
+pango_font_default_get_languages (PangoFont *font)
+{
+ return NULL;
+}
+
+static gboolean
+pango_font_default_is_hinted (PangoFont *font)
+{
+ return FALSE;
+}
+
+static void
+pango_font_default_get_scale_factors (PangoFont *font,
+ double *x_scale,
+ double *y_scale)
+{
+ *x_scale = *y_scale = 1.0;
+}
+
static void
pango_font_class_init (PangoFontClass *class G_GNUC_UNUSED)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
+ PangoFontClassPrivate *pclass;
object_class->finalize = pango_font_finalize;
+
+ pclass = g_type_class_get_private ((GTypeClass *) class, PANGO_TYPE_FONT);
+
+ pclass->get_languages = pango_font_default_get_languages;
+ pclass->is_hinted = pango_font_default_is_hinted;
+ pclass->get_scale_factors = pango_font_default_get_scale_factors;
}
static void
@@ -2625,3 +2658,43 @@ pango_font_get_features (PangoFont *font,
if (PANGO_FONT_GET_CLASS (font)->get_features)
PANGO_FONT_GET_CLASS (font)->get_features (font, features, len, num_features);
}
+
+/**
+ * pango_font_get_languages:
+ * @font: a `PangoFont`
+ *
+ * Returns the languages that are supported by @font.
+ *
+ * If the font backend does not provide this information,
+ * %NULL is returned. For the fontconfig backend, this
+ * corresponds to the FC_LANG member of the FcPattern.
+ *
+ * The returned array is only valid as long as the font
+ * and its fontmap are valid.
+ *
+ * Returns: (transfer none) (nullable): a %NULL-terminated
+ * array of `PangoLanguage`*
+ *
+ * Since: 1.50
+ */
+PangoLanguage **
+pango_font_get_languages (PangoFont *font)
+{
+ PangoFontClassPrivate *pclass = PANGO_FONT_GET_CLASS_PRIVATE (font);
+
+ return pclass->get_languages (font);
+}
+
+gboolean
+pango_font_is_hinted (PangoFont *font)
+{
+ return PANGO_FONT_GET_CLASS_PRIVATE (font)->is_hinted (font);
+}
+
+void
+pango_font_get_scale_factors (PangoFont *font,
+ double *x_scale,
+ double *y_scale)
+{
+ PANGO_FONT_GET_CLASS_PRIVATE (font)->get_scale_factors (font, x_scale, y_scale);
+}
diff --git a/pango/pango-font-private.h b/pango/pango-font-private.h
index befa1b94..d9845fab 100644
--- a/pango/pango-font-private.h
+++ b/pango/pango-font-private.h
@@ -33,6 +33,22 @@ G_BEGIN_DECLS
PANGO_AVAILABLE_IN_ALL
PangoFontMetrics *pango_font_metrics_new (void);
+typedef struct {
+ PangoLanguage ** (* get_languages) (PangoFont *font);
+
+ gboolean (* is_hinted) (PangoFont *font);
+
+ void (* get_scale_factors) (PangoFont *font,
+ double *x_scale,
+ double *y_scale);
+
+} PangoFontClassPrivate;
+
+gboolean pango_font_is_hinted (PangoFont *font);
+void pango_font_get_scale_factors (PangoFont *font,
+ double *x_scale,
+ double *y_scale);
+
G_END_DECLS
#endif /* __PANGO_FONT_PRIVATE_H__ */
diff --git a/pango/pango-font.h b/pango/pango-font.h
index 13f8a222..498338b2 100644
--- a/pango/pango-font.h
+++ b/pango/pango-font.h
@@ -601,6 +601,9 @@ void pango_font_get_features (PangoFont *font,
PANGO_AVAILABLE_IN_1_44
hb_font_t * pango_font_get_hb_font (PangoFont *font);
+PANGO_AVAILABLE_IN_1_50
+PangoLanguage ** pango_font_get_languages (PangoFont *font);
+
/**
* PANGO_GLYPH_EMPTY:
*
diff --git a/pango/pango-glyph.h b/pango/pango-glyph.h
index abab5572..3674d6b7 100644
--- a/pango/pango-glyph.h
+++ b/pango/pango-glyph.h
@@ -79,7 +79,7 @@ struct _PangoGlyphGeometry
* A `PangoGlyphVisAttr` structure communicates information between
* the shaping and rendering phases.
*
- * Currently, it contains only cluster start information. yMore attributes
+ * Currently, it contains only cluster start information. More attributes
* may be added in the future.
*/
struct _PangoGlyphVisAttr
diff --git a/pango/pango-version-macros.h b/pango/pango-version-macros.h
index 4008579c..84130ca3 100644
--- a/pango/pango-version-macros.h
+++ b/pango/pango-version-macros.h
@@ -272,6 +272,16 @@
*/
#define PANGO_VERSION_1_48 (G_ENCODE_VERSION (1, 48))
+/**
+ * PANGO_VERSION_1_50:
+ *
+ * A macro that evaluates to the 1.50 version of Pango, in a format
+ * that can be used by the C pre-processor.
+ *
+ * Since: 1.50
+ */
+#define PANGO_VERSION_1_50 (G_ENCODE_VERSION (1, 50))
+
/* evaluates to the current stable version; for development cycles,
* this means the next stable target
*/
@@ -705,4 +715,18 @@
# define PANGO_AVAILABLE_IN_1_48 _PANGO_EXTERN
#endif
+#if PANGO_VERSION_MIN_REQUIRED >= PANGO_VERSION_1_50
+# define PANGO_DEPRECATED_IN_1_50 PANGO_DEPRECATED
+# define PANGO_DEPRECATED_IN_1_50_FOR(f) PANGO_DEPRECATED_FOR(f)
+#else
+# define PANGO_DEPRECATED_IN_1_50 _PANGO_EXTERN
+# define PANGO_DEPRECATED_IN_1_50_FOR(f) _PANGO_EXTERN
+#endif
+
+#if PANGO_VERSION_MAX_ALLOWED < PANGO_VERSION_1_50
+# define PANGO_AVAILABLE_IN_1_50 PANGO_UNAVAILABLE(1, 50)
+#else
+# define PANGO_AVAILABLE_IN_1_50 _PANGO_EXTERN
+#endif
+
#endif /* __PANGO_VERSION_H__ */
diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c
index cd063854..8543b85e 100644
--- a/pango/pangofc-font.c
+++ b/pango/pangofc-font.c
@@ -21,6 +21,7 @@
#include "config.h"
+#include "pango-font-private.h"
#include "pangofc-font-private.h"
#include "pangofc-fontmap.h"
#include "pangofc-private.h"
@@ -69,6 +70,11 @@ static void pango_fc_font_get_features (PangoFont *font,
guint len,
guint *num_features);
static hb_font_t * pango_fc_font_create_hb_font (PangoFont *font);
+static PangoLanguage ** _pango_fc_font_get_languages (PangoFont *font);
+static gboolean _pango_fc_font_is_hinted (PangoFont *font);
+static void _pango_fc_font_get_scale_factors (PangoFont *font,
+ double *x_scale,
+ double *y_scale);
#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))
@@ -81,6 +87,7 @@ pango_fc_font_class_init (PangoFcFontClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
PangoFontClass *font_class = PANGO_FONT_CLASS (class);
+ PangoFontClassPrivate *pclass;
class->has_char = pango_fc_font_real_has_char;
class->get_glyph = pango_fc_font_real_get_glyph;
@@ -98,6 +105,12 @@ pango_fc_font_class_init (PangoFcFontClass *class)
font_class->create_hb_font = pango_fc_font_create_hb_font;
font_class->get_features = pango_fc_font_get_features;
+ pclass = g_type_class_get_private ((GTypeClass *) class, PANGO_TYPE_FONT);
+
+ pclass->get_languages = _pango_fc_font_get_languages;
+ pclass->is_hinted = _pango_fc_font_is_hinted;
+ pclass->get_scale_factors = _pango_fc_font_get_scale_factors;
+
/**
* PangoFcFont:pattern:
*
@@ -1046,18 +1059,26 @@ done:
* array of `PangoLanguage`*
*
* Since: 1.48
+ * Deprecated: 1.50: Use pango_font_get_language()
*/
PangoLanguage **
pango_fc_font_get_languages (PangoFcFont *font)
{
+ return pango_font_get_languages (PANGO_FONT (font));
+}
+
+static PangoLanguage **
+_pango_fc_font_get_languages (PangoFont *font)
+{
+ PangoFcFont * fcfont = PANGO_FC_FONT (font);
PangoFcFontMap *fontmap;
PangoLanguage **languages;
- fontmap = g_weak_ref_get ((GWeakRef *) &font->fontmap);
+ fontmap = g_weak_ref_get ((GWeakRef *) &fcfont->fontmap);
if (!fontmap)
return NULL;
- languages = _pango_fc_font_map_get_languages (fontmap, font);
+ languages = _pango_fc_font_map_get_languages (fontmap, fcfont);
g_object_unref (fontmap);
return languages;
@@ -1078,3 +1099,21 @@ pango_fc_font_get_pattern (PangoFcFont *font)
{
return font->font_pattern;
}
+
+gboolean
+_pango_fc_font_is_hinted (PangoFont *font)
+{
+ PangoFcFont *fcfont = PANGO_FC_FONT (font);
+
+ return fcfont->is_hinted;
+}
+
+void
+_pango_fc_font_get_scale_factors (PangoFont *font,
+ double *x_scale,
+ double *y_scale)
+{
+ PangoFcFont *fcfont = PANGO_FC_FONT (font);
+
+ pango_matrix_get_font_scale_factors (&fcfont->matrix, x_scale, y_scale);
+}
diff --git a/pango/pangofc-font.h b/pango/pangofc-font.h
index b4aa399e..89b0cc79 100644
--- a/pango/pangofc-font.h
+++ b/pango/pangofc-font.h
@@ -95,7 +95,8 @@ gboolean pango_fc_font_has_char (PangoFcFont *font,
PANGO_AVAILABLE_IN_1_4
guint pango_fc_font_get_glyph (PangoFcFont *font,
gunichar wc);
-PANGO_AVAILABLE_IN_1_48
+
+PANGO_DEPRECATED_IN_1_50_FOR(pango_font_get_language)
PangoLanguage **
pango_fc_font_get_languages (PangoFcFont *font);
diff --git a/pango/shape.c b/pango/shape.c
index b870ecad..f8ac3691 100644
--- a/pango/shape.c
+++ b/pango/shape.c
@@ -25,6 +25,7 @@
#include "pango-glyph.h"
#include "pangohb-private.h"
+#include "pango-font-private.h"
#include <string.h>
@@ -151,32 +152,6 @@ fallback_shape (const char *text,
pango_glyph_string_reverse_range (glyphs, 0, glyphs->num_glyphs);
}
-/* FIXME: This is very ugly. We are out of room for vfuncs, so we can't
- * easily add api to get is_hinted and the matrix from the PangoFcFont.
- *
- * Keep in sync with pangofc-font.h!
- */
-struct _PangoFcFont
-{
- PangoFont parent_instance;
-
- gpointer font_pattern; /* fully resolved pattern */
- PangoFontMap *fontmap; /* associated map */
- gpointer priv; /* used internally */
- PangoMatrix matrix; /* used internally */
- PangoFontDescription *description;
-
- GSList *metrics_by_lang;
-
- guint is_hinted : 1;
- guint is_transformed : 1;
-};
-typedef struct _PangoFcFont PangoFcFont;
-
-#define PANGO_IS_FC_FONT(obj) \
- g_type_is_a (((GTypeInstance*)obj)->g_class->g_type, \
- g_type_from_name ("PangoFcFont"))
-
/**
* pango_shape_with_flags:
* @item_text: valid UTF-8 text to shape
@@ -320,31 +295,29 @@ pango_shape_with_flags (const gchar *item_text,
if (flags & PANGO_SHAPE_ROUND_POSITIONS)
{
- if (PANGO_IS_FC_FONT (analysis->font))
+ if (pango_font_is_hinted (analysis->font))
{
- PangoFcFont *fc_font = (PangoFcFont *)analysis->font;
- if (fc_font->is_hinted)
+ double x_scale_inv, y_scale_inv;
+ double x_scale, y_scale;
+
+ pango_font_get_scale_factors (analysis->font, &x_scale_inv, &y_scale_inv);
+
+ if (PANGO_GRAVITY_IS_IMPROPER (analysis->gravity))
{
- double x_scale_inv, y_scale_inv;
- double x_scale, y_scale;
+ x_scale_inv = -x_scale_inv;
+ y_scale_inv = -y_scale_inv;
+ }
- x_scale_inv = y_scale_inv = 1.0;
- pango_matrix_get_font_scale_factors (&fc_font->matrix, &x_scale_inv, &y_scale_inv);
- if (PANGO_GRAVITY_IS_IMPROPER (analysis->gravity))
- {
- x_scale_inv = -x_scale_inv;
- y_scale_inv = -y_scale_inv;
- }
- x_scale = 1. / x_scale_inv;
- y_scale = 1. / y_scale_inv;
+ x_scale = 1.0 / x_scale_inv;
+ y_scale = 1.0 / y_scale_inv;
- if (x_scale == 1.0 && y_scale == 1.0)
- {
- for (i = 0; i < glyphs->num_glyphs; i++)
- glyphs->glyphs[i].geometry.width = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.width);
- }
- else
- {
+ if (x_scale == 1.0 && y_scale == 1.0)
+ {
+ for (i = 0; i < glyphs->num_glyphs; i++)
+ glyphs->glyphs[i].geometry.width = PANGO_UNITS_ROUND (glyphs->glyphs[i].geometry.width);
+ }
+ else
+ {
#if 0
if (PANGO_GRAVITY_IS_VERTICAL (analysis->gravity))
{
@@ -357,16 +330,15 @@ pango_shape_with_flags (const gchar *item_text,
#define HINT(value, scale_inv, scale) (PANGO_UNITS_ROUND ((int) ((value) * scale)) * scale_inv)
#define HINT_X(value) HINT ((value), x_scale, x_scale_inv)
#define HINT_Y(value) HINT ((value), y_scale, y_scale_inv)
- for (i = 0; i < glyphs->num_glyphs; i++)
- {
- glyphs->glyphs[i].geometry.width = HINT_X (glyphs->glyphs[i].geometry.width);
- glyphs->glyphs[i].geometry.x_offset = HINT_X (glyphs->glyphs[i].geometry.x_offset);
- glyphs->glyphs[i].geometry.y_offset = HINT_Y (glyphs->glyphs[i].geometry.y_offset);
- }
+ for (i = 0; i < glyphs->num_glyphs; i++)
+ {
+ glyphs->glyphs[i].geometry.width = HINT_X (glyphs->glyphs[i].geometry.width);
+ glyphs->glyphs[i].geometry.x_offset = HINT_X (glyphs->glyphs[i].geometry.x_offset);
+ glyphs->glyphs[i].geometry.y_offset = HINT_Y (glyphs->glyphs[i].geometry.y_offset);
+ }
#undef HINT_Y
#undef HINT_X
#undef HINT
- }
}
}
}