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) {
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 (tickright) {
- box_l = 0; box_r = 1;
+ if (w.get_name().substr(0, 3) == "Bar") {
+ box_l = 0; box_w = 2;
+ }
} 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);
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<float,float> points;
-#define DFL_H(fract) (height - floor (height * (fract)) + .5)
-
switch (*i) {
case DataType::AUDIO:
points.insert (std::pair<float,float>(-12.0f, 1.0));
points.insert (std::pair<float,float>( -9.0f, 1.0));
points.insert (std::pair<float,float>( -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<float,float>( -3.0f, 0.5)); // "200%"
points.insert (std::pair<float,float>(-49.0f, 1.0));
points.insert (std::pair<float,float>(-54.0f, 0.5));
points.insert (std::pair<float,float>(-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<float,float>(-17.0f, 1.0)); //+3 VU
points.insert (std::pair<float,float>(-30.0f, 1.0));
points.insert (std::pair<float,float>(-35.0f, 0.5));
points.insert (std::pair<float,float>(-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:
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;
{
level_meter = 0;
_strip_type = 0;
+ _tick_bar = 0;
mtr_vbox.set_spacing(2);
nfo_vbox.set_spacing(2);
peakbx.set_size_request(-1, 14);
SessionHandlePtr::set_session (sess);
_has_midi = false;
+ _tick_bar = 0;
int meter_width = 6;
if (_route->shared_peak_meter()->input_streams().n_total() == 1) {
if (boost::dynamic_pointer_cast<AudioTrack>(_route) == 0
&& boost::dynamic_pointer_cast<MidiTrack>(_route) == 0
) {
- meter_ticks1_area.set_name ("AudioBusMetricsLeft");
- meter_ticks2_area.set_name ("AudioBusMetricsRight");
+ meter_ticks1_area.set_name ("MyAudioBusMetricsLeft");
+ meter_ticks2_area.set_name ("MyAudioBusMetricsRight");
_has_midi = false;
}
else if (type == (1 << DataType::AUDIO)) {
- meter_ticks1_area.set_name ("AudioTrackMetricsLeft");
- meter_ticks2_area.set_name ("AudioTrackMetricsRight");
+ meter_ticks1_area.set_name ("MyAudioTrackMetricsLeft");
+ meter_ticks2_area.set_name ("MyAudioTrackMetricsRight");
_has_midi = false;
}
else if (type == (1 << DataType::MIDI)) {
meter_ticks2_area.set_name ("AudioMidiTrackMetricsRight");
_has_midi = true;
}
+ set_tick_bar(_tick_bar);
on_theme_changed();
if (old_has_midi != _has_midi) MetricChanged();
else ConfigurationChanged();
}
+void
+MeterStrip::set_tick_bar (int m)
+{
+ std::string n;
+ _tick_bar = m;
+ if (_tick_bar & 1) {
+ n = meter_ticks1_area.get_name();
+ if (n.substr(0,3) != "Bar") {
+ meter_ticks1_area.set_name("Bar" + n);
+ }
+ } else {
+ n = meter_ticks1_area.get_name();
+ if (n.substr(0,3) == "Bar") {
+ meter_ticks1_area.set_name(n.substr(3,-1));
+ }
+ }
+ if (_tick_bar & 2) {
+ n = meter_ticks2_area.get_name();
+ if (n.substr(0,3) != "Bar") {
+ meter_ticks2_area.set_name("Bar" + n);
+ }
+ } else {
+ n = meter_ticks2_area.get_name();
+ if (n.substr(0,3) == "Bar") {
+ meter_ticks2_area.set_name(n.substr(3,-1));
+ }
+ }
+}
+
void
MeterStrip::on_size_request (Gtk::Requisition* r)
{
int pos = 0;
int vis = 0;
+ MeterStrip * last = 0;
unsigned int metrics = 0;
MeterType lmt = MeterPeak;
vis++;
}
+ (*i).s->set_tick_bar(0);
+
MeterType nmt = (*i).s->meter_type();
if (nmt == MeterKrms) nmt = MeterPeak; // identical metrics
+ if (pos == 0) {
+ (*i).s->set_tick_bar(1);
+ }
if ((*i).visible && nmt != lmt && pos == 0) {
lmt = nmt;
metrics_left.set_metric_mode(1, lmt);
} else if ((*i).visible && nmt != lmt) {
+ if (last) {
+ last->set_tick_bar(last->get_tick_bar() | 2);
+ }
+ (*i).s->set_tick_bar((*i).s->get_tick_bar() | 1);
+
if (_metrics.size() <= metrics) {
_metrics.push_back(new MeterStrip(have_midi ? 2 : 3, lmt));
meterarea.pack_start (*_metrics[metrics], false, false);
}
meterarea.reorder_child(*((*i).s), pos++);
+ if ((*i).visible) {
+ last = (*i).s;
+ }
+ }
+
+ if (last) {
+ last->set_tick_bar(last->get_tick_bar() | 2);
}
metrics_right.set_metric_mode(have_midi ? 2 : 3, lmt);