mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-10-06 10:07:17 +03:00
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:
parent
6f5d0de5e7
commit
8502420401
Notes:
github-actions[bot]
2024-09-06 19:43:46 +00:00
Author: https://github.com/kalenikaliaksandr Commit: https://github.com/LadybirdBrowser/ladybird/commit/8502420401f Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1300
@ -36,24 +36,22 @@ int PaintableFragment::text_index_at(CSSPixels x) const
|
||||
{
|
||||
if (!is<TextPaintable>(paintable()))
|
||||
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();
|
||||
|
||||
if (relative_x < 0)
|
||||
return 0;
|
||||
|
||||
CSSPixels width_so_far = 0;
|
||||
for (auto it = view.begin(); it != view.end(); ++it) {
|
||||
auto previous_it = it;
|
||||
CSSPixels glyph_width = CSSPixels::nearest_value_for(font.glyph_or_emoji_width(it));
|
||||
|
||||
if ((width_so_far + glyph_width) > relative_x)
|
||||
return m_start + view.byte_offset_of(previous_it);
|
||||
|
||||
width_so_far += glyph_width;
|
||||
auto const& glyphs = m_glyph_run->glyphs();
|
||||
for (size_t i = 0; i < glyphs.size(); ++i) {
|
||||
auto glyph_position = CSSPixels::nearest_value_for(glyphs[i].position.x());
|
||||
if (i + 1 < glyphs.size()) {
|
||||
auto next_glyph_position = CSSPixels::nearest_value_for(glyphs[i + 1].position.x());
|
||||
if (relative_x >= glyph_position && relative_x < next_glyph_position)
|
||||
return m_start + i;
|
||||
} else {
|
||||
if (relative_x >= glyph_position)
|
||||
return m_start + i;
|
||||
}
|
||||
}
|
||||
|
||||
return m_start + m_length;
|
||||
|
Loading…
Reference in New Issue
Block a user