X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmeter_patterns.cc;h=f58f35212bf88d98358f3d061e7a15afc6a76b60;hb=5981b7f1b8bc85444d66ab0ffac2dee412dd21ea;hp=b70a75a3a20f55d3b9f848a63bd842aadfcc64bf;hpb=91fac4c96dc6210dcc056da70dc608700d7eb570;p=ardour.git diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index b70a75a3a2..f58f35212b 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -17,18 +17,21 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + #include #include #include #include +#include "ardour/logmeter.h" #include -#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 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 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::const_iterator i = types.begin(); i != types.end(); ++i) { @@ -492,11 +509,19 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ break; default: + points.insert (std::pair( 0, 1.0)); + points.insert (std::pair( 1, 0.5)); + points.insert (std::pair( 2, 0.5)); + points.insert (std::pair( 3, 1.0)); + points.insert (std::pair( 4, 0.5)); + points.insert (std::pair( 5, 0.5)); + /* fall through */ + case MeterPeak0dB: points.insert (std::pair(-60, 0.5)); points.insert (std::pair(-50, 1.0)); points.insert (std::pair(-40, 1.0)); points.insert (std::pair(-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(-24, 1.0)); } else { points.insert (std::pair(-25, 1.0)); @@ -524,13 +549,6 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ points.insert (std::pair( -3, 1.0)); points.insert (std::pair( -2, 0.5)); points.insert (std::pair( -1, 0.5)); - - points.insert (std::pair( 0, 1.0)); - points.insert (std::pair( 1, 0.5)); - points.insert (std::pair( 2, 0.5)); - points.insert (std::pair( 3, 1.0)); - points.insert (std::pair( 4, 0.5)); - points.insert (std::pair( 5, 0.5)); break; } break; @@ -604,8 +622,14 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector 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 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 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 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::const_iterator i = types.begin(); i != types.end(); ++i) { @@ -679,6 +703,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector 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 types) points.insert (std::pair( -5.0f, "+15")); points.insert (std::pair( 0.0f, "+20")); break; - default: case MeterPeak: + /* fall through */ case MeterKrms: + /* fall through */ + default: + points.insert (std::pair( 3.0f, "+3")); + /* fall through */ + case MeterPeak0dB: points.insert (std::pair(-50.0f, "-50")); points.insert (std::pair(-40.0f, "-40")); points.insert (std::pair(-30.0f, "-30")); points.insert (std::pair(-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(-24.0f, "-24")); } else { points.insert (std::pair(-25.0f, "-25")); @@ -743,7 +775,6 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) points.insert (std::pair( -5.0f, "-5")); points.insert (std::pair( -3.0f, "-3")); points.insert (std::pair( 0.0f, "+0")); - points.insert (std::pair( 3.0f, "+3")); break; case MeterIEC2EBU: @@ -833,6 +864,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) points.insert (std::pair( 96, "96")); points.insert (std::pair(100, "100")); points.insert (std::pair(112, "112")); + points.insert (std::pair(127, "127")); } else { switch (overlay_midi) { case 1: @@ -860,6 +892,14 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) points.insert (std::pair( 72, "72")); points.insert (std::pair(112, "112")); points.insert (std::pair(127, "127")); + break; + case 4: + /* labels that don't overlay with 0dBFS*/ + points.insert (std::pair( 0, "0")); + points.insert (std::pair( 16, "16")); + points.insert (std::pair( 48, "48")); + points.insert (std::pair( 84, "84")); + points.insert (std::pair(100, "100")); default: break; } @@ -948,6 +988,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector 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 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);