OSC: Catch new strips, gone strips and redo banks and observers. Add more select...
[ardour.git] / libs / gtkmm2ext / fastmeter.cc
index d4eb21b5e22437e9ef7bfcfc17eaa774e22a191c..c144a963bbd673df7e6734a1b998140f3a8278c6 100644 (file)
@@ -133,6 +133,14 @@ FastMeter::~FastMeter ()
 {
 }
 
+void
+FastMeter::flush_pattern_cache () {
+       hb_pattern_cache.clear();
+       hm_pattern_cache.clear();
+       vb_pattern_cache.clear();
+       vm_pattern_cache.clear();
+}
+
 Cairo::RefPtr<Cairo::Pattern>
 FastMeter::generate_meter_pattern (
                int width, int height, int *clr, float *stp, int styleflags, bool horiz)
@@ -222,7 +230,10 @@ FastMeter::generate_meter_pattern (
                        cairo_set_line_width(tc, 1.0);
                        cairo_set_source_rgba(tc, .0, .0, .0, 0.4);
                        //cairo_set_operator (tc, CAIRO_OPERATOR_SOURCE);
-                       for (float y=0.5; y < height; y+= 2.0) {
+                       for (int i = 0; float y = 0.5 + i * 2.0; ++i) {
+                               if (y >= height) {
+                                       break;
+                               }
                                cairo_move_to(tc, 0, y);
                                cairo_line_to(tc, width, y);
                                cairo_stroke (tc);
@@ -592,7 +603,7 @@ FastMeter::vertical_expose (cairo_t* cr, cairo_rectangle_t* area)
                last_peak_rect.width = pixwidth;
                last_peak_rect.y = max(1, 1 + pixheight - (int) floor (pixheight * current_peak));
                if (_styleflags & 2) { // LED stripes
-                       last_peak_rect.y = max(0, 2 * (int) floor (last_peak_rect.y / 2));
+                       last_peak_rect.y = max(0, (last_peak_rect.y & (~1)));
                }
                if (bright_hold || (_styleflags & 2)) {
                        last_peak_rect.height = max(0, min(3, pixheight - last_peak_rect.y - 1 ));
@@ -712,7 +723,9 @@ FastMeter::set (float lvl, float peak)
 
        current_level = lvl;
 
-       if (current_level == old_level && current_peak == old_peak && (hold_state == 0 || peak != -1)) {
+       const float pixscale = (orientation == Vertical) ? pixheight : pixwidth;
+#define PIX(X) floor(pixscale * (X))
+       if (PIX(current_level) == PIX(old_level) && PIX(current_peak) == PIX(old_peak) && (hold_state == 0 || peak != -1)) {
                return;
        }
 
@@ -791,7 +804,7 @@ FastMeter::queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>& win, float ol
                rect.x = 1;
                rect.y = max(1, 1 + pixheight - (int) floor (pixheight * current_peak));
                if (_styleflags & 2) { // LED stripes
-                       rect.y = max(0, 2 * (int) floor (rect.y / 2));
+                       rect.y = max(0, (rect.y & (~1)));
                }
                if (bright_hold || (_styleflags & 2)) {
                        rect.height = max(0, min(3, pixheight - last_peak_rect.y -1 ));