summaryrefslogtreecommitdiff
path: root/gtk2_ardour/meter_patterns.cc
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 /gtk2_ardour/meter_patterns.cc
parentcb9b1801ec4ef5974bc9365c1b551a864615a5cc (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.cc33
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();
}