unexpected character/cluster count between pango_layout_get_character_count and pango_layout_iter_next_char/cluster
I am new to Pango library, and i want retrieve grapheme arrays from PangoLayout in visual order, but get wrong result.
The testing code is here:
#include <pango/pango.h>
#include <pango/pangocairo.h>
#include <glib-object.h>
int layout_character_count(PangoLayout *layout) {
int nChars = 0;
PangoLayoutIter *iter = pango_layout_get_iter(layout);
if (pango_layout_iter_get_run(iter)) {
nChars++;
while (pango_layout_iter_next_char(iter)) {
nChars++;
}
}
pango_layout_iter_free(iter);
return nChars;
}
int layout_cluster_count(PangoLayout *layout) {
int nClusters = 0;
PangoLayoutIter *iter = pango_layout_get_iter(layout);
if (pango_layout_iter_get_run(iter)) {
nClusters++;
while (pango_layout_iter_next_cluster(iter)) {
nClusters++;
}
}
pango_layout_iter_free(iter);
return nClusters;
}
void setup_layout_attrs(PangoLayout *layout) {
PangoAttrList *attrs = pango_attr_list_new();
PangoAttribute *fontsize = pango_attr_size_new(20*PANGO_SCALE);
fontsize->start_index = PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING;
fontsize->end_index = PANGO_ATTR_INDEX_TO_TEXT_END;
pango_attr_list_insert(attrs, fontsize);
pango_layout_set_attributes(layout, attrs);
pango_attr_list_unref(attrs);
}
int main() {
PangoContext *ctx = pango_font_map_create_context(pango_cairo_font_map_get_default());
PangoLayout *layout = pango_layout_new(ctx);
setup_layout_attrs(layout);
pango_layout_set_wrap(layout, PANGO_WRAP_CHAR);
pango_layout_set_width(layout, 190*PANGO_SCALE);
pango_layout_set_height(layout, 230*PANGO_SCALE);
pango_layout_set_text(layout, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -1);
printf("text character count: %d\n", pango_layout_get_character_count(layout));
printf("iter character count: %d\n", layout_character_count(layout));
printf("iter cluster count: %d\n", layout_character_count(layout));
pango_layout_set_text(layout, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", -1);
printf("text character count: %d\n", pango_layout_get_character_count(layout));
printf("iter character count: %d\n", layout_character_count(layout));
printf("iter cluster count: %d\n", layout_character_count(layout));
g_object_unref (layout);
}
I expect the result the result is 31 31 31
in output block 1, and 32 32 32
in output block 2, but it's actually
31 48 48
and 32 50 50
.
Am i missing some thing?
Thanks.