#include "pango-break.h"
#include "pango-modules.h"
#include "pango-script-private.h"
+#include "pango-impl-utils.h"
#include <string.h>
#define PARAGRAPH_SEPARATOR 0x2029
PangoLogAttr attr_before = log_attrs[0];
analysis->lang_engine = range_engine;
- chars_in_range = g_utf8_strlen (range_start, range_end - range_start);
+ chars_in_range = pango_utf8_strlen (range_start, range_end - range_start);
if (tailor_break (range_start,
#include "pango-glyph-item.h"
#include "pango-layout-private.h"
#include "pango-engine-private.h"
+#include "pango-impl-utils.h"
typedef struct _EllipsizeState EllipsizeState;
typedef struct _RunInfo RunInfo;
state->n_runs = g_slist_length (line->runs);
state->run_info = g_new (RunInfo, state->n_runs);
- start_offset = g_utf8_strlen (line->layout->text,
+ start_offset = pango_utf8_strlen (line->layout->text,
line->start_index);
state->total_width = 0;
/* Fix up the item to point to the entire elided text */
item->offset = state->gap_start_iter.run_iter.start_index;
item->length = state->gap_end_iter.run_iter.end_index - item->offset;
- item->num_chars = g_utf8_strlen (state->layout->text + item->offset, item->length);
+ item->num_chars = pango_utf8_strlen (state->layout->text + item->offset, item->length);
/* The level for the item is the minimum level of the elided text */
level = G_MAXINT;
* @text: the text corresponding to the glyphs
* @length: the length of @text, in bytes
* @embedding_level: the embedding level of the string
- * @logical_widths: an array whose length is g_utf8_strlen (text, length)
+ * @logical_widths: an array whose length is the number of characters in
+ * text (equal to g_utf8_strlen (text, length) unless
+ * text has NUL bytes)
* to be filled in with the resulting character widths.
*
* Given a #PangoGlyphString resulting from pango_shape() and the corresponding
{
/* Build a PangoGlyphItem so we can use PangoGlyphItemIter.
* This API should have been made to take a PangoGlyphItem... */
- PangoItem item = {0, length, g_utf8_strlen (text, length),
+ PangoItem item = {0, length, pango_utf8_strlen (text, length),
{NULL, NULL, NULL,
embedding_level, PANGO_GRAVITY_AUTO, 0,
PANGO_SCRIPT_UNKNOWN, NULL,
int cluster = 0;
int i;
- n_chars = text ? g_utf8_strlen (text, length) : 0;
+ n_chars = text ? pango_utf8_strlen (text, length) : 0;
pango_glyph_string_set_size (glyphs, n_chars);
if (glyphs->log_clusters[glyph_index] != cluster)
{
iter->end_index = item->offset + glyphs->log_clusters[glyph_index];
- iter->end_char += g_utf8_strlen (iter->text + iter->start_index,
+ iter->end_char += pango_utf8_strlen (iter->text + iter->start_index,
iter->end_index - iter->start_index);
break;
}
if (glyphs->log_clusters[glyph_index] != cluster)
{
iter->end_index = item->offset + glyphs->log_clusters[glyph_index];
- iter->end_char += g_utf8_strlen (iter->text + iter->start_index,
+ iter->end_char += pango_utf8_strlen (iter->text + iter->start_index,
iter->end_index - iter->start_index);
break;
}
{
glyph_index++;
iter->start_index = item->offset + glyphs->log_clusters[glyph_index];
- iter->start_char -= g_utf8_strlen (iter->text + iter->start_index,
+ iter->start_char -= pango_utf8_strlen (iter->text + iter->start_index,
iter->end_index - iter->start_index);
break;
}
{
glyph_index--;
iter->start_index = item->offset + glyphs->log_clusters[glyph_index];
- iter->start_char -= g_utf8_strlen (iter->text + iter->start_index,
+ iter->start_char -= pango_utf8_strlen (iter->text + iter->start_index,
iter->end_index - iter->start_index);
break;
}
return len;
}
+/* Glib's g_utf8_strlen() is broken and stops at embedded NUL's.
+ * Wrap it here. */
+static G_GNUC_UNUSED glong
+pango_utf8_strlen (const gchar *p, gssize max)
+{
+ glong len = 0;
+ const gchar *start = p;
+ g_return_val_if_fail (p != NULL || max == 0, 0);
+
+ if (max <= 0)
+ return g_utf8_strlen (p, max);
+
+ p = g_utf8_next_char (p);
+ while (p - start < max)
+ {
+ ++len;
+ p = g_utf8_next_char (p);
+ }
+
+ /* only do the last len increment if we got a complete
+ * char (don't count partial chars)
+ */
+ if (p - start <= max)
+ ++len;
+
+ return len;
+}
G_END_DECLS
/* TODO: Write out the beginning excerpt of text? */
g_warning ("Invalid UTF-8 string passed to pango_layout_set_text()");
- layout->n_chars = g_utf8_strlen (layout->text, -1);
+ layout->n_chars = pango_utf8_strlen (layout->text, -1);
pango_layout_clear_lines (layout);
old_index = g_utf8_next_char (layout->text + old_index) - layout->text;
log2vis_map = pango_layout_line_get_log2vis_map (line, strong);
- n_vis = g_utf8_strlen (layout->text + line->start_index, line->length);
+ n_vis = pango_utf8_strlen (layout->text + line->start_index, line->length);
/* Clamp old_index to fit on the line */
if (old_index > (line->start_index + line->length))
paragraph_boundary = (line->start_index != old_index);
}
- n_vis = g_utf8_strlen (layout->text + line->start_index, line->length);
+ n_vis = pango_utf8_strlen (layout->text + line->start_index, line->length);
start_offset = g_utf8_pointer_to_offset (layout->text, layout->text + line->start_index);
if (vis_pos == 0 && direction < 0)
int n_chars;
pango_layout_line_get_range (line, &start, &end);
- n_chars = g_utf8_strlen (start, end - start);
+ n_chars = pango_utf8_strlen (start, end - start);
result = g_new (int, n_chars + 1);
int n_chars;
pango_layout_line_get_range (line, &start, &end);
- n_chars = g_utf8_strlen (start, end - start);
+ n_chars = pango_utf8_strlen (start, end - start);
result = g_new0 (int, end - start + 1);
reverse_map = pango_layout_line_get_vis2log_map (line, strong);
/* Break the paragraph delimiters with the last item */
if (items->next == NULL)
{
- tmp_item.num_chars += g_utf8_strlen (text + index + tmp_item.length, para_delimiter_len);
+ tmp_item.num_chars += pango_utf8_strlen (text + index + tmp_item.length, para_delimiter_len);
tmp_item.length += para_delimiter_len;
}
done = TRUE;
if (!done)
- start_offset += g_utf8_strlen (start, (end - start) + delim_len);
+ start_offset += pango_utf8_strlen (start, (end - start) + delim_len);
start = end + delim_len;
}
}
cluster_text = iter->layout->text + iter->run->item->offset + cluster_start_index;
- iter->cluster_num_chars = g_utf8_strlen (cluster_text, cluster_length);
+ iter->cluster_num_chars = pango_utf8_strlen (cluster_text, cluster_length);
if (iter->ltr)
iter->index = cluster_text - iter->layout->text;