diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-02-08 15:33:52 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-02-17 14:01:45 -0600 |
commit | 745aede51d0ccf54f686298d58ba68bee83b8e41 (patch) | |
tree | 382f8575ab3c6ba04068161a3c262cb691567bfd | |
parent | d7e236b34211c19ae2a7dd6d20142869161a0367 (diff) | |
download | pango-745aede51d0ccf54f686298d58ba68bee83b8e41.tar.gz |
Drop PangoItem hackery
Drop the abi hacks for PangoItem and just
add the char_offset field. Same for the
size_font field in PangoAnalysis.
-rw-r--r-- | pango/glyphstring.c | 18 | ||||
-rw-r--r-- | pango/itemize.c | 4 | ||||
-rw-r--r-- | pango/pango-item-private.h | 61 | ||||
-rw-r--r-- | pango/pango-item.c | 43 | ||||
-rw-r--r-- | pango/pango-item.h | 9 | ||||
-rw-r--r-- | pango/pango-layout.c | 21 | ||||
-rw-r--r-- | tests/test-itemize.c | 5 |
7 files changed, 35 insertions, 126 deletions
diff --git a/pango/glyphstring.c b/pango/glyphstring.c index ea9a6398..20ee58ce 100644 --- a/pango/glyphstring.c +++ b/pango/glyphstring.c @@ -331,17 +331,17 @@ pango_glyph_string_get_width (PangoGlyphString *glyphs) */ void pango_glyph_string_get_logical_widths (PangoGlyphString *glyphs, - const char *text, - int length, - int embedding_level, - int *logical_widths) + const char *text, + int length, + int embedding_level, + int *logical_widths) { /* Build a PangoGlyphItem and call the other API */ - PangoItem item = {0, length, pango_utf8_strlen (text, length), - {NULL, NULL, NULL, - embedding_level, PANGO_GRAVITY_AUTO, 0, - PANGO_SCRIPT_UNKNOWN, NULL, - NULL}}; + PangoItem item = {0, length, pango_utf8_strlen (text, length), 0, + {NULL, NULL, + embedding_level, PANGO_GRAVITY_AUTO, 0, + PANGO_SCRIPT_UNKNOWN, NULL, + NULL}}; PangoGlyphItem glyph_item = {&item, glyphs}; pango_glyph_item_get_logical_widths (&glyph_item, text, logical_widths); diff --git a/pango/itemize.c b/pango/itemize.c index 01399b7e..26845eda 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -1367,7 +1367,7 @@ split_item_for_variant (const char *text, start = text + item->offset; end = start + item->length; - offset = ((PangoItemPrivate *)item)->char_offset; + offset = item->char_offset; p = start; while (p < end) @@ -1505,7 +1505,7 @@ reorder_items (PangoContext *context, /* Also cmpute the char offset for each item here */ for (GList *l = items; l; l = l->next) { - PangoItemPrivate *item = l->data; + PangoItem *item = l->data; item->char_offset = char_offset; char_offset += item->num_chars; } diff --git a/pango/pango-item-private.h b/pango/pango-item-private.h index 9d2fa805..dc250982 100644 --- a/pango/pango-item-private.h +++ b/pango/pango-item-private.h @@ -26,67 +26,6 @@ G_BEGIN_DECLS -/** - * We have to do some extra work for adding the char_offset field - * to PangoItem to preserve ABI in the face of pango's open-coded - * structs. - * - * Internally, pango uses the PangoItemPrivate type, and we use - * a bit in the PangoAnalysis flags to indicate whether we are - * dealing with a PangoItemPrivate struct or not. - */ - -#define PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET (1 << 7) - -typedef struct _PangoAnalysisPrivate PangoAnalysisPrivate; - -struct _PangoAnalysisPrivate -{ - gpointer reserved; - PangoFont *size_font; - PangoFont *font; - - guint8 level; - guint8 gravity; - guint8 flags; - - guint8 script; - PangoLanguage *language; - - GSList *extra_attrs; -}; - -typedef struct _PangoItemPrivate PangoItemPrivate; - -#if defined(__x86_64__) && !defined(__ILP32__) - -struct _PangoItemPrivate -{ - int offset; - int length; - int num_chars; - int char_offset; - PangoAnalysis analysis; -}; - -#else - -struct _PangoItemPrivate -{ - int offset; - int length; - int num_chars; - PangoAnalysis analysis; - int char_offset; -}; - -#endif - -G_STATIC_ASSERT (offsetof (PangoItem, offset) == offsetof (PangoItemPrivate, offset)); -G_STATIC_ASSERT (offsetof (PangoItem, length) == offsetof (PangoItemPrivate, length)); -G_STATIC_ASSERT (offsetof (PangoItem, num_chars) == offsetof (PangoItemPrivate, num_chars)); -G_STATIC_ASSERT (offsetof (PangoItem, analysis) == offsetof (PangoItemPrivate, analysis)); - void pango_analysis_collect_features (const PangoAnalysis *analysis, hb_feature_t *features, guint length, diff --git a/pango/pango-item.c b/pango/pango-item.c index 944bfe2d..131094e6 100644 --- a/pango/pango-item.c +++ b/pango/pango-item.c @@ -35,9 +35,7 @@ PangoItem * pango_item_new (void) { - PangoItemPrivate *result = g_slice_new0 (PangoItemPrivate); - - result->analysis.flags |= PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET; + PangoItem *result = g_slice_new0 (PangoItem); return (PangoItem *)result; } @@ -64,12 +62,11 @@ pango_item_copy (PangoItem *item) result->offset = item->offset; result->length = item->length; result->num_chars = item->num_chars; - if (item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET) - ((PangoItemPrivate *)result)->char_offset = ((PangoItemPrivate *)item)->char_offset; + result->char_offset = item->char_offset; result->analysis = item->analysis; - if (result->analysis.lang_engine) - g_object_ref (result->analysis.lang_engine); + if (result->analysis.size_font) + g_object_ref (result->analysis.size_font); if (result->analysis.font) g_object_ref (result->analysis.font); @@ -105,16 +102,13 @@ pango_item_free (PangoItem *item) g_slist_free (item->analysis.extra_attrs); } - if (item->analysis.lang_engine) - g_object_unref (item->analysis.lang_engine); + if (item->analysis.size_font) + g_object_unref (item->analysis.size_font); if (item->analysis.font) g_object_unref (item->analysis.font); - if (item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET) - g_slice_free (PangoItemPrivate, (PangoItemPrivate *)item); - else - g_slice_free (PangoItem, item); + g_slice_free (PangoItem, item); } G_DEFINE_BOXED_TYPE (PangoItem, pango_item, @@ -164,8 +158,7 @@ pango_item_split (PangoItem *orig, orig->offset += split_index; orig->length -= split_index; orig->num_chars -= split_offset; - if (orig->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET) - ((PangoItemPrivate *)orig)->char_offset += split_offset; + orig->char_offset += split_offset; return new_item; } @@ -190,9 +183,7 @@ pango_item_unsplit (PangoItem *orig, orig->offset -= split_index; orig->length += split_index; orig->num_chars += split_offset; - - if (orig->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET) - ((PangoItemPrivate *)orig)->char_offset -= split_offset; + orig->char_offset -= split_offset; } static int @@ -346,13 +337,11 @@ void pango_analysis_set_size_font (PangoAnalysis *analysis, PangoFont *font) { - PangoAnalysisPrivate *priv = (PangoAnalysisPrivate *)analysis; - - if (priv->size_font) - g_object_unref (priv->size_font); - priv->size_font = font; - if (priv->size_font) - g_object_ref (priv->size_font); + if (analysis->size_font) + g_object_unref (analysis->size_font); + analysis->size_font = font; + if (analysis->size_font) + g_object_ref (analysis->size_font); } /*< private > @@ -368,7 +357,5 @@ pango_analysis_set_size_font (PangoAnalysis *analysis, PangoFont * pango_analysis_get_size_font (const PangoAnalysis *analysis) { - PangoAnalysisPrivate *priv = (PangoAnalysisPrivate *)analysis; - - return priv->size_font; + return analysis->size_font; } diff --git a/pango/pango-item.h b/pango/pango-item.h index a23af665..a67434ad 100644 --- a/pango/pango-item.h +++ b/pango/pango-item.h @@ -61,9 +61,8 @@ typedef struct _PangoItem PangoItem; /** * PangoAnalysis: - * @shape_engine: unused, reserved - * @lang_engine: unused, reserved - * @font: the font for this segment. + * @size_font: font to use for determining line height + * @font: the font for this segment * @level: the bidirectional level for this segment. * @gravity: the glyph orientation for this segment (A `PangoGravity`). * @flags: boolean flags for this segment (Since: 1.16). @@ -76,8 +75,7 @@ typedef struct _PangoItem PangoItem; */ struct _PangoAnalysis { - gpointer shape_engine; - gpointer lang_engine; + PangoFont *size_font; PangoFont *font; guint8 level; @@ -108,6 +106,7 @@ struct _PangoItem int offset; int length; int num_chars; + int char_offset; PangoAnalysis analysis; }; diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 84fe13d6..c3ab1539 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -1822,8 +1822,7 @@ pango_layout_line_index_to_x (PangoLayoutLine *line, /* Note: we simply assert here, since our items are all internally * created. If that ever changes, we need to add a fallback here. */ - g_assert (run->item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET); - attr_offset = ((PangoItemPrivate *)run->item)->char_offset; + attr_offset = run->item->char_offset; pango_glyph_string_index_to_x_full (run->glyphs, layout->text + run->item->offset, @@ -5426,11 +5425,7 @@ pango_layout_line_get_x_ranges (PangoLayoutLine *line, run_end_index = g_utf8_prev_char (line->layout->text + run_end_index) - line->layout->text; - /* Note: we simply assert here, since our items are all internally - * created. If that ever changes, we need to add a fallback here. - */ - g_assert (run->item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET); - attr_offset = ((PangoItemPrivate *)run->item)->char_offset; + attr_offset = run->item->char_offset; pango_glyph_string_index_to_x_full (run->glyphs, line->layout->text + run->item->offset, @@ -6373,11 +6368,7 @@ justify_clusters (PangoLayoutLine *line, dir = run->item->analysis.level % 2 == 0 ? +1 : -1; - /* Note: we simply assert here, since our items are all internally - * created. If that ever changes, we need to add a fallback here. - */ - g_assert (run->item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET); - offset = ((PangoItemPrivate *)run->item)->char_offset; + offset = run->item->char_offset; for (have_cluster = dir > 0 ? pango_glyph_item_iter_init_start (&cluster_iter, run, text) : @@ -6511,11 +6502,7 @@ justify_words (PangoLayoutLine *line, gboolean have_cluster; int offset; - /* Note: we simply assert here, since our items are all internally - * created. If that ever changes, we need to add a fallback here. - */ - g_assert (run->item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET); - offset = ((PangoItemPrivate *)run->item)->char_offset; + offset = run->item->char_offset; for (have_cluster = pango_glyph_item_iter_init_start (&cluster_iter, run, text); have_cluster; diff --git a/tests/test-itemize.c b/tests/test-itemize.c index e5775985..a12bddd7 100644 --- a/tests/test-itemize.c +++ b/tests/test-itemize.c @@ -112,10 +112,7 @@ apply_attributes_to_items (GList *items, static int get_item_char_offset (PangoItem *item) { - if (item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET) - return ((PangoItemPrivate *)item)->char_offset; - - return -1; + return item->char_offset; } static void |