[pango/code-reorg: 10/10] Some code reorg




commit 5d36fc27baad02cf773ff9af1fb46cdc97c7788b
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Aug 20 13:27:08 2021 -0400

    Some code reorg
    
    Reshuffle pango-attributes.c internally.

 pango/pango-attributes.c | 1193 +++++++++++++++++++++++-----------------------
 1 file changed, 609 insertions(+), 584 deletions(-)
---
diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c
index 4a141792..5690aeaa 100644
--- a/pango/pango-attributes.c
+++ b/pango/pango-attributes.c
@@ -26,19 +26,8 @@
 #include "pango-attributes-private.h"
 #include "pango-impl-utils.h"
 
-static PangoAttribute *pango_attr_color_new         (const PangoAttrClass *klass,
-                                                     guint16               red,
-                                                     guint16               green,
-                                                     guint16               blue);
-static PangoAttribute *pango_attr_string_new        (const PangoAttrClass *klass,
-                                                     const char           *str);
-static PangoAttribute *pango_attr_int_new           (const PangoAttrClass *klass,
-                                                     int                   value);
-static PangoAttribute *pango_attr_float_new         (const PangoAttrClass *klass,
-                                                     double                value);
-static PangoAttribute *pango_attr_size_new_internal (int                   size,
-                                                     gboolean              absolute);
 
+/* {{{ Generic attribute code */
 
 G_LOCK_DEFINE_STATIC (attr_type);
 static GHashTable *name_map = NULL; /* MT-safe */
@@ -204,6 +193,12 @@ pango_attribute_equal (const PangoAttribute *attr1,
   return attr1->klass->equal (attr1, attr2);
 }
 
