summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2023-06-12 14:38:31 +1000
committerMaxime Coste <mawww@kakoune.org>2023-06-12 16:26:22 +1000
commitaf66a95ef882447ca7bdc2149a8dfde50035301e (patch)
treeeae2a373b6102aca954b5fb0a8b3d7d2b2a223f1 /src
parent5a867ebdd1dac274da185f4a4630b8480181cb9b (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/display_buffer.cc12
-rw-r--r--src/display_buffer.hh4
-rw-r--r--src/highlighters.cc40
-rw-r--r--src/window.cc6
4 files changed, 35 insertions, 27 deletions
diff --git a/src/display_buffer.cc b/src/display_buffer.cc
index 92837c6a..26c58754 100644
--- a/src/display_buffer.cc
+++ b/src/display_buffer.cc
@@ -264,18 +264,22 @@ bool DisplayLine::trim_from(ColumnCount first_col, ColumnCount front, ColumnCoun
}
auto front_it = it;
- Face last_face{};
+ Optional<DisplayAtom> padding;
while (front > 0 and it != end())
{
front -= it->trim_begin(front);
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())
++it;
}
it = m_atoms.erase(front_it, it);
- if (front < 0)
- it = m_atoms.insert(it, DisplayAtom{String{' ', -front}, last_face});
+ if (padding)
+ it = m_atoms.insert(it, std::move(*padding));
it = begin();
for (; it != end() and col_count > 0; ++it)
diff --git a/src/display_buffer.hh b/src/display_buffer.hh
index e3b4983e..23948263 100644
--- a/src/display_buffer.hh
+++ b/src/display_buffer.hh
@@ -54,8 +54,8 @@ public:
void replace(String text)
{
- kak_assert(m_type == Range);
- m_type = ReplacedRange;
+ if (m_type == Range)
+ m_type = ReplacedRange;
m_text = std::move(text);
}
diff --git a/src/highlighters.cc b/src/highlighters.cc
index 15654517..7933d1be 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -530,7 +530,7 @@ std::unique_ptr<Highlighter> create_column_highlighter(HighlighterParameters par
if (params.size() != 2)
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)
{
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)
return;
- column += context.setup.widget_columns;
+ column += context.setup.widget_columns - context.setup.first_column;
for (auto& line : display_buffer.lines())
{
auto remaining_col = column;
@@ -1801,26 +1801,29 @@ struct ForwardHighlighterApplier
if (first_line != cur_line and first_line != end_line)
cur_atom = first_line->begin();
cur_line = first_line;
- if (cur_line == end_line)
+ if (cur_line == end_line or cur_line->range().begin >= end)
return;
auto& region_lines = region_display.lines();
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)
{
auto& line = *cur_line;
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);
auto idx = first - line.begin();
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);
- insert_idx.push_back(idx);
- region_lines.push_back(line.extract(line.begin() + idx, last));
+ if (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())
break;
@@ -1828,21 +1831,20 @@ struct ForwardHighlighterApplier
cur_atom = cur_line->begin();
}
- if (region_lines.empty())
- return;
-
region_display.compute_range();
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(
- first_line->begin() + insert_idx[i],
- std::move_iterator(region_lines[i].begin()),
- std::move_iterator(region_lines[i].end()));
-
- if (first_line == cur_line)
- cur_atom = it + region_lines[i].atoms().size();
+ auto& [line_it, idx] = insert_pos[i];
+ auto& atoms = region_lines[i].atoms();
+ auto it = line_it->insert(
+ line_it->begin() + idx,
+ std::move_iterator(atoms.begin()),
+ std::move_iterator(atoms.end()));
+
+ if (line_it == cur_line)
+ cur_atom = it + atoms.size();
}
}
};
diff --git a/src/window.cc b/src/window.cc
index 9aa3ea73..7926183f 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -155,12 +155,14 @@ const DisplayBuffer& Window::update_display_buffer(const Context& context)
m_display_buffer.compute_range();
const BufferRange range{{0,0}, buffer().end_coord()};
- for (auto pass : { HighlightPass::Wrap, HighlightPass::Move, HighlightPass::Colorize })
- m_builtin_highlighters.highlight({context, setup, pass, {}}, m_display_buffer, range);
+ m_builtin_highlighters.highlight({context, setup, HighlightPass::Wrap, {}}, m_display_buffer, range);
+ m_builtin_highlighters.highlight({context, setup, HighlightPass::Move, {}}, m_display_buffer, range);
for (auto& line : m_display_buffer.lines())
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();
set_position({setup.first_line, setup.first_column});