improve caching of metric and tick patters

* selectively clear cache (meterbridge, mixer)
* free memory of patterns on clear
This commit is contained in:
Robin Gareus 2013-07-14 11:34:31 +02:00
parent cb9b1801ec
commit 2106a12edd
5 changed files with 32 additions and 8 deletions

View file

@ -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

View file

@ -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();
}

View file

@ -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

View file

@ -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;

View file

@ -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;