Trim display lines before the colorize pass
Colorizing long lines can be costly, remove all the invisible atoms earlier. Also optimize ForwardHighlighterApplier further by trimming empty lines.
This commit is contained in:
parent
5a867ebdd1
commit
af66a95ef8
|
@ -264,18 +264,22 @@ bool DisplayLine::trim_from(ColumnCount first_col, ColumnCount front, ColumnCoun
|
||||||
}
|
}
|
||||||
|
|
||||||
auto front_it = it;
|
auto front_it = it;
|
||||||
Face last_face{};
|
Optional<DisplayAtom> padding;
|
||||||
while (front > 0 and it != end())
|
while (front > 0 and it != end())
|
||||||
{
|
{
|
||||||
front -= it->trim_begin(front);
|
front -= it->trim_begin(front);
|
||||||
kak_assert(it->empty() or front <= 0);
|
kak_assert(it->empty() or front <= 0);
|
||||||
last_face = it->face;
|
if (front < 0)
|
||||||
|
padding.emplace(it->has_buffer_range()
|
||||||
|
? DisplayAtom{it->buffer(), {it->begin(), it->begin()}, String{' ', -front}, it->face}
|
||||||
|
: DisplayAtom{String{' ', -front}, it->face});
|
||||||
|
|
||||||
if (it->empty())
|
if (it->empty())
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
it = m_atoms.erase(front_it, it);
|
it = m_atoms.erase(front_it, it);
|
||||||
if (front < 0)
|
if (padding)
|
||||||
it = m_atoms.insert(it, DisplayAtom{String{' ', -front}, last_face});
|
it = m_atoms.insert(it, std::move(*padding));
|
||||||
|
|
||||||
it = begin();
|
it = begin();
|
||||||
for (; it != end() and col_count > 0; ++it)
|
for (; it != end() and col_count > 0; ++it)
|
||||||
|
|
|
@ -54,8 +54,8 @@ public:
|
||||||
|
|
||||||
void replace(String text)
|
void replace(String text)
|
||||||
{
|
{
|
||||||
kak_assert(m_type == Range);
|
if (m_type == Range)
|
||||||
m_type = ReplacedRange;
|
m_type = ReplacedRange;
|
||||||
m_text = std::move(text);
|
m_text = std::move(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -530,7 +530,7 @@ std::unique_ptr<Highlighter> create_column_highlighter(HighlighterParameters par
|
||||||
if (params.size() != 2)
|
if (params.size() != 2)
|
||||||
throw runtime_error("wrong parameter count");
|
throw runtime_error("wrong parameter count");
|
||||||
|
|
||||||
auto func = [col_expr=params[0], facespec=params[1]]
|
auto func = [col_expr=params[0], facespec=parse_face(params[1])]
|
||||||
(HighlightContext context, DisplayBuffer& display_buffer, BufferRange)
|
(HighlightContext context, DisplayBuffer& display_buffer, BufferRange)
|
||||||
{
|
{
|
||||||
ColumnCount column = -1;
|
ColumnCount column = -1;
|
||||||
|
@ -551,7 +551,7 @@ std::unique_ptr<Highlighter> create_column_highlighter(HighlighterParameters par
|
||||||
if (column < context.setup.first_column or column >= context.setup.first_column + context.context.window().dimensions().column)
|
if (column < context.setup.first_column or column >= context.setup.first_column + context.context.window().dimensions().column)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
column += context.setup.widget_columns;
|
column += context.setup.widget_columns - context.setup.first_column;
|
||||||
for (auto& line : display_buffer.lines())
|
for (auto& line : display_buffer.lines())
|
||||||
{
|
{
|
||||||
auto remaining_col = column;
|
auto remaining_col = column;
|
||||||
|
@ -1801,26 +1801,29 @@ struct ForwardHighlighterApplier
|
||||||
if (first_line != cur_line and first_line != end_line)
|
if (first_line != cur_line and first_line != end_line)
|
||||||
cur_atom = first_line->begin();
|
cur_atom = first_line->begin();
|
||||||
cur_line = first_line;
|
cur_line = first_line;
|
||||||
if (cur_line == end_line)
|
if (cur_line == end_line or cur_line->range().begin >= end)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto& region_lines = region_display.lines();
|
auto& region_lines = region_display.lines();
|
||||||
region_lines.clear();
|
region_lines.clear();
|
||||||
Vector<size_t> insert_idx;
|
Vector<std::pair<DisplayLineList::iterator, size_t>> insert_pos;
|
||||||
while (cur_line != end_line and cur_line->range().begin < end)
|
while (cur_line != end_line and cur_line->range().begin < end)
|
||||||
{
|
{
|
||||||
auto& line = *cur_line;
|
auto& line = *cur_line;
|
||||||
auto first = std::find_if(cur_atom, line.end(), [&](auto&& atom) { return atom.has_buffer_range() and atom.end() > begin; });
|
auto first = std::find_if(cur_atom, line.end(), [&](auto&& atom) { return atom.has_buffer_range() and atom.end() > begin; });
|
||||||
if (first->type() != DisplayAtom::ReplacedRange and first->begin() < begin)
|
if (first->type() == DisplayAtom::Range and first->begin() < begin)
|
||||||
first = ++line.split(first, begin);
|
first = ++line.split(first, begin);
|
||||||
auto idx = first - line.begin();
|
auto idx = first - line.begin();
|
||||||
|
|
||||||
auto last = std::find_if(first, line.end(), [&](auto&& atom) { return atom.has_buffer_range() and atom.end() > end; });
|
auto last = std::find_if(first, line.end(), [&](auto&& atom) { return atom.has_buffer_range() and atom.end() > end; });
|
||||||
if (last != line.end() and last->type() != DisplayAtom::ReplacedRange and last->begin() < end and last->end() > end)
|
if (last != line.end() and last->type() == DisplayAtom::Range and last->begin() < end)
|
||||||
last = ++line.split(last, end);
|
last = ++line.split(last, end);
|
||||||
|
|
||||||
insert_idx.push_back(idx);
|
if (line.begin() + idx != last)
|
||||||
region_lines.push_back(line.extract(line.begin() + idx, last));
|
{
|
||||||
|
insert_pos.emplace_back(cur_line, idx);
|
||||||
|
region_lines.push_back(line.extract(line.begin() + idx, last));
|
||||||
|
}
|
||||||
|
|
||||||
if (idx != line.atoms().size())
|
if (idx != line.atoms().size())
|
||||||
break;
|
break;
|
||||||
|
@ -1828,21 +1831,20 @@ struct ForwardHighlighterApplier
|
||||||
cur_atom = cur_line->begin();
|
cur_atom = cur_line->begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (region_lines.empty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
region_display.compute_range();
|
region_display.compute_range();
|
||||||
highlighter.highlight(context, region_display, {begin, end});
|
highlighter.highlight(context, region_display, {begin, end});
|
||||||
|
|
||||||
for (size_t i = 0; i < region_lines.size(); ++i, ++first_line)
|
for (size_t i = 0; i < insert_pos.size(); ++i)
|
||||||
{
|
{
|
||||||
auto it = first_line->insert(
|
auto& [line_it, idx] = insert_pos[i];
|
||||||
first_line->begin() + insert_idx[i],
|
auto& atoms = region_lines[i].atoms();
|
||||||
std::move_iterator(region_lines[i].begin()),
|
auto it = line_it->insert(
|
||||||
std::move_iterator(region_lines[i].end()));
|
line_it->begin() + idx,
|
||||||
|
std::move_iterator(atoms.begin()),
|
||||||
|
std::move_iterator(atoms.end()));
|
||||||
|
|
||||||
if (first_line == cur_line)
|
if (line_it == cur_line)
|
||||||
cur_atom = it + region_lines[i].atoms().size();
|
cur_atom = it + atoms.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -155,12 +155,14 @@ const DisplayBuffer& Window::update_display_buffer(const Context& context)
|
||||||
|
|
||||||
m_display_buffer.compute_range();
|
m_display_buffer.compute_range();
|
||||||
const BufferRange range{{0,0}, buffer().end_coord()};
|
const BufferRange range{{0,0}, buffer().end_coord()};
|
||||||
for (auto pass : { HighlightPass::Wrap, HighlightPass::Move, HighlightPass::Colorize })
|
m_builtin_highlighters.highlight({context, setup, HighlightPass::Wrap, {}}, m_display_buffer, range);
|
||||||
m_builtin_highlighters.highlight({context, setup, pass, {}}, m_display_buffer, range);
|
m_builtin_highlighters.highlight({context, setup, HighlightPass::Move, {}}, m_display_buffer, range);
|
||||||
|
|
||||||
for (auto& line : m_display_buffer.lines())
|
for (auto& line : m_display_buffer.lines())
|
||||||
line.trim_from(setup.widget_columns, setup.first_column, m_dimensions.column);
|
line.trim_from(setup.widget_columns, setup.first_column, m_dimensions.column);
|
||||||
|
|
||||||
|
m_builtin_highlighters.highlight({context, setup, HighlightPass::Colorize, {}}, m_display_buffer, range);
|
||||||
|
|
||||||
m_display_buffer.optimize();
|
m_display_buffer.optimize();
|
||||||
|
|
||||||
set_position({setup.first_line, setup.first_column});
|
set_position({setup.first_line, setup.first_column});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user