summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-14 11:34:31 +0200
committerRobin Gareus <robin@gareus.org>2013-07-14 11:34:31 +0200
commit2106a12edd6dcdf1189b7cfd68b07a0761d77c46 (patch)
treec64b5d40703d26279485d908ce82dc44889dbb0a
parentcb9b1801ec4ef5974bc9365c1b551a864615a5cc (diff)
improve caching of metric and tick patters
* selectively clear cache (meterbridge, mixer) * free memory of patterns on clear
-rw-r--r--gtk2_ardour/gain_meter.cc2
-rw-r--r--gtk2_ardour/meter_patterns.cc33
-rw-r--r--gtk2_ardour/meter_patterns.h2
-rw-r--r--gtk2_ardour/meter_strip.cc2
-rw-r--r--gtk2_ardour/meterbridge.cc1
5 files changed, 32 insertions, 8 deletions
diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc
index ae6f03f210..36ed5e918e 100644
--- a/gtk2_ardour/gain_meter.cc
+++ b/gtk2_ardour/gain_meter.cc
@@ -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
diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc
index 9de01146b0..f749927e9a 100644
--- a/gtk2_ardour/meter_patterns.cc
+++ b/gtk2_ardour/meter_patterns.cc
@@ -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();
}
diff --git a/gtk2_ardour/meter_patterns.h b/gtk2_ardour/meter_patterns.h
index df755f7ace..a664f478f2 100644
--- a/gtk2_ardour/meter_patterns.h
+++ b/gtk2_ardour/meter_patterns.h
@@ -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
diff --git a/gtk2_ardour/meter_strip.cc b/gtk2_ardour/meter_strip.cc
index a4cc56d61c..88a946585a 100644
--- a/gtk2_ardour/meter_strip.cc
+++ b/gtk2_ardour/meter_strip.cc
@@ -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;
diff --git a/gtk2_ardour/meterbridge.cc b/gtk2_ardour/meterbridge.cc
index 227f533a18..24b21656d1 100644
--- a/gtk2_ardour/meterbridge.cc
+++ b/gtk2_ardour/meterbridge.cc
@@ -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;