using namespace Gtk;
using namespace Gtkmm2ext;
using namespace std;
-
+using namespace ArdourMeter;
static const int max_pattern_metric_size = 1026;
-sigc::signal<void> ResetAllPeakDisplays;
-sigc::signal<void,ARDOUR::Route*> ResetRoutePeakDisplays;
-sigc::signal<void,ARDOUR::RouteGroup*> ResetGroupPeakDisplays;
-sigc::signal<void> RedrawMetrics;
+sigc::signal<void> ArdourMeter::ResetAllPeakDisplays;
+sigc::signal<void,ARDOUR::Route*> ArdourMeter::ResetRoutePeakDisplays;
+sigc::signal<void,ARDOUR::RouteGroup*> ArdourMeter::ResetGroupPeakDisplays;
+sigc::signal<void> ArdourMeter::RedrawMetrics;
+
+sigc::signal<void, int, ARDOUR::RouteGroup*, ARDOUR::MeterType> ArdourMeter::SetMeterTypeMulti;
+
+namespace ArdourMeter {
+ typedef std::map<std::string,cairo_pattern_t*> TickPatterns;
+ typedef std::map<std::string,cairo_pattern_t*> MetricPatterns;
+}
+
+static ArdourMeter::TickPatterns ticks_patterns;
+static ArdourMeter::MetricPatterns metric_patterns;
+
+const std::string
+ArdourMeter::meter_type_string (ARDOUR::MeterType mt)
+{
+ switch (mt) {
+ case MeterPeak:
+ return _("Peak");
+ break;
+ case MeterKrms:
+ return _("RMS + Peak");
+ break;
+ case MeterIEC1:
+ return _("DIN");
+ break;
+ case MeterIEC2:
+ return _("EBU/BBC");
+ break;
+ case MeterVU:
+ return _("VU");
+ break;
+ default:
+ return _("???");
+ break;
+ }
+}
-cairo_pattern_t*
+static cairo_pattern_t*
meter_render_ticks (Gtk::Widget& w, vector<ARDOUR::DataType> types)
{
Glib::RefPtr<Gdk::Window> win (w.get_window());
}
-cairo_pattern_t*
+static cairo_pattern_t*
meter_render_metrics (Gtk::Widget& w, vector<DataType> types)
{
Glib::RefPtr<Gdk::Window> win (w.get_window());
- bool tickleft;
+ bool tickleft, tickright;
bool background;
gint width, height;
win->get_size (width, height);
tickleft = w.get_name().substr(w.get_name().length() - 4) == "Left";
- background = types.size() == 0 || tickleft || w.get_name().substr(w.get_name().length() - 5) == "Right";
+ tickright = w.get_name().substr(w.get_name().length() - 5) == "Right";
+ background = types.size() == 0 || tickleft || tickright;
+
+ if (!tickleft && !tickright) {
+ tickright = true;
+ }
cairo_surface_t* surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height);
cairo_t* cr = cairo_create (surface);
Pango::AttrFontDesc* font_attr;
Pango::FontDescription font;
- font = Pango::FontDescription (""); // use defaults
- //font = get_font_for_style("gain-fader");
- //font = w.get_style()->get_font();
+ font = Pango::FontDescription ("ArdourMono");
+ double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale();
font.set_weight (Pango::WEIGHT_NORMAL);
- font.set_size (9.0 * PANGO_SCALE);
+ font.set_size (9.0 * PANGO_SCALE * fixfontsize);
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 (7.5 * PANGO_SCALE);
+ font.set_size (8.0 * PANGO_SCALE * fixfontsize);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
midi_font_attributes.change (*font_attr);
delete font_attr;
- font.set_size (7.0 * PANGO_SCALE);
+ font.set_size (6.0 * PANGO_SCALE * fixfontsize);
font_attr = new Pango::AttrFontDesc (Pango::Attribute::create_attr_font_desc (font));
unit_font_attributes.change (*font_attr);
delete font_attr;
snprintf (buf, sizeof (buf), "%+2d", j->first);
pos = height - (gint) floor (height * fraction);
if (tickleft) {
- cairo_move_to(cr, width-2.5, pos + .5);
+ cairo_move_to(cr, width-1.5, pos + .5);
cairo_line_to(cr, width, pos + .5);
- } else {
+ cairo_stroke (cr);
+ } else if (tickright) {
cairo_move_to(cr, 0, pos + .5);
- cairo_line_to(cr, 2.5, pos + .5);
+ cairo_line_to(cr, 1.5, pos + .5);
+ cairo_stroke (cr);
}
- cairo_stroke (cr);
break;
case DataType::MIDI:
cairo_set_line_width (cr, 1.0);
pos = min (pos, height);
if (tickleft) {
cairo_arc(cr, width - 2.0, pos + .5, 1.0, 0, 2 * M_PI);
- } else {
+ cairo_fill(cr);
+ } else if (tickright) {
cairo_arc(cr, 3, pos + .5, 1.0, 0, 2 * M_PI);
+ cairo_fill(cr);
}
- cairo_fill(cr);
break;
}
int tw, th;
layout->get_pixel_size(tw, th);
- int p = pos - (th / 2);
+ int p = pos - (th / 2) - 1;
p = min (p, height - th);
p = max (p, 0);
- cairo_move_to (cr, width-4-tw, p);
+ cairo_move_to (cr, width-3-tw, p);
pango_cairo_show_layout (cr, layout->gobj());
}
}
}
Gdk::Color c = w.get_style()->get_fg (Gtk::STATE_ACTIVE);
cairo_set_source_rgb (cr, c.get_red_p(), c.get_green_p(), c.get_blue_p());
- cairo_move_to (cr, 1, height - th - 1.5);
+ cairo_move_to (cr, 2, height - th - 1.5);
pango_cairo_show_layout (cr, layout->gobj());
}
}
-typedef std::map<std::string,cairo_pattern_t*> TickPatterns;
-static TickPatterns ticks_patterns;
-
-gint meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
+gint
+ArdourMeter::meter_expose_ticks (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mta)
{
Glib::RefPtr<Gdk::Window> win (mta->get_window());
cairo_t* cr;
return true;
}
-typedef std::map<std::string,cairo_pattern_t*> MetricPatterns;
-static MetricPatterns metric_patterns;
-
-gint meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
+gint
+ArdourMeter::meter_expose_metrics (GdkEventExpose *ev, std::vector<ARDOUR::DataType> types, Gtk::DrawingArea *mma)
{
Glib::RefPtr<Gdk::Window> win (mma->get_window());
cairo_t* cr;
return true;
}
-void meter_clear_pattern_cache() {
- metric_patterns.clear();
- ticks_patterns.clear();
+void
+ArdourMeter::meter_clear_pattern_cache(int which) {
+ MetricPatterns::iterator i = metric_patterns.begin();
+ TickPatterns::iterator j = ticks_patterns.begin();
+
+ while (i != metric_patterns.end()) {
+ int m = 4;
+ std::string n = i->first;
+ if (n.substr(n.length() - 4) == "Left") { m = 1; }
+ if (n.substr(n.length() - 5) == "Right") { m = 2; }
+ if (which & m) {
+ cairo_pattern_destroy(i->second);
+ metric_patterns.erase(i++);
+ } else {
+ ++i;
+ }
+ }
+
+ while (j != ticks_patterns.end()) {
+ int m = 4;
+ std::string n = j->first;
+ if (n.substr(n.length() - 4) == "Left") { m = 1; }
+ if (n.substr(n.length() - 5) == "Right") { m = 2; }
+ if (which & m) {
+ cairo_pattern_destroy(j->second);
+ ticks_patterns.erase(j++);
+ } else {
+ ++j;
+ }
+ }
RedrawMetrics();
}