use ArdourMono font for metric patterns
[ardour.git] / gtk2_ardour / meter_patterns.cc
index c34c492f757ba3bf01663271538dc93b9cfbe052..9a2cab00b58cb802867f281949f89d1eb3459538 100644 (file)
@@ -35,16 +35,42 @@ using namespace PBD;
 using namespace Gtk;
 using namespace Gtkmm2ext;
 using namespace std;
-
+using namespace ArdourMeter;
 
 static const int max_pattern_metric_size = 1026;
 
-sigc::signal<void> ResetAllPeakDisplays;
-sigc::signal<void,ARDOUR::Route*> ResetRoutePeakDisplays;
-sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
-sigc::signal<void> RedrawMetrics;
+sigc::signal<void> ArdourMeter::ResetAllPeakDisplays;
+sigc::signal<void,ARDOUR::Route*> ArdourMeter::ResetRoutePeakDisplays;
+sigc::signal<void,ARDOUR::RouteGroup*> ArdourMeter::ResetGroupPeakDisplays;
+sigc::signal<void> ArdourMeter::RedrawMetrics;
+
+sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> ArdourMeter::SetMeterTypeMulti;
+
+namespace ArdourMeter {
+       typedef std::map<std::string,cairo_pattern_t*> TickPatterns;
+       typedef std::map<std::string,cairo_pattern_t*> MetricPatterns;
+}
+
+static ArdourMeter::TickPatterns ticks_patterns;
+static ArdourMeter::MetricPatterns metric_patterns;
 
-cairo_pattern_t*
+const std::string
+ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
+{
+       switch (mt) {
+               case MeterPeak:
+                       return _("Peak");
+                       break;
+               case MeterKrms:
+                       return _("RMS + Peak");
+                       break;
+               default:
+                       return _("???");
+                       break;
+       }
+}
+
+static cairo_pattern_t*
 meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
 {
        Glib::RefPtr<Gdk::Window> win (w.get_window());
@@ -52,8 +78,8 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
        bool background;
        gint width, height;
        win->get_size (width, height);
-       background =
-                  w.get_name().substr(w.get_name().length() - 4) == "Left"
+       background = types.size() == 0
+               || w.get_name().substr(w.get_name().length() - 4) == "Left"
                || w.get_name().substr(w.get_name().length() - 5) == "Right";
 
        cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
@@ -102,8 +128,9 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
                        points.insert (std::pair<int,float>(-30, 0.5));
                        if (Config->get_meter_line_up_level() == MeteringLineUp24) {
                                points.insert (std::pair<int,float>(-24, 0.5));
+                       } else {
+                               points.insert (std::pair<int,float>(-25, 0.5));
                        }
-                       points.insert (std::pair<int,float>(-25, 0.5));
                        points.insert (std::pair<int,float>(-20, 1.0));
 
                        points.insert (std::pair<int,float>(-19, 0.5));
@@ -192,18 +219,19 @@ meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
 }
 
 
-cairo_pattern_t*
+static cairo_pattern_t*
 meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
 {
        Glib::RefPtr<Gdk::Window> win (w.get_window());
 
-       bool tickleft;
+       bool tickleft, tickright;
        bool background;
        gint width, height;
        win->get_size (width, height);
 
        tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
-       background = tickleft || w.get_name().substr(w.get_name().length() - 5) == "Right";
+       tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
+       background = types.size() == 0 || tickleft || tickright;
 
        cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
        cairo_t* cr = cairo_create (surface);
@@ -216,9 +244,7 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
        Pango::AttrFontDesc* font_attr;
        Pango::FontDescription font;
 
-       font = Pango::FontDescription (""); // use defaults
-       //font = get_font_for_style("gain-fader");
-       //font = w.get_style()->get_font();
+       font = Pango::FontDescription ("ArdourMono");
 
        font.set_weight (Pango::WEIGHT_NORMAL);
        font.set_size (9.0 * PANGO_SCALE);
@@ -228,12 +254,12 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
 
        font.set_weight (Pango::WEIGHT_ULTRALIGHT);
        font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED);
-       font.set_size (7.5 * PANGO_SCALE);
+       font.set_size (8.0 * PANGO_SCALE);
        font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
        midi_font_attributes.change (*font_attr);
        delete font_attr;
 
-       font.set_size (7.0 * PANGO_SCALE);
+       font.set_size (6.0 * PANGO_SCALE);
        font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
        unit_font_attributes.change (*font_attr);
        delete font_attr;
@@ -269,6 +295,11 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
                } else {
                        c = w.get_style()->get_fg (Gtk::STATE_NORMAL);
                        cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
+
+                       if (!tickleft && !tickright && (*i) == DataType::AUDIO) {
+                               tickleft = true;
+                       }
+
                }
 
                std::map<int,float> points;
@@ -337,13 +368,14 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
                                snprintf (buf, sizeof (buf), "%+2d", j->first);
                                pos = height - (gint) floor (height * fraction);
                                if (tickleft) {
-                                       cairo_move_to(cr, width-2.5, pos + .5);
+                                       cairo_move_to(cr, width-1.5, pos + .5);
                                        cairo_line_to(cr, width, pos + .5);
-                               } else {
+                                       cairo_stroke (cr);
+                               } else if (tickright) {
                                        cairo_move_to(cr, 0, pos + .5);
-                                       cairo_line_to(cr, 2.5, pos + .5);
+                                       cairo_line_to(cr, 1.5, pos + .5);
+                                       cairo_stroke (cr);
                                }
-                               cairo_stroke (cr);
                                break;
                        case DataType::MIDI:
                                cairo_set_line_width (cr, 1.0);
@@ -351,12 +383,15 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
                                snprintf (buf, sizeof (buf), "%3d", j->first);
                                pos = 1 + height - (gint) rintf (height * fraction);
                                pos = min (pos, height);
+#if 0
                                if (tickleft) {
                                        cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
-                               } else {
+                                       cairo_fill(cr);
+                               } else if (tickright) {
                                        cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
+                                       cairo_fill(cr);
                                }
-                               cairo_fill(cr);
+#endif
                                break;
                        }
 
@@ -371,7 +406,7 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
                        p = min (p, height - th);
                        p = max (p, 0);
 
-                       cairo_move_to (cr, width-4-tw, p);
+                       cairo_move_to (cr, width-3-tw, p);
                        pango_cairo_show_layout (cr, layout->gobj());
                }
        }
@@ -391,7 +426,7 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
                }
                Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
                cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
-               cairo_move_to (cr, 1, height - th - 1.5);
+               cairo_move_to (cr, 2, height - th - 1.5);
                pango_cairo_show_layout (cr, layout->gobj());
        }
 
@@ -404,10 +439,8 @@ meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
 }
 
 
-typedef std::map<std::string,cairo_pattern_t*> TickPatterns;
-static  TickPatterns ticks_patterns;
-
-gint meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
+gint
+ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
 {
        Glib::RefPtr<Gdk::Window> win (mta->get_window());
        cairo_t* cr;
@@ -443,10 +476,8 @@ gint meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types
        return true;
 }
 
-typedef std::map<std::string,cairo_pattern_t*> MetricPatterns;
-static  MetricPatterns metric_patterns;
-
-gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
+gint
+ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
 {
        Glib::RefPtr<Gdk::Window> win (mma->get_window());
        cairo_t* cr;
@@ -482,8 +513,35 @@ gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> typ
        return true;
 }
 
-void meter_clear_pattern_cache() {
-       metric_patterns.clear();
-       ticks_patterns.clear();
+void
+ArdourMeter::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();
 }