summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-02-08 15:33:52 -0500
committerMatthias Clasen <mclasen@redhat.com>2022-02-17 14:01:45 -0600
commit745aede51d0ccf54f686298d58ba68bee83b8e41 (patch)
tree382f8575ab3c6ba04068161a3c262cb691567bfd
parentd7e236b34211c19ae2a7dd6d20142869161a0367 (diff)
downloadpango-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.c18
-rw-r--r--pango/itemize.c4
-rw-r--r--pango/pango-item-private.h61
-rw-r--r--pango/pango-item.c43
-rw-r--r--pango/pango-item.h9
-rw-r--r--pango/pango-layout.c21
-rw-r--r--tests/test-itemize.c5
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