while (offset >= 0 &&
!(attrs[offset].is_sentence_start || attrs[offset].is_sentence_end))
offset--;
if (offset >= 0) return attrs[offset].is_sentence_start;
returnFALSE;
}
staticvoid
pango_layout_get_line_before (PangoLayout *layout, int offset,
AtspiTextBoundaryType boundary_type, int *start_offset, int *end_offset)
{
PangoLayoutIter *iter;
PangoLayoutLine *line, *prev_line = NULL, *prev_prev_line = NULL; int index, start_index, length, end_index; int prev_start_index, prev_length; int prev_prev_start_index, prev_prev_length; constchar *text;
gboolean found = FALSE;
text = pango_layout_get_text (layout);
index = g_utf8_offset_to_pointer (text, offset) - text;
iter = pango_layout_get_iter (layout); do
{
line = pango_layout_iter_get_line (iter);
start_index = pango_layout_line_get_start_index (line);
length = pango_layout_line_get_length (line);
end_index = start_index + length;
if (index >= start_index && index <= end_index)
{ /* Found line for offset */ if (prev_line)
{ switch (boundary_type)
{ case ATSPI_TEXT_BOUNDARY_LINE_START:
end_index = start_index;
start_index = prev_start_index; break; case ATSPI_TEXT_BOUNDARY_LINE_END: if (prev_prev_line)
start_index = prev_prev_start_index + prev_prev_length; else
start_index = 0;
end_index = prev_start_index + prev_length; break; case ATSPI_TEXT_BOUNDARY_CHAR: case ATSPI_TEXT_BOUNDARY_WORD_START: case ATSPI_TEXT_BOUNDARY_WORD_END: case ATSPI_TEXT_BOUNDARY_SENTENCE_START: case ATSPI_TEXT_BOUNDARY_SENTENCE_END: default:
g_assert_not_reached();
}
} else
start_index = end_index = 0;
*start_offset = g_utf8_pointer_to_offset (text, text + start_index);
*end_offset = g_utf8_pointer_to_offset (text, text + end_index);
}
staticvoid
pango_layout_get_line_at (PangoLayout *layout, int offset,
AtspiTextBoundaryType boundary_type, int *start_offset, int *end_offset)
{
PangoLayoutIter *iter;
PangoLayoutLine *line, *prev_line = NULL; int index, start_index, length, end_index; constchar *text;
gboolean found = FALSE;
text = pango_layout_get_text (layout);
index = g_utf8_offset_to_pointer (text, offset) - text;
iter = pango_layout_get_iter (layout); do
{
line = pango_layout_iter_get_line (iter);
start_index = pango_layout_line_get_start_index (line);
length = pango_layout_line_get_length (line);
end_index = start_index + length;
if (index >= start_index && index <= end_index)
{ /* Found line for offset */ switch (boundary_type)
{ case ATSPI_TEXT_BOUNDARY_LINE_START: if (pango_layout_iter_next_line (iter))
end_index = pango_layout_line_get_start_index (pango_layout_iter_get_line (iter)); break; case ATSPI_TEXT_BOUNDARY_LINE_END: if (prev_line)
start_index = pango_layout_line_get_start_index (prev_line) + pango_layout_line_get_length (prev_line); break; case ATSPI_TEXT_BOUNDARY_CHAR: case ATSPI_TEXT_BOUNDARY_WORD_START: case ATSPI_TEXT_BOUNDARY_WORD_END: case ATSPI_TEXT_BOUNDARY_SENTENCE_START: case ATSPI_TEXT_BOUNDARY_SENTENCE_END: default:
g_assert_not_reached();
}
found = TRUE; break;
}
prev_line = line;
} while (pango_layout_iter_next_line (iter));
switch (boundary_type)
{ case ATSPI_TEXT_BOUNDARY_CHAR:
end = gtk_pango_move_chars (layout, end, 1); break;
case ATSPI_TEXT_BOUNDARY_WORD_START: if (!attrs[start].is_word_start)
start = gtk_pango_move_words (layout, start, -1); if (gtk_pango_is_inside_word (layout, end))
end = gtk_pango_move_words (layout, end, 1); while (!attrs[end].is_word_start && end < n_attrs - 1)
end = gtk_pango_move_chars (layout, end, 1); break;
case ATSPI_TEXT_BOUNDARY_WORD_END: if (gtk_pango_is_inside_word (layout, start) &&
!attrs[start].is_word_start)
start = gtk_pango_move_words (layout, start, -1); while (!attrs[start].is_word_end && start > 0)
start = gtk_pango_move_chars (layout, start, -1);
end = gtk_pango_move_words (layout, end, 1); break;
case ATSPI_TEXT_BOUNDARY_SENTENCE_START: if (!attrs[start].is_sentence_start)
start = gtk_pango_move_sentences (layout, start, -1); if (gtk_pango_is_inside_sentence (layout, end))
end = gtk_pango_move_sentences (layout, end, 1); while (!attrs[end].is_sentence_start && end < n_attrs - 1)
end = gtk_pango_move_chars (layout, end, 1); break;
case ATSPI_TEXT_BOUNDARY_SENTENCE_END: if (gtk_pango_is_inside_sentence (layout, start) &&
!attrs[start].is_sentence_start)
start = gtk_pango_move_sentences (layout, start, -1); while (!attrs[start].is_sentence_end && start > 0)
start = gtk_pango_move_chars (layout, start, -1);
end = gtk_pango_move_sentences (layout, end, 1); break;
case ATSPI_TEXT_BOUNDARY_LINE_START: case ATSPI_TEXT_BOUNDARY_LINE_END:
pango_layout_get_line_at (layout, offset, boundary_type, &start, &end); break;
default:
g_assert_not_reached (); break;
}
*start_offset = start;
*end_offset = end;
g_assert (start <= end);
return g_utf8_substring (text, start, end);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-07-03)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.