improve caching of metric and tick patters
authorRobin Gareus <robin@gareus.org>
Sun, 14 Jul 2013 09:34:31 +0000 (11:34 +0200)
committerRobin Gareus <robin@gareus.org>
Sun, 14 Jul 2013 09:34:31 +0000 (11:34 +0200)
* selectively clear cache (meterbridge, mixer)
* free memory of patterns on clear

gtk2_ardour/gain_meter.cc
gtk2_ardour/meter_patterns.cc
gtk2_ardour/meter_patterns.h
gtk2_ardour/meter_strip.cc
gtk2_ardour/meterbridge.cc

index ae6f03f2109371a5fcf6f5fa7e79845357047f88..36ed5e918e8c494c374b8bd4fbc4504274c20be7 100644 (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
index 9de01146b01d4f1bbe7c987952076d4351256dd8..f749927e9a3c56eaeafabb8ab7c0f036d5fa4dea 100644 (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();
 }
index df755f7acee9d520161a4221352df7bcea638f9b..a664f478f221a5693399f80618b4d0f8a1c3b332 100644 (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
 
index a4cc56d61c223a14cefba83866fb604b45287937..88a946585a105f27e50a3a1a7acf82760035de43 100644 (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;
index 227f533a18cc6ce5b6e97e683d37e218049c0698..24b21656d165f29d410915474fc80b22dc242bef 100644 (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;