mirror of https://github.com/odrling/Aegisub
Repaint the entire audio display when style ranges change
In practice, painting audio from the cache isn't all that expensive, so the limited refreshing was just introducing places for bugs without improving performance all that much. Closes #1432. Originally committed to SVN as r6439.
This commit is contained in:
parent
ddc8dc9eca
commit
7ca0ad3233
|
@ -1235,60 +1235,13 @@ void AudioDisplay::OnStyleRangesChanged()
|
|||
AudioStyleRangeMerger asrm;
|
||||
controller->GetTimingController()->GetRenderingStyles(asrm);
|
||||
|
||||
std::map<int, int> old_style_ranges;
|
||||
swap(old_style_ranges, style_ranges);
|
||||
style_ranges.clear();
|
||||
style_ranges.insert(asrm.begin(), asrm.end());
|
||||
|
||||
std::map<int, int>::iterator old_style_it = old_style_ranges.begin();
|
||||
std::map<int, int>::iterator new_style_it = style_ranges.begin();
|
||||
|
||||
int old_style = old_style_it->second;
|
||||
int new_style = new_style_it->second;
|
||||
int range_start = 0;
|
||||
|
||||
// Repaint each range which has changed
|
||||
while (old_style_it != old_style_ranges.end() || new_style_it != style_ranges.end())
|
||||
{
|
||||
if (new_style_it == style_ranges.end() || (old_style_it != old_style_ranges.end() && old_style_it->first <= new_style_it->first))
|
||||
{
|
||||
if (old_style != new_style)
|
||||
Redraw(range_start, old_style_it->first);
|
||||
old_style = old_style_it->second;
|
||||
range_start = old_style_it->first;
|
||||
++old_style_it;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (old_style != new_style)
|
||||
Redraw(range_start, new_style_it->first);
|
||||
new_style = new_style_it->second;
|
||||
range_start = new_style_it->first;
|
||||
++new_style_it;
|
||||
}
|
||||
}
|
||||
|
||||
// Fill in the last style range
|
||||
if (old_style != new_style)
|
||||
{
|
||||
Redraw(range_start, TimeFromRelativeX(GetClientSize().GetWidth()));
|
||||
}
|
||||
}
|
||||
|
||||
void AudioDisplay::Redraw(int time_start, int time_end)
|
||||
{
|
||||
if (time_start == time_end) return;
|
||||
|
||||
time_start = RelativeXFromTime(time_start) - foot_size;
|
||||
time_end = RelativeXFromTime(time_end) + foot_size;
|
||||
|
||||
if (time_end >= 0 && time_start <= GetClientSize().GetWidth())
|
||||
{
|
||||
RefreshRect(wxRect(time_start, audio_top, time_end - time_start, audio_height), false);
|
||||
}
|
||||
RefreshRect(wxRect(0, audio_top, GetClientSize().GetWidth(), audio_height), false);
|
||||
}
|
||||
|
||||
void AudioDisplay::OnMarkerMoved()
|
||||
{
|
||||
/// @todo investigate if it's worth refreshing only the changed spots
|
||||
RefreshRect(wxRect(0, audio_top, GetClientSize().GetWidth(), audio_height), false);
|
||||
}
|
||||
|
|
|
@ -177,11 +177,6 @@ class AudioDisplay: public wxWindow {
|
|||
/// in Options and need to be reloaded to take effect.
|
||||
void ReloadRenderingSettings();
|
||||
|
||||
/// @brief Repaint a time range
|
||||
/// @param ms_start Beginning of range to repaint
|
||||
/// @param ms_end End of range to repaint
|
||||
void Redraw(int ms_start, int ms_end);
|
||||
|
||||
/// Paint the audio data for a time range
|
||||
/// @param dc DC to paint to
|
||||
/// @param updtime Time range to repaint
|
||||
|
|
|
@ -554,6 +554,7 @@ void AudioTimingControllerDialogue::SetMarker(AudioMarkerDialogueTiming *marker,
|
|||
timing_modified = true;
|
||||
if (auto_commit->GetBool()) Commit();
|
||||
UpdateSelection();
|
||||
AnnounceMarkerMoved();
|
||||
}
|
||||
|
||||
static bool noncomment_dialogue(AssEntry *e)
|
||||
|
@ -616,6 +617,7 @@ void AudioTimingControllerDialogue::RegenerateInactiveLines()
|
|||
|
||||
sort(inactive_markers.begin(), inactive_markers.end());
|
||||
AnnounceUpdatedStyleRanges();
|
||||
AnnounceMarkerMoved();
|
||||
}
|
||||
|
||||
int AudioTimingControllerDialogue::SnapPosition(int position, int snap_range) const
|
||||
|
|
Loading…
Reference in New Issue