[gtk/pango2: 83/91] Port to pango2 api
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/pango2: 83/91] Port to pango2 api
- Date: Mon, 4 Jul 2022 14:13:32 +0000 (UTC)
commit 53b884a3dfb5705f5cc4fdb04044ad8145a08c5a
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Jul 2 01:07:55 2022 -0400
Port to pango2 api
demos/gtk-demo/dropdown.c | 5 +-
demos/gtk-demo/font_features.c | 152 +++++++++++++++----------------
demos/gtk-demo/fontify.c | 15 ++--
demos/gtk-demo/rotated_text.c | 174 ++++++++++++++++++++---------------
gdk/gdkcairo.h | 2 +-
gdk/gdkdevice.h | 2 +-
gdk/gdkpango.h | 2 +-
gdk/gdktypes.h | 2 +-
gsk/gskrendernodeparser.c | 40 ++++-----
gtk/a11y/gtkatspipango.c | 40 +++++----
gtk/gskpango.c | 90 +++----------------
gtk/gskpango.h | 10 +++
gtk/gtkcellrenderertext.c | 4 +-
gtk/gtkfontchooserwidget.c | 7 +-
gtk/gtkimcontextsimple.c | 6 +-
gtk/gtkimcontextwayland.c | 11 ++-
gtk/gtklabel.c | 7 +-
gtk/gtkpango.c | 4 +-
gtk/gtktextbuffer.c | 14 +--
gtk/gtktextlayout.c | 200 +++++++++++++++++------------------------
meson.build | 2 +-
testsuite/gtk/builder.c | 20 +++--
testsuite/gtk/label.c | 22 ++---
23 files changed, 380 insertions(+), 451 deletions(-)
---
diff --git a/demos/gtk-demo/dropdown.c b/demos/gtk-demo/dropdown.c
index c517737a2a..1924b4bce8 100644
--- a/demos/gtk-demo/dropdown.c
+++ b/demos/gtk-demo/dropdown.c
@@ -338,8 +338,9 @@ bind_highlight_item (GtkSignalListItemFactory *factory,
gtk_label_set_label (GTK_LABEL (label), str);
attrs = pango_attr_list_new ();
attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
- attr->start_index = match_object_get_match_start (obj);
- attr->end_index = match_object_get_match_end (obj);
+ pango_attribute_set_range (attr,
+ match_object_get_match_start (obj),
+ match_object_get_match_end (obj));
pango_attr_list_insert (attrs, attr);
gtk_label_set_attributes (GTK_LABEL (label), attrs);
pango_attr_list_unref (attrs);
diff --git a/demos/gtk-demo/font_features.c b/demos/gtk-demo/font_features.c
index 0b0b735b8f..3c535e58e2 100644
--- a/demos/gtk-demo/font_features.c
+++ b/demos/gtk-demo/font_features.c
@@ -35,9 +35,9 @@ typedef struct {
typedef struct {
unsigned int start;
unsigned int end;
- PangoFontDescription *desc;
+ Pango2FontDescription *desc;
char *features;
- PangoLanguage *language;
+ Pango2Language *language;
} Range;
typedef struct {
@@ -202,12 +202,12 @@ font_features_reset_basic (void)
static void
update_basic (void)
{
- PangoFontDescription *desc;
+ Pango2FontDescription *desc;
desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (demo->font));
gtk_adjustment_set_value (demo->size_adjustment,
- pango_font_description_get_size (desc) / (double) PANGO_SCALE);
+ pango2_font_description_get_size (desc) / (double) PANGO_SCALE);
}
static void add_font_variations (GString *s);
@@ -218,7 +218,7 @@ free_range (gpointer data)
Range *range = data;
if (range->desc)
- pango_font_description_free (range->desc);
+ pango2_font_description_free (range->desc);
g_free (range->features);
g_free (range);
}
@@ -244,9 +244,9 @@ compare_range (gconstpointer a, gconstpointer b)
static void
ensure_range (unsigned int start,
unsigned int end,
- PangoFontDescription *desc,
+ Pango2FontDescription *desc,
const char *features,
- PangoLanguage *language)
+ Pango2Language *language)
{
GList *l;
Range *range;
@@ -270,9 +270,9 @@ ensure_range (unsigned int start,
set:
if (range->desc)
- pango_font_description_free (range->desc);
+ pango2_font_description_free (range->desc);
if (desc)
- range->desc = pango_font_description_copy (desc);
+ range->desc = pango2_font_description_copy (desc);
g_free (range->features);
range->features = g_strdup (features);
range->language = language;
@@ -473,13 +473,13 @@ update_display (void)
gboolean has_feature;
GtkTreeIter iter;
GtkTreeModel *model;
- PangoFontDescription *desc;
+ Pango2FontDescription *desc;
GList *l;
- PangoAttrList *attrs;
- PangoAttribute *attr;
+ Pango2AttrList *attrs;
+ Pango2Attribute *attr;
int ins, bound;
guint start, end;
- PangoLanguage *lang;
+ Pango2Language *lang;
char *font_desc;
char *features;
double value;
@@ -520,17 +520,17 @@ update_display (void)
desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (demo->font));
value = gtk_adjustment_get_value (demo->size_adjustment);
- pango_font_description_set_size (desc, value * PANGO_SCALE);
+ pango2_font_description_set_size (desc, value * PANGO_SCALE);
s = g_string_new ("");
add_font_variations (s);
if (s->len > 0)
{
- pango_font_description_set_variations (desc, s->str);
+ pango2_font_description_set_variations (desc, s->str);
g_string_free (s, TRUE);
}
- font_desc = pango_font_description_to_string (desc);
+ font_desc = pango2_font_description_to_string (desc);
s = g_string_new ("");
@@ -582,27 +582,25 @@ update_display (void)
model = gtk_combo_box_get_model (GTK_COMBO_BOX (demo->script_lang));
gtk_tree_model_get (model, &iter, 3, &lang_tag, -1);
- lang = pango_language_from_string (hb_language_to_string (hb_ot_tag_to_language (lang_tag)));
+ lang = pango2_language_from_string (hb_language_to_string (hb_ot_tag_to_language (lang_tag)));
}
else
lang = NULL;
- attrs = pango_attr_list_new ();
+ attrs = pango2_attr_list_new ();
if (gtk_adjustment_get_value (demo->letterspacing_adjustment) != 0.)
{
- attr = pango_attr_letter_spacing_new (gtk_adjustment_get_value (demo->letterspacing_adjustment));
- attr->start_index = start;
- attr->end_index = end;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_letter_spacing_new (gtk_adjustment_get_value (demo->letterspacing_adjustment));
+ pango2_attribute_set_range (attr, start, end);
+ pango2_attr_list_insert (attrs, attr);
}
if (gtk_adjustment_get_value (demo->line_height_adjustment) != 1.)
{
- attr = pango_attr_line_height_new (gtk_adjustment_get_value (demo->line_height_adjustment));
- attr->start_index = start;
- attr->end_index = end;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_line_height_new (gtk_adjustment_get_value (demo->line_height_adjustment));
+ pango2_attribute_set_range (attr, start, end);
+ pango2_attr_list_insert (attrs, attr);
}
{
@@ -610,16 +608,12 @@ update_display (void)
char *fg, *bg, *css;
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (demo->foreground), &rgba);
- attr = pango_attr_foreground_new (65535 * rgba.red,
- 65535 * rgba.green,
- 65535 * rgba.blue);
- attr->start_index = start;
- attr->end_index = end;
- pango_attr_list_insert (attrs, attr);
- attr = pango_attr_foreground_alpha_new (65535 * rgba.alpha);
- attr->start_index = start;
- attr->end_index = end;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_foreground_new (&(Pango2Color){ 65535 * rgba.red,
+ 65535 * rgba.green,
+ 65535 * rgba.blue,
+ 65535 * rgba.alpha });
+ pango2_attribute_set_range (attr, start, end);
+ pango2_attr_list_insert (attrs, attr);
fg = gdk_rgba_to_string (&rgba);
gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (demo->background), &rgba);
@@ -633,12 +627,12 @@ update_display (void)
if (do_waterfall)
{
- attr = pango_attr_font_desc_new (desc);
- pango_attr_list_insert (attrs, attr);
- attr = pango_attr_font_features_new (features);
- pango_attr_list_insert (attrs, attr);
- attr = pango_attr_language_new (lang);
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_font_desc_new (desc);
+ pango2_attr_list_insert (attrs, attr);
+ attr = pango2_attr_font_features_new (features);
+ pango2_attr_list_insert (attrs, attr);
+ attr = pango2_attr_language_new (lang);
+ pango2_attr_list_insert (attrs, attr);
}
else
{
@@ -648,22 +642,19 @@ update_display (void)
{
Range *range = l->data;
- attr = pango_attr_font_desc_new (range->desc);
- attr->start_index = range->start;
- attr->end_index = range->end;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_font_desc_new (range->desc);
+ pango2_attribute_set_range (attr, range->start, range->end);
+ pango2_attr_list_insert (attrs, attr);
- attr = pango_attr_font_features_new (range->features);
- attr->start_index = range->start;
- attr->end_index = range->end;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_font_features_new (range->features);
+ pango2_attribute_set_range (attr, range->start, range->end);
+ pango2_attr_list_insert (attrs, attr);
if (range->language)
{
- attr = pango_attr_language_new (range->language);
- attr->start_index = range->start;
- attr->end_index = range->end;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_language_new (range->language);
+ pango2_attribute_set_range (attr, range->start, range->end);
+ pango2_attr_list_insert (attrs, attr);
}
}
}
@@ -681,10 +672,9 @@ update_display (void)
g_string_append (waterfall, text);
g_string_append_c (waterfall, '\n');
- attr = pango_attr_size_new (sizes[i] * PANGO_SCALE);
- attr->start_index = start;
- attr->end_index = start + text_len;
- pango_attr_list_insert (attrs, attr);
+ attr = pango2_attr_size_new (sizes[i] * PANGO_SCALE);
+ pango2_attribute_set_range (attr, start, start + text_len);
+ pango2_attr_list_insert (attrs, attr);
start += text_len + 1;
}
@@ -697,22 +687,22 @@ update_display (void)
gtk_label_set_attributes (GTK_LABEL (demo->the_label), attrs);
g_free (font_desc);
- pango_font_description_free (desc);
+ pango2_font_description_free (desc);
g_free (features);
- pango_attr_list_unref (attrs);
+ pango2_attr_list_unref (attrs);
g_free (text);
}
-static PangoFont *
-get_pango_font (void)
+static Pango2Font *
+get_pango2_font (void)
{
- PangoFontDescription *desc;
- PangoContext *context;
+ Pango2FontDescription *desc;
+ Pango2Context *context;
desc = gtk_font_chooser_get_font_desc (GTK_FONT_CHOOSER (demo->font));
- context = gtk_widget_get_pango_context (demo->font);
+ context = gtk_widget_get_pango2_context (demo->font);
- return pango_context_load_font (context, desc);
+ return pango2_context_load_font (context, desc);
}
typedef struct {
@@ -765,7 +755,7 @@ update_script_combo (void)
GtkListStore *store;
hb_font_t *hb_font;
int i, j, k;
- PangoFont *pango_font;
+ Pango2Font *pango2_font;
GHashTable *tags;
GHashTableIter iter;
TagPair *pair;
@@ -784,8 +774,8 @@ update_script_combo (void)
store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_UINT);
- pango_font = get_pango_font ();
- hb_font = pango_font_get_hb_font (pango_font);
+ pango2_font = get_pango_font ();
+ hb_font = pango2_font_get_hb_font (pango_font);
tags = g_hash_table_new_full (tag_pair_hash, tag_pair_equal, g_free, NULL);
@@ -831,7 +821,7 @@ update_script_combo (void)
}
}
- g_object_unref (pango_font);
+ g_object_unref (pango2_font);
g_hash_table_iter_init (&iter, tags);
while (g_hash_table_iter_next (&iter, (gpointer *)&pair, NULL))
@@ -908,7 +898,7 @@ update_features (void)
GtkTreeIter iter;
guint script_index, lang_index;
hb_tag_t lang_tag;
- PangoFont *pango_font;
+ Pango2Font *pango2_font;
hb_font_t *hb_font;
GList *l;
@@ -947,8 +937,8 @@ update_features (void)
gtk_check_button_set_active (GTK_CHECK_BUTTON (item->feat), TRUE);
}
- pango_font = get_pango_font ();
- hb_font = pango_font_get_hb_font (pango_font);
+ pango2_font = get_pango_font ();
+ hb_font = pango2_font_get_hb_font (pango_font);
if (hb_font)
{
@@ -1078,7 +1068,7 @@ update_features (void)
}
}
- g_object_unref (pango_font);
+ g_object_unref (pango2_font);
}
#define FixedToFloat(f) (((float)(f))/65536.0)
@@ -1361,7 +1351,7 @@ instance_changed (GtkComboBox *combo)
float *coords = NULL;
hb_ot_var_axis_info_t *ai = NULL;
unsigned int n_axes;
- PangoFont *pango_font = NULL;
+ Pango2Font *pango2_font = NULL;
hb_font_t *hb_font;
hb_face_t *hb_face;
@@ -1377,8 +1367,8 @@ instance_changed (GtkComboBox *combo)
goto out;
}
- pango_font = get_pango_font ();
- hb_font = pango_font_get_hb_font (pango_font);
+ pango2_font = get_pango_font ();
+ hb_font = pango2_font_get_hb_font (pango_font);
hb_face = hb_font_get_face (hb_font);
n_axes = hb_ot_var_get_axis_infos (hb_face, 0, NULL, NULL);
@@ -1411,7 +1401,7 @@ instance_changed (GtkComboBox *combo)
out:
g_free (text);
- g_clear_object (&pango_font);
+ g_clear_object (&pango2_font);
g_free (ai);
g_free (coords);
}
@@ -1482,7 +1472,7 @@ static void
update_font_variations (void)
{
GtkWidget *child;
- PangoFont *pango_font = NULL;
+ Pango2Font *pango2_font = NULL;
hb_font_t *hb_font;
hb_face_t *hb_face;
unsigned int n_axes;
@@ -1500,8 +1490,8 @@ update_font_variations (void)
g_hash_table_remove_all (demo->axes);
g_hash_table_remove_all (demo->instances);
- pango_font = get_pango_font ();
- hb_font = pango_font_get_hb_font (pango_font);
+ pango2_font = get_pango_font ();
+ hb_font = pango2_font_get_hb_font (pango_font);
hb_face = hb_font_get_face (hb_font);
n_axes = hb_ot_var_get_axis_infos (hb_face, 0, NULL, NULL);
diff --git a/demos/gtk-demo/fontify.c b/demos/gtk-demo/fontify.c
index 18ffb8b936..a451ba6652 100644
--- a/demos/gtk-demo/fontify.c
+++ b/demos/gtk-demo/fontify.c
@@ -32,7 +32,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define LANGUAGE_ATTR(attr_name) \
{ \
- const char *language = pango_language_to_string (attr->lang_value); \
+ const char *language = pango_language_to_string (pango_attribute_get_language (attr)); \
g_snprintf (name, 256, "language=%s", language); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -47,7 +47,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define STRING_ATTR(attr_name) \
{ \
- const char *string = attr->str_value; \
+ const char *string = pango_attribute_get_string (attr); \
g_snprintf (name, 256, #attr_name "=%s", string); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -62,7 +62,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define INT_ATTR(attr_name) \
{ \
- int value = attr->int_value; \
+ int value = pango_attribute_get_int (attr); \
g_snprintf (name, 256, #attr_name "=%d", value); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -77,7 +77,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define FONT_ATTR(attr_name) \
{ \
- PangoFontDescription *desc = attr->font_value; \
+ PangoFontDescription *desc = pango_attribute_get_font_desc (attr); \
char *str = pango_font_description_to_string (desc); \
g_snprintf (name, 256, "font-desc=%s", str); \
g_free (str); \
@@ -94,7 +94,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define FLOAT_ATTR(attr_name) \
{ \
- float value = attr->double_value; \
+ float value = pango_attribute_get_float (attr); \
g_snprintf (name, 256, #attr_name "=%g", value); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -109,9 +109,8 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define RGBA_ATTR(attr_name) \
{ \
- PangoColor *color; \
+ PangoColor *color = pango_attribute_get_color (attr); \
GdkRGBA rgba; \
- color = &attr->color_value; \
rgba.red = color->red / 65535.; \
rgba.green = color->green / 65535.; \
rgba.blue = color->blue / 65535.; \
@@ -148,7 +147,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
{
PangoAttribute *attr = l->data;
- switch (attr->type)
+ switch (pango_attribute_type (attr))
{
case PANGO_ATTR_LANGUAGE:
LANGUAGE_ATTR (language);
diff --git a/demos/gtk-demo/rotated_text.c b/demos/gtk-demo/rotated_text.c
index bb97fb8baf..cedf6a6209 100644
--- a/demos/gtk-demo/rotated_text.c
+++ b/demos/gtk-demo/rotated_text.c
@@ -14,75 +14,118 @@
#define HEART "♥"
const char text[] = "I ♥ GTK";
-static void
-fancy_shape_renderer (cairo_t *cr,
- PangoAttrShape *attr,
- gboolean do_path,
- gpointer data)
+static gboolean
+glyph_cb (PangoUserFace *face,
+ hb_codepoint_t unicode,
+ hb_codepoint_t *glyph,
+ gpointer data)
+{
+ if (unicode == 0x2665)
+ {
+ *glyph = 0x2665;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+glyph_info_cb (PangoUserFace *face,
+ int size,
+ hb_codepoint_t glyph,
+ hb_glyph_extents_t *extents,
+ hb_position_t *h_advance,
+ hb_position_t *v_advance,
+ gboolean *is_color,
+ gpointer user_data)
+{
+ if (glyph == 0x2665)
+ {
+ extents->x_bearing = 0;
+ extents->y_bearing = size;
+ extents->width = size;
+ extents->height = - size;
+
+ *h_advance = size;
+ *v_advance = size;
+ *is_color = TRUE;
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+font_info_cb (PangoUserFace *face,
+ int size,
+ hb_font_extents_t *extents,
+ gpointer user_data)
+{
+ extents->ascender = size;
+ extents->descender = 0;
+ extents->line_gap = 0;
+
+ return TRUE;
+}
+
+static gboolean
+render_cb (PangoUserFace *face,
+ int size,
+ hb_codepoint_t glyph,
+ gpointer user_data,
+ const char *backend_id,
+ gpointer backend_data)
{
- double x, y;
- cairo_get_current_point (cr, &x, &y);
- cairo_translate (cr, x, y);
+ cairo_t *cr;
+
+ if (strcmp (backend_id, "cairo") != 0)
+ {
+ g_warning ("Unsupported PangoRenderer backend %s", backend_id);
+ return FALSE;
+ }
- cairo_scale (cr,
- (double) attr->ink_rect.width / PANGO_SCALE,
- (double) attr->ink_rect.height / PANGO_SCALE);
+ cr = backend_data;
- if (GPOINTER_TO_UINT (attr->data) == 0x2665) /* U+2665 BLACK HEART SUIT */
+ if (glyph == 0x2665)
{
+ cairo_set_source_rgb (cr, 1., 0., 0.);
+
cairo_move_to (cr, .5, .0);
cairo_line_to (cr, .9, -.4);
cairo_curve_to (cr, 1.1, -.8, .5, -.9, .5, -.5);
cairo_curve_to (cr, .5, -.9, -.1, -.8, .1, -.4);
cairo_close_path (cr);
- }
-
- if (!do_path)
- {
- cairo_set_source_rgb (cr, 1., 0., 0.);
cairo_fill (cr);
+
+ return TRUE;
}
+
+ return FALSE;
}
-static PangoAttrList *
-create_fancy_attr_list_for_layout (PangoLayout *layout)
+static void
+setup_fontmap (void)
{
- PangoAttrList *attrs;
- PangoFontMetrics *metrics;
- int ascent;
- PangoRectangle ink_rect, logical_rect;
- const char *p;
-
- /* Get font metrics and prepare fancy shape size */
- metrics = pango_context_get_metrics (pango_layout_get_context (layout),
- pango_layout_get_font_description (layout),
- NULL);
- ascent = pango_font_metrics_get_ascent (metrics);
- logical_rect.x = 0;
- logical_rect.width = ascent;
- logical_rect.y = -ascent;
- logical_rect.height = ascent;
- ink_rect = logical_rect;
- pango_font_metrics_free (metrics);
-
- /* Set fancy shape attributes for all hearts */
- attrs = pango_attr_list_new ();
- for (p = text; (p = strstr (p, HEART)); p += strlen (HEART))
- {
- PangoAttribute *attr;
+ PangoFontMap *fontmap = pango_font_map_get_default ();
+ PangoFontDescription *desc;
+ PangoUserFace *face;
- attr = pango_attr_shape_new_with_data (&ink_rect,
- &logical_rect,
- GUINT_TO_POINTER (g_utf8_get_char (p)),
- NULL, NULL);
+ desc = pango_font_description_new ();
+ pango_font_description_set_family (desc, "Bullets");
- attr->start_index = p - text;
- attr->end_index = attr->start_index + strlen (HEART);
+ /* Create our fancy user font, "Bullets Black" */
+ face = pango_user_face_new (font_info_cb,
+ glyph_cb,
+ glyph_info_cb,
+ NULL,
+ render_cb,
+ NULL, NULL, "Black", desc);
- pango_attr_list_insert (attrs, attr);
- }
+ /* And add it to the default fontmap */
+ pango_font_map_add_face (fontmap, PANGO_FONT_FACE (face));
- return attrs;
+ pango_font_description_free (desc);
}
static void
@@ -94,16 +137,12 @@ rotated_text_draw (GtkDrawingArea *da,
{
#define RADIUS 150
#define N_WORDS 5
-#define FONT "Serif 18"
+#define FONT "Bullets 18"
PangoContext *context;
PangoLayout *layout;
PangoFontDescription *desc;
-
cairo_pattern_t *pattern;
-
- PangoAttrList *attrs;
-
double device_radius;
int i;
@@ -125,9 +164,6 @@ rotated_text_draw (GtkDrawingArea *da,
/* Create a PangoContext and set up our shape renderer */
context = gtk_widget_create_pango_context (GTK_WIDGET (da));
- pango_cairo_context_set_shape_renderer (context,
- fancy_shape_renderer,
- NULL, NULL);
/* Create a PangoLayout, set the text, font, and attributes */
layout = pango_layout_new (context);
@@ -135,10 +171,6 @@ rotated_text_draw (GtkDrawingArea *da,
desc = pango_font_description_from_string (FONT);
pango_layout_set_font_description (layout, desc);
- attrs = create_fancy_attr_list_for_layout (layout);
- pango_layout_set_attributes (layout, attrs);
- pango_attr_list_unref (attrs);
-
/* Draw the layout N_WORDS times in a circle */
for (i = 0; i < N_WORDS; i++)
{
@@ -173,9 +205,11 @@ do_rotated_text (GtkWidget *do_widget)
GtkWidget *box;
GtkWidget *drawing_area;
GtkWidget *label;
- PangoLayout *layout;
+ PangoAttribute *attr;
PangoAttrList *attrs;
+ setup_fontmap ();
+
window = gtk_window_new ();
gtk_window_set_display (GTK_WINDOW (window),
gtk_widget_get_display (do_widget));
@@ -198,16 +232,12 @@ do_rotated_text (GtkWidget *do_widget)
/* And a label */
label = gtk_label_new (text);
- gtk_box_append (GTK_BOX (box), label);
-
- /* Set up fancy stuff on the label */
- layout = gtk_label_get_layout (GTK_LABEL (label));
- pango_cairo_context_set_shape_renderer (pango_layout_get_context (layout),
- fancy_shape_renderer,
- NULL, NULL);
- attrs = create_fancy_attr_list_for_layout (layout);
+ attrs = pango_attr_list_new ();
+ attr = pango_attr_font_desc_new (pango_font_description_from_string (FONT));
+ pango_attr_list_insert (attrs, attr);
gtk_label_set_attributes (GTK_LABEL (label), attrs);
pango_attr_list_unref (attrs);
+ gtk_box_append (GTK_BOX (box), label);
}
if (!gtk_widget_get_visible (window))
diff --git a/gdk/gdkcairo.h b/gdk/gdkcairo.h
index f2dfa3177e..423875460a 100644
--- a/gdk/gdkcairo.h
+++ b/gdk/gdkcairo.h
@@ -25,7 +25,7 @@
#include <gdk/gdkversionmacros.h>
#include <gdk/gdkrgba.h>
#include <gdk/gdkpixbuf.h>
-#include <pango/pangocairo.h>
+#include <pango2/pangocairo.h>
G_BEGIN_DECLS
diff --git a/gdk/gdkdevice.h b/gdk/gdkdevice.h
index c24c084631..f65a7ae5a2 100644
--- a/gdk/gdkdevice.h
+++ b/gdk/gdkdevice.h
@@ -109,7 +109,7 @@ guint gdk_device_get_num_touches (GdkDevice *device);
GDK_AVAILABLE_IN_ALL
GdkModifierType gdk_device_get_modifier_state (GdkDevice *device);
GDK_AVAILABLE_IN_ALL
-PangoDirection gdk_device_get_direction (GdkDevice *device);
+Pango2Direction gdk_device_get_direction (GdkDevice *device);
GDK_AVAILABLE_IN_ALL
gboolean gdk_device_has_bidi_layouts (GdkDevice *device);
GDK_AVAILABLE_IN_ALL
diff --git a/gdk/gdkpango.h b/gdk/gdkpango.h
index 610ed4712e..5654ddb9ec 100644
--- a/gdk/gdkpango.h
+++ b/gdk/gdkpango.h
@@ -28,7 +28,7 @@
G_BEGIN_DECLS
GDK_AVAILABLE_IN_ALL
-cairo_region_t *gdk_pango_layout_get_clip_region (PangoLayout *layout,
+cairo_region_t *gdk_pango_layout_get_clip_region (Pango2Layout *layout,
int x_origin,
int y_origin,
const int *index_ranges,
diff --git a/gdk/gdktypes.h b/gdk/gdktypes.h
index 3cf195df09..42090d5812 100644
--- a/gdk/gdktypes.h
+++ b/gdk/gdktypes.h
@@ -35,7 +35,7 @@
#include <glib-object.h>
#include <gio/gio.h>
#include <cairo.h>
-#include <pango/pango.h>
+#include <pango2/pango.h>
/* The system specific file gdkconfig.h contains such configuration
* settings that are needed not only when compiling GDK (or GTK)
diff --git a/gsk/gskrendernodeparser.c b/gsk/gskrendernodeparser.c
index 8c1d320257..340a4c3c7f 100644
--- a/gsk/gskrendernodeparser.c
+++ b/gsk/gskrendernodeparser.c
@@ -664,20 +664,8 @@ font_from_string (const char *string)
static PangoGlyphString *
create_ascii_glyphs (PangoFont *font)
{
-#if 0
- PangoLanguage *language = pango_language_from_string ("en_US"); /* just pick one */
- PangoAnalysis not_a_hack = {
- .shape_engine = NULL, /* unused */
- .lang_engine = NULL, /* unused by pango_shape() */
- .font = font,
- .level = 0,
- .gravity = PANGO_GRAVITY_SOUTH,
- .flags = 0,
- .script = PANGO_SCRIPT_COMMON,
- .language = language,
- .extra_attrs = NULL
- };
-#endif
+ PangoContext *context;
+ PangoFontDescription *desc;
PangoGlyphString *result, *glyph_string;
guint i;
@@ -689,34 +677,46 @@ create_ascii_glyphs (PangoFont *font)
if (i < MAX_ASCII_GLYPH)
return NULL;
+ desc = pango_font_describe (font);
+ context = pango_context_new ();
+ pango_context_set_font_description (context, desc);
+ pango_font_description_free (desc);
+
result = pango_glyph_string_new ();
pango_glyph_string_set_size (result, N_ASCII_GLYPHS);
glyph_string = pango_glyph_string_new ();
for (i = MIN_ASCII_GLYPH; i < MAX_ASCII_GLYPH; i++)
{
const char text[2] = { i, 0 };
- PangoShapeFlags flags = 0;
+ GList *items;
+ PangoItem *item;
+ PangoShapeFlags flags;
+
+ items = pango_itemize (context, PANGO_DIRECTION_LTR, text, 0, 1, NULL);
+ item = items->data;
if (cairo_version () < CAIRO_VERSION_ENCODE (1, 17, 4))
flags = PANGO_SHAPE_ROUND_POSITIONS;
- pango_shape (text, 1,
- text, 1,
- NULL, // ¬_a_hack,
- glyph_string,
- flags);
+ pango_shape_item (item, text, 1, NULL, glyph_string, flags);
+
+ g_list_free_full (items, (GDestroyNotify) pango_item_free);
if (glyph_string->num_glyphs != 1)
{
pango_glyph_string_free (glyph_string);
pango_glyph_string_free (result);
+ g_object_unref (context);
return NULL;
}
+
result->glyphs[i - MIN_ASCII_GLYPH] = glyph_string->glyphs[0];
}
pango_glyph_string_free (glyph_string);
+ g_object_unref (context);
+
return result;
}
diff --git a/gtk/a11y/gtkatspipango.c b/gtk/a11y/gtkatspipango.c
index 5e199fe17e..46ea57f2ef 100644
--- a/gtk/a11y/gtkatspipango.c
+++ b/gtk/a11y/gtkatspipango.c
@@ -304,16 +304,16 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
/* Get attributes */
attr = pango_attr_iterator_get (iter, PANGO_ATTR_FAMILY);
if (attr != NULL)
- g_variant_builder_add (builder, "{ss}", "family-name", attr->str_value);
+ g_variant_builder_add (builder, "{ss}", "family-name", pango_attribute_get_string (attr));
attr = pango_attr_iterator_get (iter, PANGO_ATTR_STYLE);
if (attr != NULL)
- g_variant_builder_add (builder, "{ss}", "style", pango_style_to_string (attr->int_value));
+ g_variant_builder_add (builder, "{ss}", "style", pango_style_to_string (pango_attribute_get_int (attr)));
attr = pango_attr_iterator_get (iter, PANGO_ATTR_WEIGHT);
if (attr != NULL)
{
- value = g_strdup_printf ("%i", attr->int_value);
+ value = g_strdup_printf ("%i", pango_attribute_get_int (attr));
g_variant_builder_add (builder, "{ss}", "weight", value);
g_free (value);
}
@@ -321,17 +321,17 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
attr = pango_attr_iterator_get (iter, PANGO_ATTR_VARIANT);
if (attr != NULL)
g_variant_builder_add (builder, "{ss}", "variant",
- pango_variant_to_string (attr->int_value));
+ pango_variant_to_string (pango_attribute_get_int (attr)));
attr = pango_attr_iterator_get (iter, PANGO_ATTR_STRETCH);
if (attr != NULL)
g_variant_builder_add (builder, "{ss}", "stretch",
- pango_stretch_to_string (attr->int_value));
+ pango_stretch_to_string (pango_attribute_get_int (attr)));
attr = pango_attr_iterator_get (iter, PANGO_ATTR_SIZE);
if (attr != NULL)
{
- value = g_strdup_printf ("%i", attr->int_value / PANGO_SCALE);
+ value = g_strdup_printf ("%i", pango_attribute_get_int (attr) / PANGO_SCALE);
g_variant_builder_add (builder, "{ss}", "size", value);
g_free (value);
}
@@ -339,12 +339,12 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
attr = pango_attr_iterator_get (iter, PANGO_ATTR_UNDERLINE);
if (attr != NULL)
g_variant_builder_add (builder, "{ss}", "underline",
- pango_line_style_to_string (attr->int_value));
+ pango_line_style_to_string (pango_attribute_get_int (attr)));
attr = pango_attr_iterator_get (iter, PANGO_ATTR_STRIKETHROUGH);
if (attr != NULL)
{
- if (attr->int_value)
+ if (pango_attribute_get_int (attr))
val = "true";
else
val = "false";
@@ -354,7 +354,7 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
attr = pango_attr_iterator_get (iter, PANGO_ATTR_RISE);
if (attr != NULL)
{
- value = g_strdup_printf ("%i", attr->int_value);
+ value = g_strdup_printf ("%i", pango_attribute_get_int (attr));
g_variant_builder_add (builder, "{ss}", "rise", value);
g_free (value);
}
@@ -363,13 +363,13 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
if (attr != NULL)
{
g_variant_builder_add (builder, "{ss}", "language",
- pango_language_to_string (attr->lang_value));
+ pango_language_to_string (pango_attribute_get_language (attr)));
}
attr = pango_attr_iterator_get (iter, PANGO_ATTR_SCALE);
if (attr != NULL)
{
- value = g_strdup_printf ("%g", attr->double_value);
+ value = g_strdup_printf ("%g", pango_attribute_get_float (attr));
g_variant_builder_add (builder, "{ss}", "scale", value);
g_free (value);
}
@@ -377,11 +377,12 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
attr = pango_attr_iterator_get (iter, PANGO_ATTR_FOREGROUND);
if (attr != NULL)
{
+ PangoColor *color = pango_attribute_get_color (attr);
value = g_strdup_printf ("%u,%u,%u,%u",
- attr->color_value.red,
- attr->color_value.green,
- attr->color_value.blue,
- attr->color_value.alpha);
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha);
g_variant_builder_add (builder, "{ss}", "fg-color", value);
g_free (value);
}
@@ -389,11 +390,12 @@ gtk_pango_get_run_attributes (PangoLayout *layout,
attr = pango_attr_iterator_get (iter, PANGO_ATTR_BACKGROUND);
if (attr != NULL)
{
+ PangoColor *color = pango_attribute_get_color (attr);
value = g_strdup_printf ("%u,%u,%u,%u",
- attr->color_value.red,
- attr->color_value.green,
- attr->color_value.blue,
- attr->color_value.alpha);
+ color->red,
+ color->green,
+ color->blue,
+ color->alpha);
g_variant_builder_add (builder, "{ss}", "bg-color", value);
g_free (value);
}
diff --git a/gtk/gskpango.c b/gtk/gskpango.c
index 56b0ef561c..25ffa07aac 100644
--- a/gtk/gskpango.c
+++ b/gtk/gskpango.c
@@ -76,20 +76,22 @@ set_color (GskPangoRenderer *crenderer,
}
static void
-gsk_pango_renderer_draw_glyph_item (PangoRenderer *renderer,
- const char *text,
- PangoGlyphItem *glyph_item,
- int x,
- int y)
+gsk_pango_renderer_draw_run (PangoRenderer *renderer,
+ const char *text,
+ PangoRun *run,
+ int x,
+ int y)
{
GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
GdkRGBA color = { 0, 0, 0, 1 };
+ PangoItem *item = pango_run_get_item (run);
+ PangoGlyphString *glyphs = pango_run_get_glyphs (run);
get_color (crenderer, PANGO_RENDER_PART_FOREGROUND, &color);
gtk_snapshot_append_text (crenderer->snapshot,
- pango_analysis_get_font (pango_item_get_analysis (glyph_item->item)),
- glyph_item->glyphs,
+ pango_analysis_get_font (pango_item_get_analysis (item)),
+ glyphs,
&color,
(float) x / PANGO_SCALE,
(float) y / PANGO_SCALE);
@@ -196,74 +198,6 @@ gsk_pango_renderer_draw_error_underline (PangoRenderer *renderer,
gtk_snapshot_pop (crenderer->snapshot);
}
-#if 0
-static void
-gsk_pango_renderer_draw_shape (PangoRenderer *renderer,
- PangoAttrShape *attr,
- int x,
- int y)
-{
- GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
- PangoLines *lines;
- PangoCairoShapeRendererFunc shape_renderer;
- gpointer shape_renderer_data;
- double base_x = (double)x / PANGO_SCALE;
- double base_y = (double)y / PANGO_SCALE;
- gboolean handled = FALSE;
-
- if (crenderer->shape_handler)
- {
- double shape_x = base_x;
- double shape_y = (double) (y + attr->logical_rect.y) / PANGO_SCALE;
-
- if (shape_x != 0 || shape_y != 0)
- {
- gtk_snapshot_save (crenderer->snapshot);
- gtk_snapshot_translate (crenderer->snapshot, &GRAPHENE_POINT_INIT (shape_x, shape_y));
- }
-
- handled = crenderer->shape_handler (attr,
- crenderer->snapshot,
- (double)attr->logical_rect.width / PANGO_SCALE,
- (double)attr->logical_rect.height / PANGO_SCALE);
- if (shape_x != 0 || shape_y != 0)
- gtk_snapshot_restore (crenderer->snapshot);
- }
-
- if (!handled)
- {
- cairo_t *cr;
- PangoRectangle ink_rect;
-
- lines = pango_renderer_get_lines (renderer);
- if (!lines)
- return;
-
- pango_lines_get_extents (lines, &ink_rect, NULL);
- pango_extents_to_pixels (&ink_rect, NULL);
- cr = gtk_snapshot_append_cairo (crenderer->snapshot,
- &GRAPHENE_RECT_INIT (ink_rect.x, ink_rect.y,
- ink_rect.width, ink_rect.height));
- shape_renderer = pango_cairo_context_get_shape_renderer (pango_renderer_get_context (renderer),
- &shape_renderer_data);
-
- if (!shape_renderer)
- {
- cairo_destroy (cr);
- return;
- }
-
- set_color (crenderer, PANGO_RENDER_PART_FOREGROUND, cr);
-
- cairo_move_to (cr, base_x, base_y);
-
- shape_renderer (cr, attr, FALSE, shape_renderer_data);
-
- cairo_destroy (cr);
- }
-}
-#endif
-
static void
text_renderer_set_rgba (GskPangoRenderer *crenderer,
PangoRenderPart part,
@@ -297,8 +231,8 @@ get_item_appearance (PangoItem *item)
{
PangoAttribute *attr = tmp_list->data;
- if (attr->type == gtk_text_attr_appearance_type)
- return (GtkTextAppearance *)attr->pointer_value;
+ if (pango_attribute_type (attr) == gtk_text_attr_appearance_type)
+ return (GtkTextAppearance *)pango_attribute_get_pointer (attr);
tmp_list = tmp_list->next;
}
@@ -390,7 +324,7 @@ gsk_pango_renderer_class_init (GskPangoRendererClass *klass)
{
PangoRendererClass *renderer_class = PANGO_RENDERER_CLASS (klass);
- renderer_class->draw_glyph_item = gsk_pango_renderer_draw_glyph_item;
+ renderer_class->draw_run = gsk_pango_renderer_draw_run;
renderer_class->draw_rectangle = gsk_pango_renderer_draw_rectangle;
renderer_class->draw_trapezoid = gsk_pango_renderer_draw_trapezoid;
renderer_class->draw_error_underline = gsk_pango_renderer_draw_error_underline;
diff --git a/gtk/gskpango.h b/gtk/gskpango.h
index 15f679440b..01280b9a71 100644
--- a/gtk/gskpango.h
+++ b/gtk/gskpango.h
@@ -41,6 +41,11 @@ typedef enum
GSK_PANGO_RENDERER_CURSOR
} GskPangoRendererState;
+typedef gboolean (*GskPangoShapeHandler) (gpointer data,
+ GdkSnapshot *snapshot,
+ double width,
+ double height);
+
/*
* This is a PangoRenderer implementation that translates all the draw calls to
* gsk render nodes, using the GtkSnapshot helper class. Glyphs are translated
@@ -60,6 +65,8 @@ struct _GskPangoRenderer
GskPangoRendererState state;
+ GskPangoShapeHandler shape_handler;
+
guint is_cached_renderer : 1;
};
@@ -71,6 +78,9 @@ struct _GskPangoRendererClass
GType gsk_pango_renderer_get_type (void) G_GNUC_CONST;
void gsk_pango_renderer_set_state (GskPangoRenderer *crenderer,
GskPangoRendererState state);
+void gsk_pango_renderer_set_shape_handler
+ (GskPangoRenderer *crenderer,
+ GskPangoShapeHandler handler);
GskPangoRenderer *gsk_pango_renderer_acquire (void);
void gsk_pango_renderer_release (GskPangoRenderer *crenderer);
diff --git a/gtk/gtkcellrenderertext.c b/gtk/gtkcellrenderertext.c
index 2e96100863..f580356d21 100644
--- a/gtk/gtkcellrenderertext.c
+++ b/gtk/gtkcellrenderertext.c
@@ -1319,9 +1319,7 @@ static void
add_attr (PangoAttrList *attr_list,
PangoAttribute *attr)
{
- attr->start_index = 0;
- attr->end_index = G_MAXINT;
-
+ pango_attribute_set_range (attr, 0, G_MAXINT);
pango_attr_list_insert (attr_list, attr);
}
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 74d6934585..ffea312c9a 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -2039,13 +2039,12 @@ update_feature_example (GtkFontChooserWidget *fontchooser,
pango_font_description_free (desc);
str = g_strconcat (item->name, " 0", NULL);
attr = pango_attr_font_features_new (str);
- attr->start_index = 0;
- attr->end_index = strlen (input);
+ pango_attribute_set_range (attr, 0, strlen (input));
pango_attr_list_insert (attrs, attr);
str = g_strconcat (item->name, " 1", NULL);
attr = pango_attr_font_features_new (str);
- attr->start_index = strlen (input) + strlen (" ⟶ ");
- attr->end_index = attr->start_index + strlen (input);
+ pango_attribute_set_range (attr, strlen (input) + strlen (" ⟶ "),
+ 2 * strlen (input) + strlen (" ⟶ "));
pango_attr_list_insert (attrs, attr);
gtk_label_set_text (GTK_LABEL (item->example), text);
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c
index 404a76df17..85f72b7f74 100644
--- a/gtk/gtkimcontextsimple.c
+++ b/gtk/gtkimcontextsimple.c
@@ -1277,13 +1277,11 @@ gtk_im_context_simple_get_preedit_string (GtkIMContext *context,
PangoAttribute *attr;
attr = pango_attr_underline_new (PANGO_LINE_STYLE_SOLID);
- attr->start_index = 0;
- attr->end_index = s->len;
+ pango_attribute_set_range (attr, 0, s->len);
pango_attr_list_insert (*attrs, attr);
attr = pango_attr_fallback_new (TRUE);
- attr->start_index = 0;
- attr->end_index = s->len;
+ pango_attribute_set_range (attr, 0, s->len);
pango_attr_list_insert (*attrs, attr);
}
}
diff --git a/gtk/gtkimcontextwayland.c b/gtk/gtkimcontextwayland.c
index 720f38404f..d8d374a364 100644
--- a/gtk/gtkimcontextwayland.c
+++ b/gtk/gtkimcontextwayland.c
@@ -643,14 +643,12 @@ gtk_im_context_wayland_get_preedit_string (GtkIMContext *context,
*attrs = pango_attr_list_new ();
attr = pango_attr_underline_new (PANGO_LINE_STYLE_SOLID);
- attr->start_index = 0;
- attr->end_index = len;
+ pango_attribute_set_range (attr, 0, len);
pango_attr_list_insert (*attrs, attr);
/* enable fallback, since IBus will send us things like ⎄ */
attr = pango_attr_fallback_new (TRUE);
- attr->start_index = 0;
- attr->end_index = len;
+ pango_attribute_set_range (attr, 0, len);
pango_attr_list_insert (*attrs, attr);
if (context_wayland->current_preedit.cursor_begin
@@ -658,8 +656,9 @@ gtk_im_context_wayland_get_preedit_string (GtkIMContext *context,
{
/* FIXME: Oh noes, how to highlight while taking into account user preferences? */
PangoAttribute *cursor = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
- cursor->start_index = context_wayland->current_preedit.cursor_begin;
- cursor->end_index = context_wayland->current_preedit.cursor_end;
+ pango_attribute_set_range (cursor,
+ context_wayland->current_preedit.cursor_begin,
+ context_wayland->current_preedit.cursor_end);
pango_attr_list_insert (*attrs, cursor);
}
}
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 5e6c72cd3c..8cbd8fbe31 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -811,9 +811,7 @@ gtk_label_update_layout_attributes (GtkLabel *self,
for (l = attributes; l; l = l->next)
{
attr = l->data;
-
- attr->start_index = link->start;
- attr->end_index = link->end;
+ pango_attribute_set_range (attr, link->start, link->end);
pango_attr_list_insert (attrs, attr);
}
g_slist_free (attributes);
@@ -824,8 +822,7 @@ gtk_label_update_layout_attributes (GtkLabel *self,
link_color->green * 65535,
link_color->blue * 65535,
link_color->alpha * 65535});
- attr->start_index = link->start;
- attr->end_index = link->end;
+ pango_attribute_set_range (attr, link->start, link->end);
pango_attr_list_insert (attrs, attr);
pango_attr_list_unref (link_attrs);
diff --git a/gtk/gtkpango.c b/gtk/gtkpango.c
index 2e8a2b096d..5e6cbeb875 100644
--- a/gtk/gtkpango.c
+++ b/gtk/gtkpango.c
@@ -273,6 +273,7 @@ attribute_from_text (GtkBuilder *builder,
attribute = pango_attr_font_scale_new (g_value_get_enum (&val));
break;
case PANGO_ATTR_INVALID:
+ case PANGO_ATTR_SHAPE:
default:
break;
}
@@ -346,8 +347,7 @@ gtk_pango_attribute_start_element (GtkBuildableParseContext *context,
return;
}
- attr->start_index = start_val;
- attr->end_index = end_val;
+ pango_attribute_set_range (attr, start_val, end_val);
if (!data->attrs)
data->attrs = pango_attr_list_new ();
diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c
index 63f716970c..54f7800480 100644
--- a/gtk/gtktextbuffer.c
+++ b/gtk/gtktextbuffer.c
@@ -4473,7 +4473,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define LANGUAGE_ATTR(attr_name) \
{ \
- const char *language = pango_language_to_string (attr->lang_value); \
+ const char *language = pango_language_to_string (pango_attribute_get_language (attr)); \
g_snprintf (name, 256, "language=%s", language); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -4488,7 +4488,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define STRING_ATTR(attr_name) \
{ \
- const char *string = attr->str_value; \
+ const char *string = pango_attribute_get_string (attr); \
g_snprintf (name, 256, #attr_name "=%s", string); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -4503,7 +4503,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define INT_ATTR(attr_name) \
{ \
- int value = attr->int_value; \
+ int value = pango_attribute_get_int (attr); \
g_snprintf (name, 256, #attr_name "=%d", value); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -4518,7 +4518,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define FONT_ATTR(attr_name) \
{ \
- PangoFontDescription *desc = attr->font_value; \
+ PangoFontDescription *desc = pango_attribute_get_font_desc (attr); \
char *str = pango_font_description_to_string (desc); \
g_snprintf (name, 256, "font-desc=%s", str); \
g_free (str); \
@@ -4535,7 +4535,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define FLOAT_ATTR(attr_name) \
{ \
- float value = attr->double_value; \
+ float value = pango_attribute_get_float (attr); \
g_snprintf (name, 256, #attr_name "=%g", value); \
tag = gtk_text_tag_table_lookup (table, name); \
if (!tag) \
@@ -4550,7 +4550,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
#define RGBA_ATTR(attr_name) \
{ \
- PangoColor *color = &attr->color_value; \
+ PangoColor *color = pango_attribute_get_color (attr); \
GdkRGBA rgba; \
rgba.red = color->red / 65535.; \
rgba.green = color->green / 65535.; \
@@ -4588,7 +4588,7 @@ insert_tags_for_attributes (GtkTextBuffer *buffer,
{
PangoAttribute *attr = l->data;
- switch (attr->type)
+ switch (pango_attribute_type (attr))
{
case PANGO_ATTR_LANGUAGE:
LANGUAGE_ATTR (language);
diff --git a/gtk/gtktextlayout.c b/gtk/gtktextlayout.c
index 86395865a9..afcbbc5566 100644
--- a/gtk/gtktextlayout.c
+++ b/gtk/gtktextlayout.c
@@ -1436,9 +1436,7 @@ gtk_text_attr_appearance_new (const GtkTextAppearance *appearance)
gtk_text_attr_appearance_compare,
NULL);
- attr = pango_attribute_new (gtk_text_attr_appearance_type);
-
- attr->pointer_value = gtk_text_attr_appearance_copy (appearance);
+ attr = pango_attribute_new (gtk_text_attr_appearance_type, appearance);
return attr;
}
@@ -1468,20 +1466,14 @@ add_generic_attrs (GtkTextLayout *layout,
if (appearance->underline != PANGO_LINE_STYLE_NONE)
{
attr = pango_attr_underline_new (appearance->underline);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (appearance->underline_position != PANGO_UNDERLINE_POSITION_NORMAL)
{
attr = pango_attr_underline_position_new (appearance->underline_position);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
@@ -1489,20 +1481,14 @@ add_generic_attrs (GtkTextLayout *layout,
{
convert_pango_color (&color, appearance->underline_rgba);
attr = pango_attr_underline_color_new (&color);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (appearance->overline != PANGO_LINE_STYLE_NONE)
{
attr = pango_attr_overline_new (appearance->overline);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
@@ -1510,20 +1496,14 @@ add_generic_attrs (GtkTextLayout *layout,
{
convert_pango_color (&color, appearance->overline_rgba);
attr = pango_attr_overline_color_new (&color);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (appearance->strikethrough)
{
attr = pango_attr_strikethrough_new (appearance->strikethrough);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
@@ -1531,31 +1511,22 @@ add_generic_attrs (GtkTextLayout *layout,
{
convert_pango_color (&color, appearance->strikethrough_rgba);
attr = pango_attr_strikethrough_color_new (&color);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (appearance->rise != 0)
{
attr = pango_attr_rise_new (appearance->rise);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (!size_only)
{
attr = gtk_text_attr_appearance_new (appearance);
-
- attr->start_index = start;
- attr->end_index = start + byte_count;
- ((GtkTextAppearance *) attr->pointer_value)->is_text = is_text;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
+ ((GtkTextAppearance *) pango_attribute_get_pointer (attr))->is_text = is_text;
pango_attr_list_insert (attrs, attr);
}
}
@@ -1572,54 +1543,61 @@ add_text_attrs (GtkTextLayout *layout,
PangoAttribute **last_fallback_attr)
{
PangoAttribute *attr;
+ guint last_start, last_end;
+
+ if (*last_font_attr)
+ pango_attribute_get_range (*last_font_attr, &last_start, &last_end);
if (*last_font_attr &&
- pango_font_description_equal (style->font, (*last_font_attr)->font_value) &&
- (*last_font_attr)->end_index >= start)
+ pango_font_description_equal (style->font, pango_attribute_get_font_desc (*last_font_attr)) &&
+ last_end >= start)
{
- (*last_font_attr)->start_index = MIN ((*last_font_attr)->start_index, start);
- (*last_font_attr)->end_index = MAX ((*last_font_attr)->end_index, start + byte_count);
+ pango_attribute_set_range (*last_font_attr,
+ MIN (last_start, start),
+ MAX (last_end, start + byte_count));
}
else
{
attr = pango_attr_font_desc_new (style->font);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
*last_font_attr = attr;
}
+ if (*last_scale_attr)
+ pango_attribute_get_range (*last_scale_attr, &last_start, &last_end);
+
if (*last_scale_attr &&
- style->font_scale == (*last_scale_attr)->double_value &&
- (*last_scale_attr)->end_index >= start)
+ style->font_scale == pango_attribute_get_float (*last_scale_attr) &&
+ last_end >= start)
{
- (*last_scale_attr)->start_index = MIN ((*last_scale_attr)->start_index, start);
- (*last_scale_attr)->end_index = MAX ((*last_scale_attr)->end_index, start + byte_count);
+ pango_attribute_set_range (*last_scale_attr,
+ MIN (last_start, start),
+ MAX (last_end, start + byte_count));
}
else if (style->font_scale != 1.0)
{
attr = pango_attr_scale_new (style->font_scale);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
*last_scale_attr = attr;
}
+ if (*last_fallback_attr)
+ pango_attribute_get_range (*last_fallback_attr, &last_start, &last_end);
+
if (*last_fallback_attr &&
- (!style->no_fallback) == (*last_fallback_attr)->int_value &&
- (*last_fallback_attr)->end_index >= start)
+ (!style->no_fallback) == pango_attribute_get_boolean (*last_fallback_attr) &&
+ last_end >= start)
{
- (*last_fallback_attr)->start_index = MIN ((*last_fallback_attr)->start_index, start);
- (*last_fallback_attr)->end_index = MAX ((*last_fallback_attr)->end_index, start + byte_count);
+ pango_attribute_set_range (*last_fallback_attr,
+ MIN (last_start, start),
+ MAX (last_end, start + byte_count));
}
else if (style->no_fallback)
{
attr = pango_attr_fallback_new (!style->no_fallback);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
*last_fallback_attr = attr;
}
@@ -1627,9 +1605,7 @@ add_text_attrs (GtkTextLayout *layout,
if (style->letter_spacing != 0)
{
attr = pango_attr_letter_spacing_new (style->letter_spacing);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
@@ -1639,72 +1615,56 @@ add_text_attrs (GtkTextLayout *layout,
attr = pango_attr_line_height_new_absolute (style->line_height * PANGO_SCALE);
else
attr = pango_attr_line_height_new (style->line_height);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->font_features)
{
attr = pango_attr_font_features_new (style->font_features);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->no_breaks)
{
attr = pango_attr_allow_breaks_new (FALSE);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->show_spaces != PANGO_SHOW_NONE)
{
attr = pango_attr_show_new (style->show_spaces);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->no_hyphens)
{
attr = pango_attr_insert_hyphens_new (FALSE);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->text_transform != PANGO_TEXT_TRANSFORM_NONE)
{
attr = pango_attr_text_transform_new (style->text_transform);
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->word)
{
attr = pango_attr_word_new ();
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
if (style->sentence)
{
attr = pango_attr_sentence_new ();
- attr->start_index = start;
- attr->end_index = start + byte_count;
-
+ pango_attribute_set_range (attr, start, start + byte_count);
pango_attr_list_insert (attrs, attr);
}
}
@@ -1741,11 +1701,9 @@ add_paintable_attrs (GtkTextLayout *layout,
logical_rect.width = width * PANGO_SCALE;
logical_rect.height = height * PANGO_SCALE;
-#if 0
- attr = pango_attr_shape_new_with_data (&logical_rect, &logical_rect,
- paintable->paintable, NULL, NULL);
- attr->start_index = start;
- attr->end_index = start + seg->byte_count;
+ attr = pango_attr_shape_new (&logical_rect, &logical_rect,
+ paintable->paintable, NULL, NULL);
+ pango_attribute_set_range (attr, start, start + seg->byte_count);
pango_attr_list_insert (attrs, attr);
#endif
}
@@ -1782,7 +1740,7 @@ add_child_attrs (GtkTextLayout *layout,
width = req.width;
height = req.height;
- widget = child;
+ widget = child;
break;
}
@@ -1811,11 +1769,9 @@ add_child_attrs (GtkTextLayout *layout,
logical_rect.width = width * PANGO_SCALE;
logical_rect.height = height * PANGO_SCALE;
-#if 0
- attr = pango_attr_shape_new_with_data (&logical_rect, &logical_rect,
- widget, NULL, NULL);
- attr->start_index = start;
- attr->end_index = start + seg->byte_count;
+ attr = pango_attr_shape_new (&logical_rect, &logical_rect,
+ widget, NULL, NULL);
+ pango_attribute_set_range (attr, start, start + seg->byte_count);
pango_attr_list_insert (attrs, attr);
#endif
}
@@ -1920,10 +1876,8 @@ is_shape (PangoRun *run)
{
PangoAttribute *attr = l->data;
-#if 0
- if (attr->klass->type == PANGO_ATTR_SHAPE)
+ if (pango_attribute_type (attr) == PANGO_ATTR_SHAPE)
return TRUE;
-#endif
}
return FALSE;
@@ -2003,10 +1957,11 @@ static void
convert_color (GdkRGBA *result,
PangoAttribute *attr)
{
- result->red = attr->color_value.red / 65535.;
- result->green = attr->color_value.green / 65535.;
- result->blue = attr->color_value.blue / 65535.;
- result->alpha = attr->color_value.alpha / 65535.;
+ PangoColor *color = pango_attribute_get_color (attr);
+ result->red = color->red / 65535.;
+ result->green = color->green / 65535.;
+ result->blue = color->blue / 65535.;
+ result->alpha = color->alpha / 65535.;
}
/* This function is used to convert the preedit string attributes, which are
@@ -2059,7 +2014,7 @@ add_preedit_attrs (GtkTextLayout *layout,
PangoAttribute *attr = tmp_list->data;
GdkRGBA rgba;
- switch ((guint) attr->type)
+ switch (pango_attribute_type (attr))
{
case PANGO_ATTR_FOREGROUND:
convert_color (&rgba, attr);
@@ -2075,7 +2030,7 @@ add_preedit_attrs (GtkTextLayout *layout,
appearance.draw_bg = TRUE;
break;
case PANGO_ATTR_UNDERLINE:
- appearance.underline = attr->int_value;
+ appearance.underline = pango_attribute_get_int (attr);
break;
case PANGO_ATTR_UNDERLINE_COLOR:
convert_color (&rgba, attr);
@@ -2084,7 +2039,7 @@ add_preedit_attrs (GtkTextLayout *layout,
appearance.underline_rgba = gdk_rgba_copy (&rgba);
break;
case PANGO_ATTR_OVERLINE:
- appearance.overline = attr->int_value;
+ appearance.overline = pango_attribute_get_int (attr);
break;
case PANGO_ATTR_OVERLINE_COLOR:
convert_color (&rgba, attr);
@@ -2093,7 +2048,7 @@ add_preedit_attrs (GtkTextLayout *layout,
appearance.overline_rgba = gdk_rgba_copy (&rgba);
break;
case PANGO_ATTR_STRIKETHROUGH:
- appearance.strikethrough = attr->int_value;
+ appearance.strikethrough = pango_attribute_get_int (attr);
break;
case PANGO_ATTR_STRIKETHROUGH_COLOR:
convert_color (&rgba, attr);
@@ -2102,7 +2057,7 @@ add_preedit_attrs (GtkTextLayout *layout,
appearance.strikethrough_rgba = gdk_rgba_copy (&rgba);
break;
case PANGO_ATTR_RISE:
- appearance.rise = attr->int_value;
+ appearance.rise = pango_attribute_get_int (attr);
break;
default:
break;
@@ -2115,17 +2070,13 @@ add_preedit_attrs (GtkTextLayout *layout,
g_slist_free (extra_attrs);
insert_attr = pango_attr_font_desc_new (font_desc);
- insert_attr->start_index = start + offset;
- insert_attr->end_index = end + offset;
-
+ pango_attribute_set_range (insert_attr, start + offset, end + offset);
pango_attr_list_insert (attrs, insert_attr);
if (language)
{
insert_attr = pango_attr_language_new (language);
- insert_attr->start_index = start + offset;
- insert_attr->end_index = end + offset;
-
+ pango_attribute_set_range (insert_attr, start + offset, end + offset);
pango_attr_list_insert (attrs, insert_attr);
}
@@ -4106,6 +4057,21 @@ render_para (GskPangoRenderer *crenderer,
pango_line_iter_free (iter);
}
+static gboolean
+snapshot_shape (gpointer data,
+ GdkSnapshot *snapshot,
+ double width,
+ double height)
+{
+ if (GDK_IS_PAINTABLE (data))
+ {
+ gdk_paintable_snapshot (GDK_PAINTABLE (data), snapshot, width, height);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
void
gtk_text_layout_snapshot (GtkTextLayout *layout,
GtkWidget *widget,
diff --git a/meson.build b/meson.build
index e407260f27..89e82b53dc 100644
--- a/meson.build
+++ b/meson.build
@@ -12,7 +12,7 @@ project('gtk', 'c',
license: 'LGPL-2.1-or-later')
glib_req = '>= 2.66.0'
-pango_req = '>= 1.90.0' # keep this in sync with .gitlab-ci/test-msys.sh
+pango_req = '>= 0.90.0' # keep this in sync with .gitlab-ci/test-msys.sh
harfbuzz_req = '>= 2.6.0'
fribidi_req = '>= 0.19.7'
cairo_req = '>= 1.14.0'
diff --git a/testsuite/gtk/builder.c b/testsuite/gtk/builder.c
index 3c07afc111..1616e2ba4b 100644
--- a/testsuite/gtk/builder.c
+++ b/testsuite/gtk/builder.c
@@ -1905,21 +1905,25 @@ filter_pango_attrs (PangoAttribute *attr,
gpointer data)
{
FoundAttrs *found = (FoundAttrs *)data;
+ guint type = pango_attribute_type (attr);
+ guint start, end;
- if (attr->type == PANGO_ATTR_WEIGHT)
+ pango_attribute_get_range (attr, &start, &end);
+
+ if (type == PANGO_ATTR_WEIGHT)
found->weight = TRUE;
- else if (attr->type == PANGO_ATTR_FOREGROUND)
+ else if (type == PANGO_ATTR_FOREGROUND)
found->foreground = TRUE;
- else if (attr->type == PANGO_ATTR_UNDERLINE)
+ else if (type == PANGO_ATTR_UNDERLINE)
found->underline = TRUE;
/* Make sure optional start/end properties are working */
- else if (attr->type == PANGO_ATTR_SIZE &&
- attr->start_index == 5 &&
- attr->end_index == 10)
+ else if (type == PANGO_ATTR_SIZE &&
+ start == 5 &&
+ end == 10)
found->size = TRUE;
- else if (attr->type == PANGO_ATTR_FONT_DESC)
+ else if (type == PANGO_ATTR_FONT_DESC)
found->font_desc = TRUE;
- else if (attr->type == PANGO_ATTR_LANGUAGE)
+ else if (type == PANGO_ATTR_LANGUAGE)
found->language = TRUE;
return TRUE;
diff --git a/testsuite/gtk/label.c b/testsuite/gtk/label.c
index 0814258ca8..43a22c8dc8 100644
--- a/testsuite/gtk/label.c
+++ b/testsuite/gtk/label.c
@@ -5,46 +5,48 @@ print_attribute (PangoAttribute *attr, GString *string)
{
GEnumClass *class;
GEnumValue *value;
+ guint start, end;
- g_string_append_printf (string, "[%d,%d]", attr->start_index, attr->end_index);
+ pango_attribute_get_range (attr, &start, &end);
+ g_string_append_printf (string, "[%u,%u]", start, end);
class = g_type_class_ref (pango_attr_type_get_type ());
- value = g_enum_get_value (class, attr->type);
+ value = g_enum_get_value (class, pango_attribute_type (attr));
g_string_append_printf (string, "%s=", value->value_nick);
g_type_class_unref (class);
- switch (PANGO_ATTR_TYPE_VALUE_TYPE (attr->type))
+ switch (PANGO_ATTR_VALUE_TYPE (attr))
{
case PANGO_ATTR_VALUE_STRING:
- g_string_append (string, attr->str_value);
+ g_string_append (string, pango_attribute_get_string (attr));
break;
case PANGO_ATTR_VALUE_BOOLEAN:
- g_string_append_printf (string, "%s", attr->boolean_value ? "true" : "false");
+ g_string_append_printf (string, "%s", pango_attribute_get_boolean (attr) ? "true" : "false");
break;
case PANGO_ATTR_VALUE_LANGUAGE:
- g_string_append (string, pango_language_to_string (attr->lang_value));
+ g_string_append (string, pango_language_to_string (pango_attribute_get_language (attr)));
break;
case PANGO_ATTR_VALUE_INT:
- g_string_append_printf (string, "%d", attr->int_value);
+ g_string_append_printf (string, "%d", pango_attribute_get_int (attr));
break;
case PANGO_ATTR_VALUE_FLOAT:
{
char val[20];
- g_ascii_formatd (val, 20, "%f", attr->double_value);
+ g_ascii_formatd (val, 20, "%f", pango_attribute_get_float (attr));
g_string_append (string, val);
}
break;
case PANGO_ATTR_VALUE_FONT_DESC:
{
- char *text = pango_font_description_to_string (attr->font_value);
+ char *text = pango_font_description_to_string (pango_attribute_get_font_desc (attr));
g_string_append (string, text);
g_free (text);
}
break;
case PANGO_ATTR_VALUE_COLOR:
{
- char *text = pango_color_to_string (&attr->color_value);
+ char *text = pango_color_to_string (pango_attribute_get_color (attr));
g_string_append (string, text);
g_free (text);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]