X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fmeter_patterns.cc;h=2fa1d7356577fa6d174cc7f4c5ba6fe64557e1d7;hb=152935e736eaf06f85bc7f5cb27337a62d95edd4;hp=aad7c96d98bf778c491fde195a235b1f7b669ca4;hpb=385b1121dabc753bbf1fdc57656a6e481732087b;p=ardour.git diff --git a/gtk2_ardour/meter_patterns.cc b/gtk2_ardour/meter_patterns.cc index aad7c96d98..2fa1d73565 100644 --- a/gtk2_ardour/meter_patterns.cc +++ b/gtk2_ardour/meter_patterns.cc @@ -101,6 +101,9 @@ ArdourMeter::meter_type_string (ARDOUR::MeterType mt) case MeterK14: return _("K14"); break; + case MeterK12: + return _("K12"); + break; case MeterVU: return _("VU"); break; @@ -199,10 +202,29 @@ static inline float mtr_col_and_fract( } fraction = meter_deflect_k (val, 14); break; + case MeterK12: + if (val >= -8.0) { + cairo_set_source_rgb (cr, 1.0, 0.0, 0.0); // red + } else if (val >= -12.0) { + cairo_set_source_rgb (cr, 0.8, 0.8, 0.0); // yellow + } else { + cairo_set_source_rgb (cr, 0.0, 1.0, 0.0); // green + } + fraction = meter_deflect_k (val, 12); + break; } return fraction; } +static void mtr_red_stripe(cairo_t* cr, float l, float w, int h, float top, float bot) { + if (w <= 0) return; + int t = h - floorf (h * (top)); + int b = h - floorf (h * (bot)); + cairo_set_source_rgba (cr, .75, 0, 0, 0.75); + cairo_rectangle (cr, l, t + .5, w, b - t); + cairo_fill (cr); +} + static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { float r,g,b; switch(type) { @@ -217,6 +239,7 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { case MeterIEC1NOR: case MeterIEC2BBC: case MeterIEC2EBU: + case MeterK12: case MeterK14: case MeterK20: if (rgba_p_from_style("meterstripPPM", &r, &g, &b, "bg")) { @@ -234,7 +257,7 @@ static void set_bg_color(Gtk::Widget& w, cairo_t* cr, MeterType type) { } } -static void set_fg_color(Gtk::Widget& w, MeterType type, Gdk::Color * c) { +static void set_fg_color(Gtk::Widget&, MeterType type, Gdk::Color * c) { float r,g,b; switch(type) { case MeterVU: @@ -267,13 +290,24 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ tickright = w.get_name().substr(w.get_name().length() - 5) == "Right"; background = types.size() == 0 || tickleft || tickright; - int box_l, box_r; + float box_l=0; + float box_w=0; if (tickleft) { - box_l = 2; box_r = 3; + if (w.get_name().substr(0, 3) == "Bar") { + box_l = width-2; box_w = 2; + } else if (w.get_name().substr(0, 4) == "Mark") { + box_l = width-2; box_w = 2; + background = false; + } } else if (tickright) { - box_l = 0; box_r = 1; + if (w.get_name().substr(0, 3) == "Bar") { + box_l = 0; box_w = 2; + } else if (w.get_name().substr(0, 4) == "Mark") { + box_l = 0; box_w = 2; + background = false; + } } else { - box_l = 0; box_r = 3; + box_l = 0; box_w = 3; } cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); @@ -303,21 +337,31 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ c = w.get_style()->get_fg (Gtk::STATE_ACTIVE); } else if (background) { set_fg_color(w, type, &c); - cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p()); } 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()); // tick-maker position in dBFS, line-thickness std::map points; -#define DFL_H(fract) (height - floor (height * (fract)) + .5) - switch (*i) { case DataType::AUDIO: switch (type) { + case MeterK12: + points.insert (std::pair(-52.0f, 1.0)); + points.insert (std::pair(-42.0f, 1.0)); + points.insert (std::pair(-32.0f, 1.0)); + points.insert (std::pair(-22.0f, 1.0)); + points.insert (std::pair(-18.0f, 1.0)); + points.insert (std::pair(-15.0f, 1.0)); + points.insert (std::pair(-12.0f, 1.0)); + points.insert (std::pair( -9.0f, 1.0)); + points.insert (std::pair( -8.0f, 0.8)); + points.insert (std::pair( -6.0f, 1.0)); + points.insert (std::pair( -3.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); + break; case MeterK14: points.insert (std::pair(-54.0f, 1.0)); points.insert (std::pair(-44.0f, 1.0)); @@ -325,10 +369,11 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ points.insert (std::pair(-24.0f, 1.0)); points.insert (std::pair(-20.0f, 1.0)); points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); - points.insert (std::pair(-11.0f, 1.0)); - points.insert (std::pair( -8.0f, 1.0)); - points.insert (std::pair( -4.0f, 1.0)); + points.insert (std::pair(-14.0f, 1.0)); // 0 + points.insert (std::pair(-11.0f, 1.0)); // +3 + points.insert (std::pair(-10.0f, 0.8)); // +4 + points.insert (std::pair( -8.0f, 1.0)); // +6 + points.insert (std::pair( -4.0f, 1.0)); // +10 points.insert (std::pair( 0.0f, 1.0)); break; case MeterK20: @@ -338,12 +383,13 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ points.insert (std::pair(-30.0f, 1.0)); points.insert (std::pair(-26.0f, 1.0)); points.insert (std::pair(-23.0f, 1.0)); - points.insert (std::pair(-20.0f, 1.0)); + points.insert (std::pair(-20.0f, 1.0)); // 0 points.insert (std::pair(-17.0f, 1.0)); - points.insert (std::pair(-14.0f, 1.0)); + points.insert (std::pair(-16.0f, 0.8)); + points.insert (std::pair(-14.0f, 1.0)); // +6 points.insert (std::pair(-10.0f, 1.0)); points.insert (std::pair( -5.0f, 1.0)); - points.insert (std::pair( 0.0f, 1.0)); + points.insert (std::pair( 0.0f, 1.0)); //+20 break; case MeterIEC2EBU: points.insert (std::pair(-30.0f, 1.0)); @@ -392,11 +438,8 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ points.insert (std::pair(-12.0f, 1.0)); points.insert (std::pair( -9.0f, 1.0)); points.insert (std::pair( -6.0f, 0.5)); - cairo_set_source_rgba (cr, .8, 0, 0, 0.8); - cairo_rectangle (cr, - box_l, DFL_H(meter_deflect_nordic( -6)), - box_r, DFL_H(meter_deflect_nordic(-12))); - cairo_fill (cr); + mtr_red_stripe(cr, box_l, box_w, height, + meter_deflect_nordic(-6.0f), meter_deflect_nordic(-12.0f)); break; case MeterIEC1DIN: points.insert (std::pair( -3.0f, 0.5)); // "200%" @@ -422,11 +465,8 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ points.insert (std::pair(-49.0f, 1.0)); points.insert (std::pair(-54.0f, 0.5)); points.insert (std::pair(-59.0f, 1.0)); - cairo_set_source_rgba (cr, .8, 0, 0, 0.8); - cairo_rectangle (cr, - box_l, DFL_H(meter_deflect_din(0)), - box_r, DFL_H(meter_deflect_din(-9.0))); - cairo_fill (cr); + mtr_red_stripe(cr, box_l, box_w, height, + meter_deflect_din(0.0f), meter_deflect_din(-9.0f)); break; case MeterVU: points.insert (std::pair(-17.0f, 1.0)); //+3 VU @@ -445,12 +485,8 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ points.insert (std::pair(-30.0f, 1.0)); points.insert (std::pair(-35.0f, 0.5)); points.insert (std::pair(-40.0f, 1.0)); - // red-box - cairo_set_source_rgba (cr, .8, 0, 0, 0.8); - cairo_rectangle (cr, - box_l, DFL_H(meter_deflect_vu(-16)), - box_r, DFL_H(meter_deflect_vu(-20))); - cairo_fill (cr); + mtr_red_stripe(cr, box_l, box_w, height, + meter_deflect_vu(-17.0f), meter_deflect_vu(-20.0f)); break; default: @@ -531,6 +567,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector typ fraction = (j->first) / 127.0; 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_fill(cr); break; @@ -636,6 +673,20 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) case DataType::AUDIO: layout->set_attributes (audio_font_attributes); switch (type) { + case MeterK12: + overlay_midi = 0; + points.insert (std::pair(-52.0f, "-40")); + points.insert (std::pair(-42.0f, "-30")); + points.insert (std::pair(-32.0f, "-20")); + points.insert (std::pair(-22.0f, "-10")); + points.insert (std::pair(-18.0f, "-6")); + points.insert (std::pair(-15.0f, "-3")); + points.insert (std::pair(-12.0f, " 0")); + points.insert (std::pair( -9.0f, "+3")); + points.insert (std::pair( -6.0f, "+6")); + points.insert (std::pair( -3.0f, "+9")); + points.insert (std::pair( 0.0f, "+12")); + break; case MeterK14: overlay_midi = 0; points.insert (std::pair(-54.0f, "-40")); @@ -809,7 +860,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; } - gint pos; + gint pos = -1; for (std::map::const_iterator j = points.begin(); j != points.end(); ++j) { float fraction = 0; @@ -834,7 +885,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) case DataType::MIDI: align_center = false; // don't bleed into legend fraction = (j->first) / 127.0; - pos = 1 + height - (gint) rintf (height * fraction); + 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) { @@ -847,6 +898,8 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) break; } + if (pos < 0) continue; + layout->set_text(j->second.c_str()); int tw, th; @@ -892,6 +945,9 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector types) case MeterK14: layout->set_text("K14"); break; + case MeterK12: + layout->set_text("K12"); + break; default: case MeterPeak: case MeterKrms: