[pango/pango2: 97/118] Make font metrics copy/free




commit b50b2b338c66f11d26d4b98402220e2e93085ac1
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jun 11 17:53:10 2022 -0400

    Make font metrics copy/free
    
    Having this struct ref/unref was a bit of an odd
    fit, and we were not taking advantage of it anywhere.

 pango/pango-context.c      | 35 ++++++++++++++---------------------
 pango/pango-font-metrics.c | 35 ++++++++++-------------------------
 pango/pango-font-metrics.h |  6 +++---
 pango/pango-font.c         |  2 +-
 pango/pango-fontset.c      | 22 ++++++----------------
 pango/pango-line-breaker.c |  2 +-
 pango/pango-line.c         |  2 +-
 pango/pango-renderer.c     |  2 +-
 pango/pango-run.c          |  2 +-
 tests/test-font.c          |  4 ++--
 utils/pango-list.c         |  2 +-
 11 files changed, 41 insertions(+), 73 deletions(-)
---
diff --git a/pango/pango-context.c b/pango/pango-context.c
index 90d48aefd..34b19469d 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -126,7 +126,7 @@ pango_context_finalize (GObject *object)
     pango_matrix_free (context->matrix);
 
   if (context->metrics)
-    pango_font_metrics_unref (context->metrics);
+    pango_font_metrics_free (context->metrics);
 
   G_OBJECT_CLASS (pango_context_parent_class)->finalize (object);
 }
@@ -554,31 +554,21 @@ get_first_metrics_foreach (PangoFontset  *fontset,
                            PangoFont     *font,
                            gpointer       data)
 {
-  PangoFontMetrics *fontset_metrics = data;
+  PangoFontMetrics **fontset_metrics = data;
   PangoLanguage *language = pango_fontset_get_language (fontset);
-  PangoFontMetrics *font_metrics = pango_font_get_metrics (font, language);
-  guint save_ref_count;
 
-  /* Initialize the fontset metrics to metrics of the first font in the
-   * fontset; saving the refcount and restoring it is a bit of hack but avoids
-   * having to update this code for each metrics addition.
-   */
-  save_ref_count = fontset_metrics->ref_count;
-  *fontset_metrics = *font_metrics;
-  fontset_metrics->ref_count = save_ref_count;
+  *fontset_metrics = pango_font_get_metrics (font, language);
 
-  pango_font_metrics_unref (font_metrics);
-
-  return TRUE;                  /* Stops iteration */
+  return TRUE; /* Stops iteration */
 }
 
 static PangoFontMetrics *
 get_base_metrics (PangoFontset *fontset)
 {
-  PangoFontMetrics *metrics = pango_font_metrics_new ();
+  PangoFontMetrics *metrics = NULL;
 
   /* Initialize the metrics from the first font in the fontset */
-  pango_fontset_foreach (fontset, get_first_metrics_foreach, metrics);
+  pango_fontset_foreach (fontset, get_first_metrics_foreach, &metrics);
 
   return metrics;
 }
@@ -615,7 +605,7 @@ update_metrics_from_items (PangoFontMetrics *metrics,
           metrics->ascent = MAX (metrics->ascent, raw_metrics->ascent);
           metrics->descent = MAX (metrics->descent, raw_metrics->descent);
           metrics->height = MAX (metrics->height, raw_metrics->height);
-          pango_font_metrics_unref (raw_metrics);
+          pango_font_metrics_free (raw_metrics);
         }
 
       pango_shape (text + item->offset, item->length,
@@ -658,7 +648,7 @@ update_metrics_from_items (PangoFontMetrics *metrics,
  * for the individual families.
  *
  * Return value: a `PangoFontMetrics` object. The caller must call
- *   [method@Pango.FontMetrics.unref] when finished using the object.
+ *   [method Pango FontMetrics free] when finished using the object.
  */
 PangoFontMetrics *
 pango_context_get_metrics (PangoContext               *context,
@@ -682,7 +672,7 @@ pango_context_get_metrics (PangoContext               *context,
   if (desc == context->font_desc &&
       language == context->language &&
       context->metrics != NULL)
-    return pango_font_metrics_ref (context->metrics);
+    return pango_font_metrics_copy (context->metrics);
 
   current_fonts = pango_font_map_load_fontset (context->font_map, context, desc, language);
   metrics = get_base_metrics (current_fonts);
@@ -703,7 +693,10 @@ pango_context_get_metrics (PangoContext               *context,
 
   if (desc == context->font_desc &&
       language == context->language)
-    context->metrics = pango_font_metrics_ref (metrics);
+    {
+      pango_font_metrics_free (context->metrics);
+      context->metrics = pango_font_metrics_copy (metrics);
+    }
 
   return metrics;
 }
@@ -715,7 +708,7 @@ context_changed (PangoContext *context)
   if (context->serial == 0)
     context->serial++;
 
-  g_clear_pointer (&context->metrics, pango_font_metrics_unref);
+  g_clear_pointer (&context->metrics, pango_font_metrics_free);
 }
 
 /**
diff --git a/pango/pango-font-metrics.c b/pango/pango-font-metrics.c
index f5c22129e..21a7c735d 100644
--- a/pango/pango-font-metrics.c
+++ b/pango/pango-font-metrics.c
@@ -25,8 +25,8 @@
 
 
 G_DEFINE_BOXED_TYPE (PangoFontMetrics, pango_font_metrics,
-                     pango_font_metrics_ref,
-                     pango_font_metrics_unref);
+                     pango_font_metrics_copy,
+                     pango_font_metrics_free);
 
 /**
  * pango_font_metrics_new:
@@ -37,54 +37,39 @@ G_DEFINE_BOXED_TYPE (PangoFontMetrics, pango_font_metrics,
  * no public way to set the fields of the structure.
  *
  * Return value: a newly-created `PangoFontMetrics` structure
- *   with a reference count of 1.
  */
 PangoFontMetrics *
 pango_font_metrics_new (void)
 {
   PangoFontMetrics *metrics = g_slice_new0 (PangoFontMetrics);
-  metrics->ref_count = 1;
 
   return metrics;
 }
 
 /**
- * pango_font_metrics_ref:
+ * pango_font_metrics_copy:
  * @metrics: (nullable): a `PangoFontMetrics` structure, may be %NULL
  *
- * Increase the reference count of a font metrics structure by one.
+ * Create a copy of @metrics.
  *
  * Return value: (nullable): @metrics
  */
 PangoFontMetrics *
-pango_font_metrics_ref (PangoFontMetrics *metrics)
+pango_font_metrics_copy (PangoFontMetrics *metrics)
 {
-  if (metrics == NULL)
-    return NULL;
-
-  g_atomic_int_inc ((int *) &metrics->ref_count);
-
-  return metrics;
+  return g_slice_dup (PangoFontMetrics, metrics);
 }
 
 /**
- * pango_font_metrics_unref:
+ * pango_font_metrics_free:
  * @metrics: (nullable): a `PangoFontMetrics` structure, may be %NULL
  *
- * Decrease the reference count of a font metrics structure by one.
- *
- * If the result is zero, frees the structure and any associated memory.
+ * Free the @metrics.
  */
 void
-pango_font_metrics_unref (PangoFontMetrics *metrics)
+pango_font_metrics_free (PangoFontMetrics *metrics)
 {
-  if (metrics == NULL)
-    return;
-
-  g_return_if_fail (metrics->ref_count > 0 );
-
-  if (g_atomic_int_dec_and_test ((int *) &metrics->ref_count))
-    g_slice_free (PangoFontMetrics, metrics);
+  g_slice_free (PangoFontMetrics, metrics);
 }
 
 /**
diff --git a/pango/pango-font-metrics.h b/pango/pango-font-metrics.h
index d046f2d1a..ff919e02e 100644
--- a/pango/pango-font-metrics.h
+++ b/pango/pango-font-metrics.h
@@ -51,9 +51,9 @@ typedef struct _PangoFontMetrics PangoFontMetrics;
 PANGO_AVAILABLE_IN_ALL
 GType             pango_font_metrics_get_type                    (void) G_GNUC_CONST;
 PANGO_AVAILABLE_IN_ALL
-PangoFontMetrics *pango_font_metrics_ref                         (PangoFontMetrics *metrics);
+PangoFontMetrics *pango_font_metrics_copy                        (PangoFontMetrics *metrics);
 PANGO_AVAILABLE_IN_ALL
-void              pango_font_metrics_unref                       (PangoFontMetrics *metrics);
+void              pango_font_metrics_free                        (PangoFontMetrics *metrics);
 PANGO_AVAILABLE_IN_ALL
 int               pango_font_metrics_get_ascent                  (PangoFontMetrics *metrics) G_GNUC_PURE;
 PANGO_AVAILABLE_IN_ALL
@@ -73,6 +73,6 @@ int               pango_font_metrics_get_strikethrough_position  (PangoFontMetri
 PANGO_AVAILABLE_IN_ALL
 int               pango_font_metrics_get_strikethrough_thickness (PangoFontMetrics *metrics) G_GNUC_PURE;
 
-G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoFontMetrics, pango_font_metrics_unref)
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoFontMetrics, pango_font_metrics_free)
 
 G_END_DECLS
diff --git a/pango/pango-font.c b/pango/pango-font.c
index 95f8a3ae5..24d6add45 100644
--- a/pango/pango-font.c
+++ b/pango/pango-font.c
@@ -294,7 +294,7 @@ pango_font_get_glyph_extents  (PangoFont      *font,
  * output variables and returns.
  *
  * Return value: a `PangoFontMetrics` object. The caller must call
- *   [method@Pango.FontMetrics.unref] when finished using the object.
+ *   [method Pango FontMetrics free] when finished using the object.
  */
 PangoFontMetrics *
 pango_font_get_metrics (PangoFont     *font,
diff --git a/pango/pango-fontset.c b/pango/pango-fontset.c
index fd5af91d5..d528ad8d5 100644
--- a/pango/pango-fontset.c
+++ b/pango/pango-fontset.c
@@ -135,22 +135,12 @@ get_first_metrics_foreach (PangoFontset  *fontset,
                            PangoFont     *font,
                            gpointer       data)
 {
-  PangoFontMetrics *fontset_metrics = data;
+  PangoFontMetrics **fontset_metrics = data;
   PangoLanguage *language = pango_fontset_get_language (fontset);
-  PangoFontMetrics *font_metrics = pango_font_get_metrics (font, language);
-  guint save_ref_count;
 
-  /* Initialize the fontset metrics to metrics of the first font in the
-   * fontset; saving the refcount and restoring it is a bit of hack but avoids
-   * having to update this code for each metrics addition.
-   */
-  save_ref_count = fontset_metrics->ref_count;
-  *fontset_metrics = *font_metrics;
-  fontset_metrics->ref_count = save_ref_count;
+  *fontset_metrics = pango_font_get_metrics (font, language);
 
-  pango_font_metrics_unref (font_metrics);
-
-  return TRUE;                  /* Stops iteration */
+  return TRUE; /* Stops iteration */
 }
 
 static PangoFontMetrics *
@@ -168,11 +158,11 @@ pango_fontset_real_get_metrics (PangoFontset  *fontset)
   sample_str = pango_language_get_sample_string (language);
 
   count = 0;
-  metrics = pango_font_metrics_new ();
+  metrics = NULL;
   fonts_seen = g_hash_table_new_full (NULL, NULL, g_object_unref, NULL);
 
   /* Initialize the metrics from the first font in the fontset */
-  pango_fontset_foreach (fontset, get_first_metrics_foreach, metrics);
+  pango_fontset_foreach (fontset, get_first_metrics_foreach, &metrics);
 
   p = sample_str;
   while (*p)
@@ -201,7 +191,7 @@ pango_fontset_real_get_metrics (PangoFontset  *fontset)
                   metrics->approximate_digit_width += raw_metrics->approximate_digit_width;
                 }
               count++;
-              pango_font_metrics_unref (raw_metrics);
+              pango_font_metrics_free (raw_metrics);
             }
           else
             g_object_unref (font);
diff --git a/pango/pango-line-breaker.c b/pango/pango-line-breaker.c
index b9db0125b..ccec0ffe3 100644
--- a/pango/pango-line-breaker.c
+++ b/pango/pango-line-breaker.c
@@ -1324,7 +1324,7 @@ process_item (PangoLineBreaker *self,
    */
   metrics = pango_font_get_metrics (item->analysis.font, item->analysis.language);
   safe_distance = pango_font_metrics_get_approximate_char_width (metrics) * 3;
-  pango_font_metrics_unref (metrics);
+  pango_font_metrics_free (metrics);
 
   if (processing_new_item)
     {
diff --git a/pango/pango-line.c b/pango/pango-line.c
index f9382ea51..775a25ba4 100644
--- a/pango/pango-line.c
+++ b/pango/pango-line.c
@@ -511,7 +511,7 @@ pango_line_get_empty_extents (PangoLine        *line,
                 logical_rect->height += (leading - leading / 2);
             }
 
-          pango_font_metrics_unref (metrics);
+          pango_font_metrics_free (metrics);
         }
 
       g_object_unref (font);
diff --git a/pango/pango-renderer.c b/pango/pango-renderer.c
index f3318b965..4ef9b873b 100644
--- a/pango/pango-renderer.c
+++ b/pango/pango-renderer.c
@@ -679,7 +679,7 @@ pango_renderer_draw_runs (PangoRenderer *renderer,
                                x + x_off, y - y_off,
                                ink, logical, glyphs->num_glyphs);
 
-          pango_font_metrics_unref (metrics);
+          pango_font_metrics_free (metrics);
         }
 
       if (renderer->underline == PANGO_LINE_STYLE_NONE &&
diff --git a/pango/pango-run.c b/pango/pango-run.c
index 5f04be8a3..17cb237ef 100644
--- a/pango/pango-run.c
+++ b/pango/pango-run.c
@@ -200,5 +200,5 @@ pango_run_get_extents (PangoRun         *run,
     }
 
   if (metrics)
-    pango_font_metrics_unref (metrics);
+    pango_font_metrics_free (metrics);
 }
diff --git a/tests/test-font.c b/tests/test-font.c
index 72809f57c..956c9580e 100644
--- a/tests/test-font.c
+++ b/tests/test-font.c
@@ -185,7 +185,7 @@ test_metrics (void)
   g_test_message ("\tstrikethrough thickness: %d",
                   pango_font_metrics_get_strikethrough_thickness (metrics));
 
-  pango_font_metrics_unref (metrics);
+  pango_font_metrics_free (metrics);
   g_free (str);
   pango_font_description_free (desc);
 }
@@ -497,7 +497,7 @@ test_font_metrics (void)
   g_assert_cmpint (pango_font_metrics_get_approximate_char_width (metrics), ==, PANGO_SCALE * 
PANGO_UNKNOWN_GLYPH_WIDTH);
   g_assert_cmpint (pango_font_metrics_get_approximate_digit_width (metrics), ==, PANGO_SCALE * 
PANGO_UNKNOWN_GLYPH_WIDTH);
 
-  pango_font_metrics_unref (metrics);
+  pango_font_metrics_free (metrics);
 }
 
 static void
diff --git a/utils/pango-list.c b/utils/pango-list.c
index e32cdfc5b..9d69a82c7 100644
--- a/utils/pango-list.c
+++ b/utils/pango-list.c
@@ -204,7 +204,7 @@ main (int    argc,
                        pango_font_metrics_get_underline_thickness (metrics),
                        pango_font_metrics_get_strikethrough_position (metrics),
                        pango_font_metrics_get_strikethrough_thickness (metrics));
-              pango_font_metrics_unref (metrics);
+              pango_font_metrics_free (metrics);
             }
 
           if (opt_variations)


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