mirror of https://github.com/odrling/Aegisub
Avoid pointless repaints of the grid when seeking video
Keep track of which lines are displayed on the current video frame so that video seeks only have to repaint the grid when the set actually changes. Speeds up video playback on non-fbf stuff by ~15%.
This commit is contained in:
parent
633fa0e4d7
commit
62c28ce0d3
|
@ -98,7 +98,7 @@ BaseGrid::BaseGrid(wxWindow* parent, agi::Context *context)
|
|||
, context(context)
|
||||
, columns(GetGridColumns())
|
||||
, columns_visible(OPT_GET("Subtitle/Grid/Column")->GetListBool())
|
||||
, seek_listener(context->videoController->AddSeekListener([&] { Refresh(false); }))
|
||||
, seek_listener(context->videoController->AddSeekListener(&BaseGrid::OnSeek, this))
|
||||
{
|
||||
scrollBar->SetScrollbar(0,10,100,10);
|
||||
|
||||
|
@ -276,6 +276,24 @@ void BaseGrid::SelectRow(int row, bool addToSelected, bool select) {
|
|||
}
|
||||
}
|
||||
|
||||
void BaseGrid::OnSeek() {
|
||||
int lines = GetClientSize().GetHeight() / lineHeight + 1;
|
||||
lines = mid(0, lines, GetRows() - yPos);
|
||||
|
||||
auto it = begin(visible_rows);
|
||||
for (int i : boost::irange(yPos, yPos + lines)) {
|
||||
if (IsDisplayed(index_line_map[i])) {
|
||||
if (it == end(visible_rows) || *it != i) {
|
||||
Refresh(false);
|
||||
return;
|
||||
}
|
||||
++it;
|
||||
}
|
||||
}
|
||||
if (it != end(visible_rows))
|
||||
Refresh(false);
|
||||
}
|
||||
|
||||
void BaseGrid::OnPaint(wxPaintEvent &) {
|
||||
// Find which columns need to be repainted
|
||||
std::vector<char> paint_columns;
|
||||
|
@ -357,6 +375,7 @@ void BaseGrid::OnPaint(wxPaintEvent &) {
|
|||
|
||||
const auto active_line = context->selectionController->GetActiveLine();
|
||||
auto const& selection = context->selectionController->GetSelectedSet();
|
||||
visible_rows.clear();
|
||||
|
||||
for (int i : agi::util::range(nDraw)) {
|
||||
wxBrush color = row_colors.Default;
|
||||
|
@ -369,8 +388,12 @@ void BaseGrid::OnPaint(wxPaintEvent &) {
|
|||
color = row_colors.Selection;
|
||||
else if (curDiag->Comment)
|
||||
color = row_colors.Comment;
|
||||
else if (OPT_GET("Subtitle/Grid/Highlight Subtitles in Frame")->GetBool() && IsDisplayed(curDiag))
|
||||
|
||||
if (OPT_GET("Subtitle/Grid/Highlight Subtitles in Frame")->GetBool() && IsDisplayed(curDiag)) {
|
||||
if (color == row_colors.Default)
|
||||
color = row_colors.Visible;
|
||||
visible_rows.push_back(i + yPos);
|
||||
}
|
||||
dc.SetBrush(color);
|
||||
|
||||
// Draw row background color
|
||||
|
|
|
@ -57,6 +57,9 @@ class BaseGrid final : public wxWindow {
|
|||
|
||||
int active_row = -1;
|
||||
|
||||
/// Rows which are visible on the current video frame
|
||||
std::vector<int> visible_rows;
|
||||
|
||||
agi::Context *context; ///< Associated project context
|
||||
|
||||
std::vector<std::unique_ptr<GridColumn>> columns;
|
||||
|
@ -95,6 +98,7 @@ class BaseGrid final : public wxWindow {
|
|||
void OnSize(wxSizeEvent &event);
|
||||
void OnSubtitlesCommit(int type);
|
||||
void OnActiveLineChanged(AssDialogue *);
|
||||
void OnSeek();
|
||||
|
||||
void AdjustScrollbar();
|
||||
void SetColumnWidths();
|
||||
|
|
Loading…
Reference in New Issue