diff options
author | Robin Gareus <robin@gareus.org> | 2013-07-14 11:34:31 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2013-07-14 11:34:31 +0200 |
commit | 2106a12edd6dcdf1189b7cfd68b07a0761d77c46 (patch) | |
tree | c64b5d40703d26279485d908ce82dc44889dbb0a /gtk2_ardour/meter_patterns.cc | |
parent | cb9b1801ec4ef5974bc9365c1b551a864615a5cc (diff) |
improve caching of metric and tick patters
* selectively clear cache (meterbridge, mixer)
* free memory of patterns on clear
Diffstat (limited to 'gtk2_ardour/meter_patterns.cc')
-rw-r--r-- | gtk2_ardour/meter_patterns.cc | 33 |
1 files changed, 29 insertions, 4 deletions
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(); } |