mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
improve caching of metric and tick patters
* selectively clear cache (meterbridge, mixer) * free memory of patterns on clear
This commit is contained in:
parent
cb9b1801ec
commit
2106a12edd
5 changed files with 32 additions and 8 deletions
|
|
@ -1086,7 +1086,7 @@ GainMeter::meter_configuration_changed (ChanCount c)
|
|||
set_meter_strip_name ("AudioMidiTrackMetricsInactive");
|
||||
}
|
||||
}
|
||||
meter_clear_pattern_cache(); // XXX only once
|
||||
meter_clear_pattern_cache(4);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -485,9 +485,34 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> typ
|
|||
return true;
|
||||
}
|
||||
|
||||
void meter_clear_pattern_cache() {
|
||||
// TODO allow to clear meterbridge "*Left|Right" patterns independenly
|
||||
metric_patterns.clear();
|
||||
ticks_patterns.clear();
|
||||
void meter_clear_pattern_cache(int which) {
|
||||
MetricPatterns::iterator i = metric_patterns.begin();
|
||||
TickPatterns::iterator j = ticks_patterns.begin();
|
||||
|
||||
while (i != metric_patterns.end()) {
|
||||
int m = 4;
|
||||
std::string n = i->first;
|
||||
if (n.substr(n.length() - 4) == "Left") { m = 1; }
|
||||
if (n.substr(n.length() - 5) == "Right") { m = 2; }
|
||||
if (which & m) {
|
||||
cairo_pattern_destroy(i->second);
|
||||
metric_patterns.erase(i++);
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
while (j != ticks_patterns.end()) {
|
||||
int m = 4;
|
||||
std::string n = j->first;
|
||||
if (n.substr(n.length() - 4) == "Left") { m = 1; }
|
||||
if (n.substr(n.length() - 5) == "Right") { m = 2; }
|
||||
if (which & m) {
|
||||
cairo_pattern_destroy(j->second);
|
||||
ticks_patterns.erase(j++);
|
||||
} else {
|
||||
++j;
|
||||
}
|
||||
}
|
||||
RedrawMetrics();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ cairo_pattern_t* meter_render_metrics (Gtk::Widget& w, std::vector<ARDOUR::DataT
|
|||
gint meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta);
|
||||
gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma);
|
||||
|
||||
void meter_clear_pattern_cache();
|
||||
void meter_clear_pattern_cache(int which=7);
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -372,14 +372,12 @@ MeterStrip::meter_configuration_changed (ChanCount c)
|
|||
void
|
||||
MeterStrip::on_size_request (Gtk::Requisition* r)
|
||||
{
|
||||
meter_clear_pattern_cache();
|
||||
VBox::on_size_request(r);
|
||||
}
|
||||
|
||||
void
|
||||
MeterStrip::on_size_allocate (Gtk::Allocation& a)
|
||||
{
|
||||
meter_clear_pattern_cache();
|
||||
const int wh = a.get_height();
|
||||
int nh = ceilf(wh * .11f);
|
||||
if (nh < 52) nh = 52;
|
||||
|
|
|
|||
|
|
@ -327,6 +327,7 @@ Meterbridge::scroll_right ()
|
|||
void
|
||||
Meterbridge::on_size_request (Gtk::Requisition* r)
|
||||
{
|
||||
meter_clear_pattern_cache(3);
|
||||
Gtk::Window::on_size_request(r);
|
||||
|
||||
Gdk::Geometry geom;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue