add nominal owners for all action groups
[ardour.git] / gtk2_ardour / meter_patterns.cc
index b70a75a3a20f55d3b9f848a63bd842aadfcc64bf..f58f35212bf88d98358f3d061e7a15afc6a76b60 100644 (file)
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include <gtkmm/drawingarea.h>
+
 #include <gtkmm2ext/cairo_widget.h>
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/rgb_macros.h>
 
+#include "ardour/logmeter.h"
 #include <ardour/rc_configuration.h>
-#include "ardour_ui.h"
+
 #include "utils.h"
-#include "logmeter.h"
 #include "meter_patterns.h"
+#include "ui_config.h"
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace ARDOUR;
 using namespace ARDOUR_UI_UTILS;
@@ -79,7 +82,10 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
 {
        switch (mt) {
                case MeterPeak:
-                       return _("Peak");
+                       return _("Peak (+6dBFS)");
+                       break;
+               case MeterPeak0dB:
+                       return _("Peak (0dBFS)");
                        break;
                case MeterKrms:
                        return _("RMS + Peak");
@@ -97,18 +103,19 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
                        return _("IEC2/EBU");
                        break;
                case MeterK20:
-                       return _("K20");
+                       return _("K20/RMS");
                        break;
                case MeterK14:
-                       return _("K14");
+                       return _("K14/RMS");
                        break;
                case MeterK12:
-                       return _("K12");
+                       return _("K12/RMS");
                        break;
                case MeterVU:
                        return _("VU");
                        break;
                default:
+                       assert(0);
                        return _("???");
                        break;
        }
@@ -141,6 +148,17 @@ static inline float mtr_col_and_fract(
                                cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
                        }
                        break;
+               case MeterPeak0dB:
+                       fraction = log_meter0dB (val);
+                       if (val >= 0 || val == -9) {
+                               cairo_set_source_rgb (cr,
+                                               UINT_RGBA_R_FLT(peakcolor),
+                                               UINT_RGBA_G_FLT(peakcolor),
+                                               UINT_RGBA_B_FLT(peakcolor));
+                       } else {
+                               cairo_set_source_rgb (cr, c->get_red_p(), c->get_green_p(), c->get_blue_p());
+                       }
+                       break;
                case MeterIEC2BBC:
                case MeterIEC2EBU:
                        fraction = meter_deflect_ppm(val);
@@ -230,18 +248,18 @@ static void set_bg_color (Gtk::Widget& w, cairo_t* cr, MeterType type) {
        double r,g,b,a;
        switch(type) {
                case MeterVU:
-                       ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("meterstrip vu bg"), r, g, b, a);
+                       Gtkmm2ext::color_to_rgba (UIConfiguration::instance().color ("meterstrip vu bg"), r, g, b, a);
                        break;
                case MeterIEC1DIN:
                case MeterIEC1NOR:
                case MeterIEC2BBC:
                case MeterIEC2EBU:
-                       ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("meterstrip ppm bg"), r, g, b, a);
+                       Gtkmm2ext::color_to_rgba (UIConfiguration::instance().color ("meterstrip ppm bg"), r, g, b, a);
                        break;
                case MeterK12:
                case MeterK14:
                case MeterK20:
-                       ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("meterstrip dpm bg"), r, g, b, a);
+                       Gtkmm2ext::color_to_rgba (UIConfiguration::instance().color ("meterstrip dpm bg"), r, g, b, a);
                        break;
                default:
                        {
@@ -259,16 +277,16 @@ static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) {
        double r,g,b,a;
        switch(type) {
                case MeterVU:
-                       ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("meterstrip vu fg"), r, g, b, a);
+                       Gtkmm2ext::color_to_rgba (UIConfiguration::instance().color ("meterstrip vu fg"), r, g, b, a);
                        break;
                case MeterIEC1DIN:
                case MeterIEC1NOR:
                case MeterIEC2BBC:
                case MeterIEC2EBU:
-                       ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("meterstrip ppm fg"), r, g, b, a);
+                       Gtkmm2ext::color_to_rgba (UIConfiguration::instance().color ("meterstrip ppm fg"), r, g, b, a);
                        break;
                default:
-                       ArdourCanvas::color_to_rgba (ARDOUR_UI::config()->color ("meterstrip dpm fg"), r, g, b, a);
+                       Gtkmm2ext::color_to_rgba (UIConfiguration::instance().color ("meterstrip dpm fg"), r, g, b, a);
                        break;
        }
        c->set_rgb_p (r, g, b);
@@ -289,8 +307,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
 
        float box_l=0;
        float box_w=0;
-       const double scale = ARDOUR_UI::config()->get_font_scale() / 102400.;
-#define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * scale))
+#define PX_SCALE(pxmin, dflt) rint(std::max((double)pxmin, (double)dflt * UIConfiguration::instance().get_ui_scale()))
        if (tickleft) {
                if (w.get_name().substr(0, 3) == "Bar") {
                        box_w = PX_SCALE(2, 2);
@@ -329,7 +346,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
        cairo_fill (cr);
 
        height = min(max_pattern_metric_size, height);
-       uint32_t peakcolor = ARDOUR_UI::config()->color ("meterbridge peaklabel");
+       uint32_t peakcolor = UIConfiguration::instance().color ("meterbridge peaklabel");
 
        for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
 
@@ -492,11 +509,19 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
                                        break;
 
                                default:
+                                       points.insert (std::pair<float,float>(  0, 1.0));
+                                       points.insert (std::pair<float,float>(  1, 0.5));
+                                       points.insert (std::pair<float,float>(  2, 0.5));
+                                       points.insert (std::pair<float,float>(  3, 1.0));
+                                       points.insert (std::pair<float,float>(  4, 0.5));
+                                       points.insert (std::pair<float,float>(  5, 0.5));
+                                       /* fall through */
+                               case MeterPeak0dB:
                                        points.insert (std::pair<float,float>(-60, 0.5));
                                        points.insert (std::pair<float,float>(-50, 1.0));
                                        points.insert (std::pair<float,float>(-40, 1.0));
                                        points.insert (std::pair<float,float>(-30, 1.0));
-                                       if (ARDOUR_UI::config()->get_meter_line_up_level() == MeteringLineUp24) {
+                                       if (UIConfiguration::instance().get_meter_line_up_level() == MeteringLineUp24) {
                                                points.insert (std::pair<float,float>(-24, 1.0));
                                        } else {
                                                points.insert (std::pair<float,float>(-25, 1.0));
@@ -524,13 +549,6 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
                                        points.insert (std::pair<float,float>( -3, 1.0));
                                        points.insert (std::pair<float,float>( -2, 0.5));
                                        points.insert (std::pair<float,float>( -1, 0.5));
-
-                                       points.insert (std::pair<float,float>(  0, 1.0));
-                                       points.insert (std::pair<float,float>(  1, 0.5));
-                                       points.insert (std::pair<float,float>(  2, 0.5));
-                                       points.insert (std::pair<float,float>(  3, 1.0));
-                                       points.insert (std::pair<float,float>(  4, 0.5));
-                                       points.insert (std::pair<float,float>(  5, 0.5));
                                        break;
                        }
                        break;
@@ -604,8 +622,14 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                tickright = true;
        }
 
+#ifdef NO_OVERSAMPLE
        cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
        cairo_t* cr = cairo_create (surface);
+#else
+       cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width*2, height*2);
+       cairo_t* cr = cairo_create (surface);
+       cairo_scale(cr, 2.0, 2.0);
+#endif
        Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create(w.get_pango_context());
 
        Pango::AttrList audio_font_attributes;
@@ -615,12 +639,12 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
        Pango::AttrFontDesc* font_attr;
        Pango::FontDescription font;
 
-       font = Pango::FontDescription (ARDOUR_UI::config()->get_SmallMonospaceFont());
+       font = Pango::FontDescription (UIConfiguration::instance().get_SmallMonospaceFont());
 #ifdef __APPLE__
-       const double fixfontsize = 1.125;
+       const double fixfontsize = 1.0;
 #else
        // counter-act global font-scaling.
-       const double fixfontsize = std::min(1.0, 0.9 / sqrt((double) ARDOUR_UI::config()->get_font_scale() / 102400.));
+       const double fixfontsize = std::min(1.0, 0.9 / sqrtf(UIConfiguration::instance().get_ui_scale()));
 #endif
 
        font.set_weight (Pango::WEIGHT_NORMAL);
@@ -656,7 +680,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
        cairo_set_line_width (cr, 1.0);
 
        height = min(max_pattern_metric_size, height);
-       uint32_t peakcolor = ARDOUR_UI::config()->color ("meterbridge peaklabel");
+       uint32_t peakcolor = UIConfiguration::instance().color ("meterbridge peaklabel");
        Gdk::Color c; // default text color
 
        for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
@@ -679,6 +703,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                switch (*i) {
                case DataType::AUDIO:
                        layout->set_attributes (audio_font_attributes);
+                       if (type == MeterPeak0dB) {
+                               overlay_midi = 4;
+                       }
                        switch (type) {
                                case MeterK12:
                                        overlay_midi = 0;
@@ -723,15 +750,20 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                        points.insert (std::pair<float,string>( -5.0f, "+15"));
                                        points.insert (std::pair<float,string>(  0.0f, "+20"));
                                        break;
-                               default:
                                case MeterPeak:
+                                       /* fall through */
                                case MeterKrms:
+                                       /* fall through */
+                               default:
+                                       points.insert (std::pair<float,string>(  3.0f, "+3"));
+                                       /* fall through */
+                               case MeterPeak0dB:
                                        points.insert (std::pair<float,string>(-50.0f, "-50"));
                                        points.insert (std::pair<float,string>(-40.0f, "-40"));
                                        points.insert (std::pair<float,string>(-30.0f, "-30"));
                                        points.insert (std::pair<float,string>(-20.0f, "-20"));
                                        if (types.size() == 1) {
-                                               if (ARDOUR_UI::config()->get_meter_line_up_level() == MeteringLineUp24) {
+                                               if (UIConfiguration::instance().get_meter_line_up_level() == MeteringLineUp24) {
                                                        points.insert (std::pair<float,string>(-24.0f, "-24"));
                                                } else {
                                                        points.insert (std::pair<float,string>(-25.0f, "-25"));
@@ -743,7 +775,6 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                        points.insert (std::pair<float,string>( -5.0f, "-5"));
                                        points.insert (std::pair<float,string>( -3.0f, "-3"));
                                        points.insert (std::pair<float,string>(  0.0f, "+0"));
-                                       points.insert (std::pair<float,string>(  3.0f, "+3"));
                                        break;
 
                                case MeterIEC2EBU:
@@ -833,6 +864,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                points.insert (std::pair<float,string>( 96,  "96"));
                                points.insert (std::pair<float,string>(100, "100"));
                                points.insert (std::pair<float,string>(112, "112"));
+                               points.insert (std::pair<float,string>(127, "127"));
                        } else {
                                switch (overlay_midi) {
                                        case 1:
@@ -860,6 +892,14 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                                points.insert (std::pair<float,string>( 72, "72"));
                                                points.insert (std::pair<float,string>(112, "112"));
                                                points.insert (std::pair<float,string>(127, "127"));
+                                               break;
+                                       case 4:
+                                               /* labels that don't overlay with 0dBFS*/
+                                               points.insert (std::pair<float,string>(  0, "0"));
+                                               points.insert (std::pair<float,string>( 16, "16"));
+                                               points.insert (std::pair<float,string>( 48, "48"));
+                                               points.insert (std::pair<float,string>( 84, "84"));
+                                               points.insert (std::pair<float,string>(100, "100"));
                                        default:
                                                break;
                                }
@@ -948,6 +988,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                                break;
                                        default:
                                        case MeterPeak:
+                                       case MeterPeak0dB:
                                        case MeterKrms:
                                                layout->set_text("dBFS");
                                                break;
@@ -973,6 +1014,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                layout->set_text("mid");
                                layout->get_pixel_size(tw, th);
                                break;
+                       default: // DataType::NIL;
+                               layout->set_text("");
+                               tw = th = 0;
+                               assert (0); // not reached
+                               break;
                }
                if (!background) {
                        c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
@@ -1057,12 +1103,19 @@ ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, MeterType type, std::vect
        }
 
        cairo_move_to (cr, 0, 0);
-       cairo_set_source (cr, pattern);
 
        gint width, height;
        win->get_size (width, height);
-
+#ifdef NO_OVERSAMPLE
+       cairo_set_source (cr, pattern);
        cairo_rectangle (cr, 0, 0, width, height);
+#else
+       cairo_scale(cr, 0.5, 0.5);
+       cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST);
+       cairo_set_source (cr, pattern);
+       cairo_rectangle (cr, 0, 0, width * 2., height * 2.);
+#endif
+
        cairo_fill (cr);
 
        cairo_destroy (cr);