+/* }}} */
+/* {{{ Attribute types */
+/* {{{ String attribute */
+static PangoAttribute *pango_attr_string_new (const PangoAttrClass *klass,
+                                              const char           *str);
+
 static PangoAttribute *
 pango_attr_string_copy (const PangoAttribute *attr)
 {
@@ -236,32 +231,8 @@ pango_attr_string_new (const PangoAttrClass *klass,
 
   return (PangoAttribute *)result;
 }
-
-/**
- * pango_attr_family_new:
- * @family: the family or comma-separated list of families
- *
- * Create a new font family attribute.
- *
- * Return value: (transfer full): the newly allocated
- *   `PangoAttribute`, which should be freed with
- *   [method@Pango.Attribute.destroy]
- */
-PangoAttribute *
-pango_attr_family_new (const char *family)
-{
-  static const PangoAttrClass klass = {
-    PANGO_ATTR_FAMILY,
-    pango_attr_string_copy,
-    pango_attr_string_destroy,
-    pango_attr_string_equal
-  };
-
-  g_return_val_if_fail (family != NULL, NULL);
-
-  return pango_attr_string_new (&klass, family);
-}
-
+ /* }}} */
+/* {{{ Language attribute */
 static PangoAttribute *
 pango_attr_language_copy (const PangoAttribute *attr)
 {
@@ -282,35 +253,12 @@ pango_attr_language_equal (const PangoAttribute *attr1,
 {
   return ((PangoAttrLanguage *)attr1)->value == ((PangoAttrLanguage *)attr2)->value;
 }
-
-/**
- * pango_attr_language_new:
- * @language: language tag
- *
- * Create a new language tag attribute.
- *
- * Return value: (transfer full): the newly allocated
- *   `PangoAttribute`, which should be freed with
- *   [method@Pango.Attribute.destroy]
- */
-PangoAttribute *
-pango_attr_language_new (PangoLanguage *language)
-{
-  PangoAttrLanguage *result;
-
-  static const PangoAttrClass klass = {
-    PANGO_ATTR_LANGUAGE,
-    pango_attr_language_copy,
-    pango_attr_language_destroy,
-    pango_attr_language_equal
-  };
-
-  result = g_slice_new (PangoAttrLanguage);
-  pango_attribute_init (&result->attr, &klass);
-  result->value = language;
-
-  return (PangoAttribute *)result;
-}
+/* }}}} */
+/* {{{ Color attribute */
+static PangoAttribute *pango_attr_color_new (const PangoAttrClass *klass,
+                                             guint16               red,
+                                             guint16               green,
+                                             guint16               blue);
 
 static PangoAttribute *
 pango_attr_color_copy (const PangoAttribute *attr)
@@ -357,60 +305,10 @@ pango_attr_color_new (const PangoAttrClass *klass,
 
   return (PangoAttribute *)result;
 }
-
-/**
- * pango_attr_foreground_new:
- * @red: the red value (ranging from 0 to 65535)
- * @green: the green value
- * @blue: the blue value
- *
- * Create a new foreground color attribute.
- *
- * Return value: (transfer full): the newly allocated
- *   `PangoAttribute`, which should be freed with
- *   [method@Pango.Attribute.destroy]
- */
-PangoAttribute *
-pango_attr_foreground_new (guint16 red,
-                           guint16 green,
-                           guint16 blue)
-{
-  static const PangoAttrClass klass = {
-    PANGO_ATTR_FOREGROUND,
-    pango_attr_color_copy,
-    pango_attr_color_destroy,
-    pango_attr_color_equal
-  };
-
-  return pango_attr_color_new (&klass, red, green, blue);
-}
-
-/**
- * pango_attr_background_new:
- * @red: the red value (ranging from 0 to 65535)
- * @green: the green value
- * @blue: the blue value
- *
- * Create a new background color attribute.
- *
- * Return value: (transfer full): the newly allocated
- *   `PangoAttribute`, which should be freed with
- *   [method@Pango.Attribute.destroy]
- */
-PangoAttribute *
-pango_attr_background_new (guint16 red,
-                           guint16 green,
-                           guint16 blue)
-{
-  static const PangoAttrClass klass = {
-    PANGO_ATTR_BACKGROUND,
-    pango_attr_color_copy,
-    pango_attr_color_destroy,
-    pango_attr_color_equal
-  };
-
-  return pango_attr_color_new (&klass, red, green, blue);
-}
+/* }}}} */
+/* {{{ Integer attribute */
+static PangoAttribute *pango_attr_int_new (const PangoAttrClass *klass,
+                                           int                   value);
 
 static PangoAttribute *
 pango_attr_int_copy (const PangoAttribute *attr)
@@ -448,6 +346,10 @@ pango_attr_int_new (const PangoAttrClass *klass,
 
   return (PangoAttribute *)result;
 }
+/* }}} */
+/* {{{ Float attribute */
+static PangoAttribute *pango_attr_float_new (const PangoAttrClass *klass,
+                                             double                value);
 
 static PangoAttribute *
 pango_attr_float_copy (const PangoAttribute *attr)
@@ -475,7 +377,7 @@ pango_attr_float_equal (const PangoAttribute *attr1,
   return (float_attr1->value == float_attr2->value);
 }
 
-static PangoAttribute*
+static PangoAttribute *
 pango_attr_float_new  (const PangoAttrClass *klass,
                        double                value)
 {
@@ -485,6 +387,10 @@ pango_attr_float_new  (const PangoAttrClass *klass,
 
   return (PangoAttribute *)result;
 }
+/* }}} */
+/* {{{ Size attribute */
+static PangoAttribute *pango_attr_size_new_internal (int      size,
+                                                     gboolean absolute);
 
 static PangoAttribute *
 pango_attr_size_copy (const PangoAttribute *attr)
@@ -541,69 +447,255 @@ pango_attr_size_new_internal (int size,
 
   return (PangoAttribute *)result;
 }
+/* }}} */
+/* {{{ Font description attribute */
+static PangoAttribute *
+pango_attr_font_desc_copy (const PangoAttribute *attr)
+{
+  const PangoAttrFontDesc *desc_attr = (const PangoAttrFontDesc *)attr;
+
+  return pango_attr_font_desc_new (desc_attr->desc);
+}
+
+static void
+pango_attr_font_desc_destroy (PangoAttribute *attr)
+{
+  PangoAttrFontDesc *desc_attr = (PangoAttrFontDesc *)attr;
+
+  pango_font_description_free (desc_attr->desc);
+  g_slice_free (PangoAttrFontDesc, desc_attr);
+}
+
+static gboolean
+pango_attr_font_desc_equal (const PangoAttribute *attr1,
+                            const PangoAttribute *attr2)
+{
+  const PangoAttrFontDesc *desc_attr1 = (const PangoAttrFontDesc *)attr1;
+  const PangoAttrFontDesc *desc_attr2 = (const PangoAttrFontDesc *)attr2;
+
+  return pango_font_description_get_set_fields (desc_attr1->desc) ==
+         pango_font_description_get_set_fields (desc_attr2->desc) &&
+         pango_font_description_equal (desc_attr1->desc, desc_attr2->desc);
+}
+/* }}} */
+/* {{{ Shape attribute */
+static PangoAttribute *
+pango_attr_shape_copy (const PangoAttribute *attr)
+{
+  const PangoAttrShape *shape_attr = (PangoAttrShape *)attr;
+  gpointer data;
+
+  if (shape_attr->copy_func)
+    data = shape_attr->copy_func (shape_attr->data);
+  else
+    data = shape_attr->data;
+
+  return pango_attr_shape_new_with_data (&shape_attr->ink_rect, &shape_attr->logical_rect,
+                                         data, shape_attr->copy_func, shape_attr->destroy_func);
+}
+
+static void
+pango_attr_shape_destroy (PangoAttribute *attr)
+{
+  PangoAttrShape *shape_attr = (PangoAttrShape *)attr;
+
+  if (shape_attr->destroy_func)
+    shape_attr->destroy_func (shape_attr->data);
+
+  g_slice_free (PangoAttrShape, shape_attr);
+}
+
+static gboolean
+pango_attr_shape_equal (const PangoAttribute *attr1,
+                        const PangoAttribute *attr2)
+{
+  const PangoAttrShape *shape_attr1 = (const PangoAttrShape *)attr1;
+  const PangoAttrShape *shape_attr2 = (const PangoAttrShape *)attr2;
+
+  return (shape_attr1->logical_rect.x == shape_attr2->logical_rect.x &&
+          shape_attr1->logical_rect.y == shape_attr2->logical_rect.y &&
+          shape_attr1->logical_rect.width == shape_attr2->logical_rect.width &&
+          shape_attr1->logical_rect.height == shape_attr2->logical_rect.height &&
+          shape_attr1->ink_rect.x == shape_attr2->ink_rect.x &&
+          shape_attr1->ink_rect.y == shape_attr2->ink_rect.y &&
+          shape_attr1->ink_rect.width == shape_attr2->ink_rect.width &&
+          shape_attr1->ink_rect.height == shape_attr2->ink_rect.height &&
+          shape_attr1->data == shape_attr2->data);
+}
+/* }}} */
+/* }}} */
+/* {{{ Public API */
 
 /**
- * pango_attr_size_new:
- * @size: the font size, in %PANGO_SCALE-ths of a point
+ * pango_attr_family_new:
+ * @family: the family or comma-separated list of families
  *
- * Create a new font-size attribute in fractional points.
+ * Create a new font family attribute.
  *
  * Return value: (transfer full): the newly allocated
  *   `PangoAttribute`, which should be freed with
  *   [method@Pango.Attribute.destroy]
  */
 PangoAttribute *
-pango_attr_size_new (int size)
+pango_attr_family_new (const char *family)
 {
-  return pango_attr_size_new_internal (size, FALSE);
+  static const PangoAttrClass klass = {
+    PANGO_ATTR_FAMILY,
+    pango_attr_string_copy,
+    pango_attr_string_destroy,
+    pango_attr_string_equal
+  };
+
+  g_return_val_if_fail (family != NULL, NULL);
+
+  return pango_attr_string_new (&klass, family);
 }
 
 /**
- * pango_attr_size_new_absolute:
- * @size: the font size, in %PANGO_SCALE-ths of a device unit
+ * pango_attr_language_new:
+ * @language: language tag
  *
- * Create a new font-size attribute in device units.
+ * Create a new language tag attribute.
  *
  * Return value: (transfer full): the newly allocated
  *   `PangoAttribute`, which should be freed with
  *   [method@Pango.Attribute.destroy]
- *
- * Since: 1.8
  */
 PangoAttribute *
-pango_attr_size_new_absolute (int size)
+pango_attr_language_new (PangoLanguage *language)
 {
-  return pango_attr_size_new_internal (size, TRUE);
+  PangoAttrLanguage *result;
+
+  static const PangoAttrClass klass = {
+    PANGO_ATTR_LANGUAGE,
+    pango_attr_language_copy,
+    pango_attr_language_destroy,
+    pango_attr_language_equal
+  };
+
+  result = g_slice_new (PangoAttrLanguage);
+  pango_attribute_init (&result->attr, &klass);
+  result->value = language;
+
+  return (PangoAttribute *)result;
 }
 
 /**
- * pango_attr_style_new:
- * @style: the slant style
+ * pango_attr_foreground_new:
+ * @red: the red value (ranging from 0 to 65535)
+ * @green: the green value
+ * @blue: the blue value
  *
- * Create a new font slant style attribute.
+ * Create a new foreground color attribute.
  *
  * Return value: (transfer full): the newly allocated
  *   `PangoAttribute`, which should be freed with
  *   [method@Pango.Attribute.destroy]
  */
 PangoAttribute *
-pango_attr_style_new (PangoStyle style)
+pango_attr_foreground_new (guint16 red,
+                           guint16 green,
+                           guint16 blue)
 {
   static const PangoAttrClass klass = {
-    PANGO_ATTR_STYLE,
-    pango_attr_int_copy,
-    pango_attr_int_destroy,
-    pango_attr_int_equal
+    PANGO_ATTR_FOREGROUND,
+    pango_attr_color_copy,
+    pango_attr_color_destroy,
+    pango_attr_color_equal
   };
 
-  return pango_attr_int_new (&klass, (int)style);
+  return pango_attr_color_new (&klass, red, green, blue);
 }
 
 /**
- * pango_attr_weight_new:
- * @weight: the weight
+ * pango_attr_background_new:
+ * @red: the red value (ranging from 0 to 65535)
+ * @green: the green value
+ * @blue: the blue value
  *
- * Create a new font weight attribute.
+ * Create a new background color attribute.
+ *
+ * Return value: (transfer full): the newly allocated
+ *   `PangoAttribute`, which should be freed with
+ *   [method@Pango.Attribute.destroy]
+ */
+PangoAttribute *
+pango_attr_background_new (guint16 red,
+                           guint16 green,
+                           guint16 blue)
+{
+  static const PangoAttrClass klass = {
+    PANGO_ATTR_BACKGROUND,
+    pango_attr_color_copy,
+    pango_attr_color_destroy,
+    pango_attr_color_equal
+  };
+
+  return pango_attr_color_new (&klass, red, green, blue);
+}
+
+/**
+ * pango_attr_size_new:
+ * @size: the font size, in %PANGO_SCALE-ths of a point
+ *
+ * Create a new font-size attribute in fractional points.
+ *
+ * Return value: (transfer full): the newly allocated
+ *   `PangoAttribute`, which should be freed with
+ *   [method@Pango.Attribute.destroy]
+ */
+PangoAttribute *
+pango_attr_size_new (int size)
+{
+  return pango_attr_size_new_internal (size, FALSE);
+}
+
+/**
+ * pango_attr_size_new_absolute:
+ * @size: the font size, in %PANGO_SCALE-ths of a device unit
+ *
+ * Create a new font-size attribute in device units.
+ *
+ * Return value: (transfer full): the newly allocated
+ *   `PangoAttribute`, which should be freed with
+ *   [method@Pango.Attribute.destroy]
+ *
+ * Since: 1.8
+ */
+PangoAttribute *
+pango_attr_size_new_absolute (int size)
+{
+  return pango_attr_size_new_internal (size, TRUE);
+}
+
+/**
+ * pango_attr_style_new:
+ * @style: the slant style
+ *
+ * Create a new font slant style attribute.
+ *
+ * Return value: (transfer full): the newly allocated
+ *   `PangoAttribute`, which should be freed with
+ *   [method@Pango.Attribute.destroy]
+ */
+PangoAttribute *
+pango_attr_style_new (PangoStyle style)
+{
+  static const PangoAttrClass klass = {
+    PANGO_ATTR_STYLE,
+    pango_attr_int_copy,
+    pango_attr_int_destroy,
+    pango_attr_int_equal
+  };
+
+  return pango_attr_int_new (&klass, (int)style);
+}
+
+/**
+ * pango_attr_weight_new:
+ * @weight: the weight
+ *
+ * Create a new font weight attribute.
  *
  * Return value: (transfer full): the newly allocated
  *   `PangoAttribute`, which should be freed with
@@ -667,35 +759,6 @@ pango_attr_stretch_new (PangoStretch  stretch)
   return pango_attr_int_new (&klass, (int)stretch);
 }
 
-static PangoAttribute *
-pango_attr_font_desc_copy (const PangoAttribute *attr)
-{
-  const PangoAttrFontDesc *desc_attr = (const PangoAttrFontDesc *)attr;
-
-  return pango_attr_font_desc_new (desc_attr->desc);
-}
-
-static void
-pango_attr_font_desc_destroy (PangoAttribute *attr)
-{
-  PangoAttrFontDesc *desc_attr = (PangoAttrFontDesc *)attr;
-
-  pango_font_description_free (desc_attr->desc);
-  g_slice_free (PangoAttrFontDesc, desc_attr);
-}
-
-static gboolean
-pango_attr_font_desc_equal (const PangoAttribute *attr1,
-                            const PangoAttribute *attr2)
-{
-  const PangoAttrFontDesc *desc_attr1 = (const PangoAttrFontDesc *)attr1;
-  const PangoAttrFontDesc *desc_attr2 = (const PangoAttrFontDesc *)attr2;
-
-  return pango_font_description_get_set_fields (desc_attr1->desc) ==
-         pango_font_description_get_set_fields (desc_attr2->desc) &&
-         pango_font_description_equal (desc_attr1->desc, desc_attr2->desc);
-}
-
 /**
  * pango_attr_font_desc_new:
  * @desc: the font description
@@ -726,7 +789,6 @@ pango_attr_font_desc_new (const PangoFontDescription *desc)
   return (PangoAttribute *)result;
 }
 
-
 /**
  * pango_attr_underline_new:
  * @underline: the underline style
@@ -944,50 +1006,6 @@ pango_attr_letter_spacing_new (int letter_spacing)
   return pango_attr_int_new (&klass, letter_spacing);
 }
 
-static PangoAttribute *
-pango_attr_shape_copy (const PangoAttribute *attr)
-{
-  const PangoAttrShape *shape_attr = (PangoAttrShape *)attr;
-  gpointer data;
-
-  if (shape_attr->copy_func)
-    data = shape_attr->copy_func (shape_attr->data);
-  else
-    data = shape_attr->data;
-
-  return pango_attr_shape_new_with_data (&shape_attr->ink_rect, &shape_attr->logical_rect,
-                                         data, shape_attr->copy_func, shape_attr->destroy_func);
-}
-
-static void
-pango_attr_shape_destroy (PangoAttribute *attr)
-{
-  PangoAttrShape *shape_attr = (PangoAttrShape *)attr;
-
-  if (shape_attr->destroy_func)
-    shape_attr->destroy_func (shape_attr->data);
-
-  g_slice_free (PangoAttrShape, shape_attr);
-}
-
-static gboolean
-pango_attr_shape_equal (const PangoAttribute *attr1,
-                        const PangoAttribute *attr2)
-{
-  const PangoAttrShape *shape_attr1 = (const PangoAttrShape *)attr1;
-  const PangoAttrShape *shape_attr2 = (const PangoAttrShape *)attr2;
-
-  return (shape_attr1->logical_rect.x == shape_attr2->logical_rect.x &&
-          shape_attr1->logical_rect.y == shape_attr2->logical_rect.y &&
-          shape_attr1->logical_rect.width == shape_attr2->logical_rect.width &&
-          shape_attr1->logical_rect.height == shape_attr2->logical_rect.height &&
-          shape_attr1->ink_rect.x == shape_attr2->ink_rect.x &&
-          shape_attr1->ink_rect.y == shape_attr2->ink_rect.y &&
-          shape_attr1->ink_rect.width == shape_attr2->ink_rect.width &&
-          shape_attr1->ink_rect.height == shape_attr2->ink_rect.height &&
-          shape_attr1->data == shape_attr2->data);
-}
-
 /**
  * pango_attr_shape_new_with_data:
  * @ink_rect: ink rectangle to assign to each character
@@ -1393,74 +1411,330 @@ pango_attr_line_height_new_absolute (int height)
 
   return pango_attr_int_new (&klass, height);
 }
-/*
- * Attribute List
- */
-
-G_DEFINE_BOXED_TYPE (PangoAttrList, pango_attr_list,
-                     pango_attr_list_copy,
-                     pango_attr_list_unref);
-
-void
-_pango_attr_list_init (PangoAttrList *list)
-{
-  list->ref_count = 1;
-  list->attributes = NULL;
-}
+/* }}} */
+/* {{{ Binding helpers */
 
 /**
- * pango_attr_list_new:
+ * pango_attribute_as_int:
+ * @attr: A `PangoAttribute` such as weight
  *
- * Create a new empty attribute list with a reference
- * count of one.
+ * Returns the attribute cast to `PangoAttrInt`.
  *
- * Return value: (transfer full): the newly allocated
- *   `PangoAttrList`, which should be freed with
- *   [method@Pango.AttrList.unref]
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrInt`,
+ *   or %NULL if it's not an integer attribute
+ *
+ * Since: 1.50
  */
-PangoAttrList *
-pango_attr_list_new (void)
+PangoAttrInt *
+pango_attribute_as_int (PangoAttribute *attr)
 {
-  PangoAttrList *list = g_slice_new (PangoAttrList);
-
-  _pango_attr_list_init (list);
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_STYLE:
+    case PANGO_ATTR_WEIGHT:
+    case PANGO_ATTR_VARIANT:
+    case PANGO_ATTR_STRETCH:
+    case PANGO_ATTR_UNDERLINE:
+    case PANGO_ATTR_STRIKETHROUGH:
+    case PANGO_ATTR_RISE:
+    case PANGO_ATTR_FALLBACK:
+    case PANGO_ATTR_LETTER_SPACING:
+    case PANGO_ATTR_GRAVITY:
+    case PANGO_ATTR_GRAVITY_HINT:
+    case PANGO_ATTR_FOREGROUND_ALPHA:
+    case PANGO_ATTR_BACKGROUND_ALPHA:
+    case PANGO_ATTR_ALLOW_BREAKS:
+    case PANGO_ATTR_SHOW:
+    case PANGO_ATTR_INSERT_HYPHENS:
+    case PANGO_ATTR_OVERLINE:
+      return (PangoAttrInt *)attr;
 
-  return list;
+    default:
+      return NULL;
+    }
 }
 
 /**
- * pango_attr_list_ref:
- * @list: (nullable): a `PangoAttrList`
+ * pango_attribute_as_float:
+ * @attr: A `PangoAttribute` such as scale
  *
- * Increase the reference count of the given attribute
- * list by one.
+ * Returns the attribute cast to `PangoAttrFloat`.
  *
- * Return value: The attribute list passed in
+ * This is mainly useful for language bindings.
  *
- * Since: 1.10
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrFloat`,
+ *   or %NULL if it's not a floating point attribute
+ *
+ * Since: 1.50
  */
-PangoAttrList *
-pango_attr_list_ref (PangoAttrList *list)
+PangoAttrFloat *
+pango_attribute_as_float (PangoAttribute *attr)
 {
-  if (list == NULL)
-    return NULL;
-
-  g_atomic_int_inc ((int *) &list->ref_count);
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_SCALE:
+    case PANGO_ATTR_LINE_HEIGHT:
+      return (PangoAttrFloat *)attr;
 
-  return list;
+    default:
+      return NULL;
+    }
 }
 
-void
-_pango_attr_list_destroy (PangoAttrList *list)
-{
-  guint i, p;
-
-  if (!list->attributes)
-    return;
-
-  for (i = 0, p = list->attributes->len; i < p; i++)
-    {
-      PangoAttribute *attr = g_ptr_array_index (list->attributes, i);
+/**
+ * pango_attribute_as_string:
+ * @attr: A `PangoAttribute` such as family
+ *
+ * Returns the attribute cast to `PangoAttrString`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrString`,
+ *   or %NULL if it's not a string attribute
+ */
+PangoAttrString *
+pango_attribute_as_string (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_FAMILY:
+      return (PangoAttrString *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/**
+ * pango_attribute_as_size:
+ * @attr: A `PangoAttribute` representing a size
+ *
+ * Returns the attribute cast to `PangoAttrSize`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrSize`,
+ *   or NULL if it's not a size attribute
+ *
+ * Since: 1.50
+ */
+PangoAttrSize *
+pango_attribute_as_size (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_SIZE:
+    case PANGO_ATTR_ABSOLUTE_SIZE:
+      return (PangoAttrSize *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/**
+ * pango_attribute_as_color:
+ * @attr: A `PangoAttribute` such as foreground
+ *
+ * Returns the attribute cast to `PangoAttrColor`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrColor`,
+ *   or %NULL if it's not a color attribute
+ *
+ * Since: 1.50
+ */
+PangoAttrColor *
+pango_attribute_as_color (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_FOREGROUND:
+    case PANGO_ATTR_BACKGROUND:
+    case PANGO_ATTR_UNDERLINE_COLOR:
+    case PANGO_ATTR_STRIKETHROUGH_COLOR:
+    case PANGO_ATTR_OVERLINE_COLOR:
+      return (PangoAttrColor *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/**
+ * pango_attribute_as_font_desc:
+ * @attr: A `PangoAttribute` representing a font description
+ *
+ * Returns the attribute cast to `PangoAttrFontDesc`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrFontDesc`,
+ *   or %NULL if it's not a font description attribute
+ *
+ * Since: 1.50
+ */
+PangoAttrFontDesc *
+pango_attribute_as_font_desc (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_FONT_DESC:
+      return (PangoAttrFontDesc *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/**
+ * pango_attribute_as_font_features:
+ * @attr: A `PangoAttribute` representing font features
+ *
+ * Returns the attribute cast to `PangoAttrFontFeatures`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrFontFeatures`,
+ *   or %NULL if it's not a font features attribute
+ *
+ * Since: 1.50
+ */
+PangoAttrFontFeatures *
+pango_attribute_as_font_features (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_FONT_FEATURES:
+      return (PangoAttrFontFeatures *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/**
+ * pango_attribute_as_language:
+ * @attr: A `PangoAttribute` representing a language
+ *
+ * Returns the attribute cast to `PangoAttrLanguage`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrLanguage`,
+ *   or %NULL if it's not a language attribute
+ *
+ * Since: 1.50
+ */
+PangoAttrLanguage *
+pango_attribute_as_language (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_LANGUAGE:
+      return (PangoAttrLanguage *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/**
+ * pango_attribute_as_shape:
+ * @attr: A `PangoAttribute` representing a shape
+ *
+ * Returns the attribute cast to `PangoAttrShape`.
+ *
+ * This is mainly useful for language bindings.
+ *
+ * Returns: (nullable) (transfer none): The attribute as `PangoAttrShape`,
+ *   or %NULL if it's not a shape attribute
+ *
+ * Since: 1.50
+ */
+PangoAttrShape *
+pango_attribute_as_shape (PangoAttribute *attr)
+{
+  switch (attr->klass->type)
+    {
+    case PANGO_ATTR_SHAPE:
+      return (PangoAttrShape *)attr;
+
+    default:
+      return NULL;
+    }
+}
+
+/* }}} */
+/* {{{ Attribute List */
+
+G_DEFINE_BOXED_TYPE (PangoAttrList, pango_attr_list,
+                     pango_attr_list_copy,
+                     pango_attr_list_unref);
+
+void
+_pango_attr_list_init (PangoAttrList *list)
+{
+  list->ref_count = 1;
+  list->attributes = NULL;
+}
+
+/**
+ * pango_attr_list_new:
+ *
+ * Create a new empty attribute list with a reference
+ * count of one.
+ *
+ * Return value: (transfer full): the newly allocated
+ *   `PangoAttrList`, which should be freed with
+ *   [method@Pango.AttrList.unref]
+ */
+PangoAttrList *
+pango_attr_list_new (void)
+{
+  PangoAttrList *list = g_slice_new (PangoAttrList);
+
+  _pango_attr_list_init (list);
+
+  return list;
+}
+
+/**
+ * pango_attr_list_ref:
+ * @list: (nullable): a `PangoAttrList`
+ *
+ * Increase the reference count of the given attribute
+ * list by one.
+ *
+ * Return value: The attribute list passed in
+ *
+ * Since: 1.10
+ */
+PangoAttrList *
+pango_attr_list_ref (PangoAttrList *list)
+{
+  if (list == NULL)
+    return NULL;
+
+  g_atomic_int_inc ((int *) &list->ref_count);
+
+  return list;
+}
+
+void
+_pango_attr_list_destroy (PangoAttrList *list)
+{
+  guint i, p;
+
+  if (!list->attributes)
+    return;
+
+  for (i = 0, p = list->attributes->len; i < p; i++)
+    {
+      PangoAttribute *attr = g_ptr_array_index (list->attributes, i);
 
       attr->klass->destroy (attr);
     }
@@ -2043,12 +2317,69 @@ _pango_attr_list_has_attributes (const PangoAttrList *list)
   return list && list->attributes != NULL && list->attributes->len > 0;
 }
 
-G_DEFINE_BOXED_TYPE (PangoAttrIterator,
-                     pango_attr_iterator,
-                     pango_attr_iterator_copy,
-                     pango_attr_iterator_destroy)
-
-void
+/**
+ * pango_attr_list_filter:
+ * @list: a `PangoAttrList`
+ * @func: (scope call) (closure data): callback function;
+ *   returns %TRUE if an attribute should be filtered out
+ * @data: (closure): Data to be passed to @func
+ *
+ * Given a `PangoAttrList` and callback function, removes
+ * any elements of @list for which @func returns %TRUE and
+ * inserts them into a new list.
+ *
+ * Return value: (transfer full) (nullable): the new
+ *   `PangoAttrList` or %NULL if no attributes of the
+ *   given types were found
+ *
+ * Since: 1.2
+ */
+PangoAttrList *
+pango_attr_list_filter (PangoAttrList       *list,
+                        PangoAttrFilterFunc  func,
+                        gpointer             data)
+
+{
+  PangoAttrList *new = NULL;
+  guint i, p;
+
+  g_return_val_if_fail (list != NULL, NULL);
+
+  if (!list->attributes || list->attributes->len == 0)
+    return NULL;
+
+  for (i = 0, p = list->attributes->len; i < p; i++)
+    {
+      PangoAttribute *tmp_attr = g_ptr_array_index (list->attributes, i);
+
+      if ((*func) (tmp_attr, data))
+        {
+          g_ptr_array_remove_index (list->attributes, i);
+          i--; /* Need to look at this index again */
+          p--;
+
+          if (G_UNLIKELY (!new))
+            {
+              new = pango_attr_list_new ();
+              new->attributes = g_ptr_array_new ();
+            }
+
+          g_ptr_array_add (new->attributes, tmp_attr);
+        }
+    }
+
+  return new;
+}
+
+/* }}} */
+/* {{{ Attribute Iterator */
+
+G_DEFINE_BOXED_TYPE (PangoAttrIterator,
+                     pango_attr_iterator,
+                     pango_attr_iterator_copy,
+                     pango_attr_iterator_destroy)
+
+void
 _pango_attr_list_get_iterator (PangoAttrList     *list,
                                PangoAttrIterator *iterator)
 {
@@ -2447,60 +2778,6 @@ pango_attr_iterator_get_font (PangoAttrIterator     *iterator,
     }
 }
 
-/**
- * pango_attr_list_filter:
- * @list: a `PangoAttrList`
- * @func: (scope call) (closure data): callback function;
- *   returns %TRUE if an attribute should be filtered out
- * @data: (closure): Data to be passed to @func
- *
- * Given a `PangoAttrList` and callback function, removes
- * any elements of @list for which @func returns %TRUE and
- * inserts them into a new list.
- *
- * Return value: (transfer full) (nullable): the new
- *   `PangoAttrList` or %NULL if no attributes of the
- *   given types were found
- *
- * Since: 1.2
- */
-PangoAttrList *
-pango_attr_list_filter (PangoAttrList       *list,
-                        PangoAttrFilterFunc  func,
-                        gpointer             data)
-
-{
-  PangoAttrList *new = NULL;
-  guint i, p;
-
-  g_return_val_if_fail (list != NULL, NULL);
-
-  if (!list->attributes || list->attributes->len == 0)
-    return NULL;
-
-  for (i = 0, p = list->attributes->len; i < p; i++)
-    {
-      PangoAttribute *tmp_attr = g_ptr_array_index (list->attributes, i);
-
-      if ((*func) (tmp_attr, data))
-        {
-          g_ptr_array_remove_index (list->attributes, i);
-          i--; /* Need to look at this index again */
-          p--;
-
-          if (G_UNLIKELY (!new))
-            {
-              new = pango_attr_list_new ();
-              new->attributes = g_ptr_array_new ();
-            }
-
-          g_ptr_array_add (new->attributes, tmp_attr);
-        }
-    }
-
-  return new;
-}
-
 /**
  * pango_attr_iterator_get_attrs:
  * @iterator: a `PangoAttrIterator`
@@ -2570,258 +2847,6 @@ pango_attr_iterator_advance (PangoAttrIterator *iterator,
 
   return TRUE;
 }
+/* }}} */
 
-
-/**
- * pango_attribute_as_int:
- * @attr: A `PangoAttribute` such as weight
- *
- * Returns the attribute cast to `PangoAttrInt`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrInt`,
- *   or %NULL if it's not an integer attribute
- *
- * Since: 1.50
- */
-PangoAttrInt *
-pango_attribute_as_int (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_STYLE:
-    case PANGO_ATTR_WEIGHT:
-    case PANGO_ATTR_VARIANT:
-    case PANGO_ATTR_STRETCH:
-    case PANGO_ATTR_UNDERLINE:
-    case PANGO_ATTR_STRIKETHROUGH:
-    case PANGO_ATTR_RISE:
-    case PANGO_ATTR_FALLBACK:
-    case PANGO_ATTR_LETTER_SPACING:
-    case PANGO_ATTR_GRAVITY:
-    case PANGO_ATTR_GRAVITY_HINT:
-    case PANGO_ATTR_FOREGROUND_ALPHA:
-    case PANGO_ATTR_BACKGROUND_ALPHA:
-    case PANGO_ATTR_ALLOW_BREAKS:
-    case PANGO_ATTR_SHOW:
-    case PANGO_ATTR_INSERT_HYPHENS:
-    case PANGO_ATTR_OVERLINE:
-      return (PangoAttrInt *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_float:
- * @attr: A `PangoAttribute` such as scale
- *
- * Returns the attribute cast to `PangoAttrFloat`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrFloat`,
- *   or %NULL if it's not a floating point attribute
- *
- * Since: 1.50
- */
-PangoAttrFloat *
-pango_attribute_as_float (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_SCALE:
-    case PANGO_ATTR_LINE_HEIGHT:
-      return (PangoAttrFloat *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_string:
- * @attr: A `PangoAttribute` such as family
- *
- * Returns the attribute cast to `PangoAttrString`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrString`,
- *   or %NULL if it's not a string attribute
- */
-PangoAttrString *
-pango_attribute_as_string (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_FAMILY:
-      return (PangoAttrString *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_size:
- * @attr: A `PangoAttribute` representing a size
- *
- * Returns the attribute cast to `PangoAttrSize`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrSize`,
- *   or NULL if it's not a size attribute
- *
- * Since: 1.50
- */
-PangoAttrSize *
-pango_attribute_as_size (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_SIZE:
-    case PANGO_ATTR_ABSOLUTE_SIZE:
-      return (PangoAttrSize *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_color:
- * @attr: A `PangoAttribute` such as foreground
- *
- * Returns the attribute cast to `PangoAttrColor`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrColor`,
- *   or %NULL if it's not a color attribute
- *
- * Since: 1.50
- */
-PangoAttrColor *
-pango_attribute_as_color (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_FOREGROUND:
-    case PANGO_ATTR_BACKGROUND:
-    case PANGO_ATTR_UNDERLINE_COLOR:
-    case PANGO_ATTR_STRIKETHROUGH_COLOR:
-    case PANGO_ATTR_OVERLINE_COLOR:
-      return (PangoAttrColor *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_font_desc:
- * @attr: A `PangoAttribute` representing a font description
- *
- * Returns the attribute cast to `PangoAttrFontDesc`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrFontDesc`,
- *   or %NULL if it's not a font description attribute
- *
- * Since: 1.50
- */
-PangoAttrFontDesc *
-pango_attribute_as_font_desc (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_FONT_DESC:
-      return (PangoAttrFontDesc *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_font_features:
- * @attr: A `PangoAttribute` representing font features
- *
- * Returns the attribute cast to `PangoAttrFontFeatures`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrFontFeatures`,
- *   or %NULL if it's not a font features attribute
- *
- * Since: 1.50
- */
-PangoAttrFontFeatures *
-pango_attribute_as_font_features (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_FONT_FEATURES:
-      return (PangoAttrFontFeatures *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_language:
- * @attr: A `PangoAttribute` representing a language
- *
- * Returns the attribute cast to `PangoAttrLanguage`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrLanguage`,
- *   or %NULL if it's not a language attribute
- *
- * Since: 1.50
- */
-PangoAttrLanguage *
-pango_attribute_as_language (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_LANGUAGE:
-      return (PangoAttrLanguage *)attr;
-
-    default:
-      return NULL;
-    }
-}
-
-/**
- * pango_attribute_as_shape:
- * @attr: A `PangoAttribute` representing a shape
- *
- * Returns the attribute cast to `PangoAttrShape`.
- *
- * This is mainly useful for language bindings.
- *
- * Returns: (nullable) (transfer none): The attribute as `PangoAttrShape`,
- *   or %NULL if it's not a shape attribute
- *
- * Since: 1.50
- */
-PangoAttrShape *
-pango_attribute_as_shape (PangoAttribute *attr)
-{
-  switch (attr->klass->type)
-    {
-    case PANGO_ATTR_SHAPE:
-      return (PangoAttrShape *)attr;
-
-    default:
-      return NULL;
-    }
-}
+/* vim:set foldmethod=marker expandtab: */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]