LibWeb: Use glyph run to get position in text_index_at()

There is no need to use actual string when glyph run already has all
necessary info to find position at specified offset.
This commit is contained in:
Aliaksandr Kalenik 2024-09-06 15:10:18 +02:00 committed by Alexander Kalenik
parent 6f5d0de5e7
commit 8502420401
Notes: github-actions[bot] 2024-09-06 19:43:46 +00:00

View file

@ -36,24 +36,22 @@ int PaintableFragment::text_index_at(CSSPixels x) const
{ {
if (!is<TextPaintable>(paintable())) if (!is<TextPaintable>(paintable()))
return 0; return 0;
auto& layout_text = verify_cast<Layout::TextNode>(layout_node());
auto& font = layout_text.first_available_font();
Utf8View view(string_view());
CSSPixels relative_x = x - absolute_rect().x(); CSSPixels relative_x = x - absolute_rect().x();
if (relative_x < 0) if (relative_x < 0)
return 0; return 0;
CSSPixels width_so_far = 0; auto const& glyphs = m_glyph_run->glyphs();
for (auto it = view.begin(); it != view.end(); ++it) { for (size_t i = 0; i < glyphs.size(); ++i) {
auto previous_it = it; auto glyph_position = CSSPixels::nearest_value_for(glyphs[i].position.x());
CSSPixels glyph_width = CSSPixels::nearest_value_for(font.glyph_or_emoji_width(it)); if (i + 1 < glyphs.size()) {
auto next_glyph_position = CSSPixels::nearest_value_for(glyphs[i + 1].position.x());
if ((width_so_far + glyph_width) > relative_x) if (relative_x >= glyph_position && relative_x < next_glyph_position)
return m_start + view.byte_offset_of(previous_it); return m_start + i;
} else {
width_so_far += glyph_width; if (relative_x >= glyph_position)
return m_start + i;
}
} }
return m_start + m_length; return m_start + m_length;