X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmeter_patterns.cc;h=ab6b9446d3dd82e10481a4b53d876f21194719d0;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=2fa1d7356577fa6d174cc7f4c5ba6fe64557e1d7;hpb=cf806123ca5faaef483f898daba3f7bd38ec62eb;p=ardour.git diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index 2fa1d73565..ab6b9446d3 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -17,20 +17,23 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#include + #include #include #include #include #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; using namespace PBD; using namespace Gtk; using namespace Gtkmm2ext; @@ -78,7 +81,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"); @@ -96,18 +102,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; } @@ -140,6 +147,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); @@ -225,56 +243,52 @@ static void mtr_red_stripe(cairo_t* cr, float l, float w, int h, float top, floa cairo_fill (cr); } -static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { - float r,g,b; +static void set_bg_color (Gtk::Widget& w, cairo_t* cr, MeterType type) { + double r,g,b,a; switch(type) { case MeterVU: - if (rgba_p_from_style("meterstripVU", &r, &g, &b, "bg")) { - cairo_set_source_rgb (cr, r, g, b); - } else { - cairo_set_source_rgb (cr, 1.0, 1.0, 0.85); - } + ArdourCanvas::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 (UIConfiguration::instance().color ("meterstrip ppm bg"), r, g, b, a); + break; case MeterK12: case MeterK14: case MeterK20: - if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { - cairo_set_source_rgb (cr, r, g, b); - } else { - cairo_set_source_rgb (cr, 0.1, 0.1, 0.1); - } + ArdourCanvas::color_to_rgba (UIConfiguration::instance().color ("meterstrip dpm bg"), r, g, b, a); break; default: { Gdk::Color c = w.get_style()->get_bg (Gtk::STATE_ACTIVE); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); + r = c.get_red_p(); + g = c.get_green_p(); + b = c.get_blue_p(); } break; } + cairo_set_source_rgb (cr, r, g, b); } static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) { - float r,g,b; + double r,g,b,a; switch(type) { case MeterVU: - if (rgba_p_from_style("meterstripVU", &r, &g, &b)) { - c->set_rgb_p(r, g, b); - } else { - c->set_rgb_p(0.0, 0.0, 0.0); - } + ArdourCanvas::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 (UIConfiguration::instance().color ("meterstrip ppm fg"), r, g, b, a); break; default: - if (rgba_p_from_style("meterstripPPM", &r, &g, &b)) { - c->set_rgb_p(r, g, b); - } else { - c->set_rgb_p(1.0, 1.0, 1.0); - } + ArdourCanvas::color_to_rgba (UIConfiguration::instance().color ("meterstrip dpm fg"), r, g, b, a); break; } + c->set_rgb_p (r, g, b); } static cairo_pattern_t* @@ -292,23 +306,27 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ float box_l=0; float box_w=0; +#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_l = width-2; box_w = 2; + box_w = PX_SCALE(2, 2); + box_l = width - box_w; } else if (w.get_name().substr(0, 4) == "Mark") { - box_l = width-2; box_w = 2; + box_w = PX_SCALE(2, 2); + box_l = width - box_w; background = false; } } else if (tickright) { if (w.get_name().substr(0, 3) == "Bar") { - box_l = 0; box_w = 2; + box_l = 0; box_w = PX_SCALE(2, 2); } else if (w.get_name().substr(0, 4) == "Mark") { - box_l = 0; box_w = 2; + box_l = 0; box_w = PX_SCALE(2, 2); background = false; } } else { - box_l = 0; box_w = 3; + box_l = 0; box_w = width; } +#undef PX_SCALE cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cairo_t* cr = cairo_create (surface); @@ -327,7 +345,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_by_name ("meterbridge peaklabel"); + uint32_t peakcolor = UIConfiguration::instance().color ("meterbridge peaklabel"); for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { @@ -490,11 +508,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)); + // no break + 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 (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)); @@ -522,13 +548,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; @@ -560,7 +579,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ pos = height - (gint) floor (height * fraction); pos = max (pos, 1); cairo_move_to(cr, 0, pos + .5); - cairo_line_to(cr, 3, pos + .5); + cairo_line_to(cr, width, pos + .5); cairo_stroke (cr); break; case DataType::MIDI: @@ -568,7 +587,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ pos = 1 + height - (gint) floor (height * fraction); pos = min (pos, height); cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - cairo_arc(cr, 1.5, pos + .5, 1.0, 0, 2 * M_PI); + cairo_arc(cr, width * .5, pos + .5, 1.0, 0, 2 * M_PI); cairo_fill(cr); break; } @@ -602,8 +621,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; @@ -613,23 +638,28 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) Pango::AttrFontDesc* font_attr; Pango::FontDescription font; - font = Pango::FontDescription ("ArdourMono"); - double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale(); + font = Pango::FontDescription (UIConfiguration::instance().get_SmallMonospaceFont()); +#ifdef __APPLE__ + const double fixfontsize = 1.0; +#else + // counter-act global font-scaling. + const double fixfontsize = std::min(1.0, 0.9 / sqrtf(UIConfiguration::instance().get_ui_scale())); +#endif font.set_weight (Pango::WEIGHT_NORMAL); - font.set_size (9.0 * PANGO_SCALE * fixfontsize); + font.set_size (8.0 * fixfontsize * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); audio_font_attributes.change (*font_attr); delete font_attr; font.set_weight (Pango::WEIGHT_ULTRALIGHT); font.set_stretch (Pango::STRETCH_ULTRA_CONDENSED); - font.set_size (8.0 * PANGO_SCALE * fixfontsize); + font.set_size (7.0 * fixfontsize * 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 (6.0 * PANGO_SCALE * fixfontsize); + font.set_size (6.0 * fixfontsize * PANGO_SCALE); font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font)); unit_font_attributes.change (*font_attr); delete font_attr; @@ -649,7 +679,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_by_name ("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) { @@ -672,6 +702,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; @@ -719,12 +752,15 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) default: case MeterPeak: case MeterKrms: + points.insert (std::pair( 3.0f, "+3")); + // no break + 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 (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")); @@ -736,7 +772,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: @@ -826,6 +861,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: @@ -853,6 +889,13 @@ 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")); + 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; } @@ -881,20 +924,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) cairo_stroke (cr); } break; - case DataType::MIDI: align_center = false; // don't bleed into legend fraction = (j->first) / 127.0; pos = 1 + height - (gint) lrintf (height * fraction); pos = min (pos, height); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); - if (tickleft) { - cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI); - cairo_fill(cr); - } else if (tickright) { - cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI); - cairo_fill(cr); - } break; } @@ -950,6 +984,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; default: case MeterPeak: + case MeterPeak0dB: case MeterKrms: layout->set_text("dBFS"); break; @@ -975,6 +1010,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); @@ -1059,12 +1099,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);