From: Robin Gareus Date: Sun, 14 Jul 2013 09:34:31 +0000 (+0200) Subject: improve caching of metric and tick patters X-Git-Tag: 3.3~28 X-Git-Url: https://main.carlh.net/gitweb/?a=commitdiff_plain;h=2106a12edd6dcdf1189b7cfd68b07a0761d77c46;p=ardour.git improve caching of metric and tick patters * selectively clear cache (meterbridge, mixer) * free memory of patterns on clear --- 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 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 types, Gtk::DrawingArea *mta); gint meter_expose_metrics (GdkEventExpose *ev, std::vector 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;