diff options
Diffstat (limited to 'pango')
-rw-r--r-- | pango/itemize.c | 16 | ||||
-rw-r--r-- | pango/pango-item-private.h | 73 | ||||
-rw-r--r-- | pango/pango-item.c | 19 | ||||
-rw-r--r-- | pango/pango-item.h | 7 |
4 files changed, 106 insertions, 9 deletions
diff --git a/pango/itemize.c b/pango/itemize.c index bd699bce..11bc2513 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -32,6 +32,7 @@ #include "pango-script-private.h" #include "pango-emoji-private.h" #include "pango-attributes-private.h" +#include "pango-item-private.h" /* {{{ Font cache */ @@ -1033,6 +1034,8 @@ pango_itemize_with_font (PangoContext *context, const PangoFontDescription *desc) { ItemizeState state; + GList *items; + int char_offset; if (length == 0 || g_utf8_get_char (text + start_index) == '\0') return NULL; @@ -1046,7 +1049,18 @@ pango_itemize_with_font (PangoContext *context, itemize_state_finish (&state); - return g_list_reverse (state.result); + items = g_list_reverse (state.result); + + /* Compute the char offset for each item */ + char_offset = 0; + for (GList *l = items; l; l = l->next) + { + PangoItemPrivate *item = l->data; + item->char_offset = char_offset; + char_offset += item->num_chars; + } + + return items; } /** diff --git a/pango/pango-item-private.h b/pango/pango-item-private.h new file mode 100644 index 00000000..8bb7e1cd --- /dev/null +++ b/pango/pango-item-private.h @@ -0,0 +1,73 @@ +/* Pango + * + * Copyright (C) 2021 Matthias Clasen + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __PANGO_ITEM_PRIVATE_H__ +#define __PANGO_ITEM_PRIVATE_H__ + +#include <pango/pango-item.h> + +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 _PangoItemPrivate PangoItemPrivate; + +#ifdef __x86_64__ + +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)); + +G_END_DECLS + +#endif /* __PANGO_ITEM_PRIVATE_H__ */ diff --git a/pango/pango-item.c b/pango/pango-item.c index ce38e6d2..484d5f1f 100644 --- a/pango/pango-item.c +++ b/pango/pango-item.c @@ -21,7 +21,7 @@ #include "config.h" #include "pango-attributes.h" -#include "pango-item.h" +#include "pango-item-private.h" #include "pango-impl-utils.h" /** @@ -35,9 +35,11 @@ PangoItem * pango_item_new (void) { - PangoItem *result = g_slice_new0 (PangoItem); + PangoItemPrivate *result = g_slice_new0 (PangoItemPrivate); - return result; + result->analysis.flags |= PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET; + + return (PangoItem *)result; } /** @@ -57,11 +59,13 @@ pango_item_copy (PangoItem *item) if (item == NULL) return NULL; - result = g_slice_new (PangoItem); + result = pango_item_new (); 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->analysis = item->analysis; if (result->analysis.font) @@ -101,7 +105,10 @@ pango_item_free (PangoItem *item) if (item->analysis.font) g_object_unref (item->analysis.font); - g_slice_free (PangoItem, item); + if (item->analysis.flags & PANGO_ANALYSIS_FLAG_HAS_CHAR_OFFSET) + g_slice_free (PangoItemPrivate, (PangoItemPrivate *)item); + else + g_slice_free (PangoItem, item); } G_DEFINE_BOXED_TYPE (PangoItem, pango_item, @@ -151,6 +158,8 @@ 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; return new_item; } diff --git a/pango/pango-item.h b/pango/pango-item.h index 9e0596f2..8122be19 100644 --- a/pango/pango-item.h +++ b/pango/pango-item.h @@ -100,6 +100,7 @@ struct _PangoAnalysis * @offset: byte offset of the start of this item in text. * @length: length of this item in bytes. * @num_chars: number of Unicode characters in the item. + * @char_offset: character offset of the start of this item in text. Since 1.50 * @analysis: analysis results for the item. * * The `PangoItem` structure stores information about a segment of text. @@ -109,9 +110,9 @@ struct _PangoAnalysis */ struct _PangoItem { - gint offset; - gint length; - gint num_chars; + int offset; + int length; + int num_chars; PangoAnalysis analysis; }; |