[gtk/pango2: 83/91] Port to pango2 api




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, // &not_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]