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)
|
, context(context)
|
||||||
, columns(GetGridColumns())
|
, columns(GetGridColumns())
|
||||||
, columns_visible(OPT_GET("Subtitle/Grid/Column")->GetListBool())
|
, 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);
|
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 &) {
|
void BaseGrid::OnPaint(wxPaintEvent &) {
|
||||||
// Find which columns need to be repainted
|
// Find which columns need to be repainted
|
||||||
std::vector<char> paint_columns;
|
std::vector<char> paint_columns;
|
||||||
|
@ -357,6 +375,7 @@ void BaseGrid::OnPaint(wxPaintEvent &) {
|
||||||
|
|
||||||
const auto active_line = context->selectionController->GetActiveLine();
|
const auto active_line = context->selectionController->GetActiveLine();
|
||||||
auto const& selection = context->selectionController->GetSelectedSet();
|
auto const& selection = context->selectionController->GetSelectedSet();
|
||||||
|
visible_rows.clear();
|
||||||
|
|
||||||
for (int i : agi::util::range(nDraw)) {
|
for (int i : agi::util::range(nDraw)) {
|
||||||
wxBrush color = row_colors.Default;
|
wxBrush color = row_colors.Default;
|
||||||
|
@ -369,8 +388,12 @@ void BaseGrid::OnPaint(wxPaintEvent &) {
|
||||||
color = row_colors.Selection;
|
color = row_colors.Selection;
|
||||||
else if (curDiag->Comment)
|
else if (curDiag->Comment)
|
||||||
color = row_colors.Comment;
|
color = row_colors.Comment;
|
||||||
else if (OPT_GET("Subtitle/Grid/Highlight Subtitles in Frame")->GetBool() && IsDisplayed(curDiag))
|
|
||||||
color = row_colors.Visible;
|
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);
|
dc.SetBrush(color);
|
||||||
|
|
||||||
// Draw row background color
|
// Draw row background color
|
||||||
|
|
|
@ -57,6 +57,9 @@ class BaseGrid final : public wxWindow {
|
||||||
|
|
||||||
int active_row = -1;
|
int active_row = -1;
|
||||||
|
|
||||||
|
/// Rows which are visible on the current video frame
|
||||||
|
std::vector<int> visible_rows;
|
||||||
|
|
||||||
agi::Context *context; ///< Associated project context
|
agi::Context *context; ///< Associated project context
|
||||||
|
|
||||||
std::vector<std::unique_ptr<GridColumn>> columns;
|
std::vector<std::unique_ptr<GridColumn>> columns;
|
||||||
|
@ -95,6 +98,7 @@ class BaseGrid final : public wxWindow {
|
||||||
void OnSize(wxSizeEvent &event);
|
void OnSize(wxSizeEvent &event);
|
||||||
void OnSubtitlesCommit(int type);
|
void OnSubtitlesCommit(int type);
|
||||||
void OnActiveLineChanged(AssDialogue *);
|
void OnActiveLineChanged(AssDialogue *);
|
||||||
|
void OnSeek();
|
||||||
|
|
||||||
void AdjustScrollbar();
|
void AdjustScrollbar();
|
||||||
void SetColumnWidths();
|
void SetColumnWidths();
|
||||||
|
|
Loading…
Reference in New Issue