change FastMeter drawing implementation to use Cairo instead of GDK; some subtle...
[ardour.git] / libs / gtkmm2ext / gtkmm2ext / fastmeter.h
index 775cb201cd21a6957731b745638b6ce813fcf293..4655c5bb9c314788ad23e63472d9f730b0b125a6 100644 (file)
@@ -20,6 +20,9 @@
 #ifndef __gtkmm2ext_fastmeter_h__
 #define __gtkmm2ext_fastmeter_h__
 
+#include <map>
+#include <cairomm/pattern.h>
+
 #include <gtkmm/drawingarea.h>
 #include <gdkmm/pixbuf.h>
 
@@ -27,15 +30,16 @@ namespace Gtkmm2ext {
 
 class FastMeter : public Gtk::DrawingArea {
   public:
+        typedef std::map<int,Cairo::RefPtr<Cairo::Pattern> > PatternMap;
        enum Orientation { 
                Horizontal,
                Vertical
        };
        
-       FastMeter (long hold_cnt, unsigned long width, Orientation);
+       FastMeter (long hold_cnt, unsigned long width, Orientation, int len=0, int clrb0=0x00ff00, int clr1=0xffff00, int clr2=0xffaa00, int clr3=0xff0000);
        virtual ~FastMeter ();
        
-       void set (float level, float user_level=0.0f);
+       void set (float level);
        void clear ();
 
        float get_level() { return current_level; }
@@ -52,12 +56,14 @@ class FastMeter : public Gtk::DrawingArea {
 
   private:  
 
-       Glib::RefPtr<Gdk::Pixbuf> pixbuf;
+        Cairo::RefPtr<Cairo::Pattern> pattern;
        gint pixheight;
        gint pixwidth;
+       static int _clr0, _clr1, _clr2, _clr3;
 
        Orientation orientation;
        GdkRectangle pixrect;
+       GdkRectangle last_peak_rect;
        gint request_width;
        gint request_height;
        unsigned long hold_cnt;
@@ -68,18 +74,17 @@ class FastMeter : public Gtk::DrawingArea {
        
        bool vertical_expose (GdkEventExpose*);
        bool horizontal_expose (GdkEventExpose*);
-       
-       static Glib::RefPtr<Gdk::Pixbuf> request_vertical_meter(int w, int h);
-
-       static Glib::RefPtr<Gdk::Pixbuf> *v_pixbuf_cache;
-       static int min_v_pixbuf_size;
-       static int max_v_pixbuf_size;
+       void queue_vertical_redraw (const Glib::RefPtr<Gdk::Window>&, float);
+       void queue_horizontal_redraw (const Glib::RefPtr<Gdk::Window>&, float);
 
-       static Glib::RefPtr<Gdk::Pixbuf> request_horizontal_meter(int w, int h);
+        static Cairo::RefPtr<Cairo::Pattern> generate_meter_pattern (int width, int height);
+       static Cairo::RefPtr<Cairo::Pattern> request_vertical_meter (int w, int h);
+       static Cairo::RefPtr<Cairo::Pattern> request_horizontal_meter (int w, int h);
 
-       static Glib::RefPtr<Gdk::Pixbuf> *h_pixbuf_cache;
-       static int min_h_pixbuf_size;
-       static int max_h_pixbuf_size;
+        static PatternMap v_pattern_cache;
+        static PatternMap h_pattern_cache;
+        static int min_pattern_metric_size; // min dimension for axis that displays the meter level
+        static int max_pattern_metric_size; // max dimension for axis that displays the meter level
 };