mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-11 09:06:33 +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");
|
set_meter_strip_name ("AudioMidiTrackMetricsInactive");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
meter_clear_pattern_cache(); // XXX only once
|
meter_clear_pattern_cache(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -485,9 +485,34 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> typ
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void meter_clear_pattern_cache() {
|
void meter_clear_pattern_cache(int which) {
|
||||||
// TODO allow to clear meterbridge "*Left|Right" patterns independenly
|
MetricPatterns::iterator i = metric_patterns.begin();
|
||||||
metric_patterns.clear();
|
TickPatterns::iterator j = ticks_patterns.begin();
|
||||||
ticks_patterns.clear();
|
|
||||||
|
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();
|
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_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);
|
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
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -372,14 +372,12 @@ MeterStrip::meter_configuration_changed (ChanCount c)
|
||||||
void
|
void
|
||||||
MeterStrip::on_size_request (Gtk::Requisition* r)
|
MeterStrip::on_size_request (Gtk::Requisition* r)
|
||||||
{
|
{
|
||||||
meter_clear_pattern_cache();
|
|
||||||
VBox::on_size_request(r);
|
VBox::on_size_request(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MeterStrip::on_size_allocate (Gtk::Allocation& a)
|
MeterStrip::on_size_allocate (Gtk::Allocation& a)
|
||||||
{
|
{
|
||||||
meter_clear_pattern_cache();
|
|
||||||
const int wh = a.get_height();
|
const int wh = a.get_height();
|
||||||
int nh = ceilf(wh * .11f);
|
int nh = ceilf(wh * .11f);
|
||||||
if (nh < 52) nh = 52;
|
if (nh < 52) nh = 52;
|
||||||
|
|
|
||||||
|
|
@ -327,6 +327,7 @@ Meterbridge::scroll_right ()
|
||||||
void
|
void
|
||||||
Meterbridge::on_size_request (Gtk::Requisition* r)
|
Meterbridge::on_size_request (Gtk::Requisition* r)
|
||||||
{
|
{
|
||||||
|
meter_clear_pattern_cache(3);
|
||||||
Gtk::Window::on_size_request(r);
|
Gtk::Window::on_size_request(r);
|
||||||
|
|
||||||
Gdk::Geometry geom;
|
Gdk::Geometry geom;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue