towards scaleable meter and mixer UI
[ardour.git] / gtk2_ardour / meter_patterns.cc
index 16036ad83e04c8965bbcd645aa132635870f3ae4..38048e999eb30e5754648354a106bfd4b69e952d 100644 (file)
@@ -226,56 +226,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 (ARDOUR_UI::config()->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);
+                       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 (ARDOUR_UI::config()->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 (ARDOUR_UI::config()->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);
                        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 (ARDOUR_UI::config()->color ("meterstrip dpm fg"), r, g, b, a);
                        break;
        }
+       c->set_rgb_p (r, g, b);
 }
 
 static cairo_pattern_t*
@@ -293,23 +289,28 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> 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))
        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);
@@ -328,7 +329,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> 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 = ARDOUR_UI::config()->color ("meterbridge peaklabel");
 
        for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
 
@@ -495,7 +496,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> typ
                                        points.insert (std::pair<float,float>(-50, 1.0));
                                        points.insert (std::pair<float,float>(-40, 1.0));
                                        points.insert (std::pair<float,float>(-30, 1.0));
-                                       if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+                                       if (ARDOUR_UI::config()->get_meter_line_up_level() == MeteringLineUp24) {
                                                points.insert (std::pair<float,float>(-24, 1.0));
                                        } else {
                                                points.insert (std::pair<float,float>(-25, 1.0));
@@ -561,7 +562,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> 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:
@@ -569,7 +570,7 @@ meter_render_ticks (Gtk::Widget& w, MeterType type, vector<ARDOUR::DataType> 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;
                        }
@@ -615,22 +616,27 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
        Pango::FontDescription font;
 
        font = Pango::FontDescription (ARDOUR_UI::config()->get_SmallMonospaceFont());
-       double fixfontsize = 81920.0 / (double) ARDOUR::Config->get_font_scale();
+#ifdef __APPLE__
+       const double fixfontsize = 1.125;
+#else
+       // counter-act global font-scaling.
+       const double fixfontsize = std::min(1.0, 1.0 / sqrt((double) ARDOUR_UI::config()->get_font_scale() / 102400.));
+#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;
@@ -650,7 +656,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> 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 = ARDOUR_UI::config()->color ("meterbridge peaklabel");
        Gdk::Color c; // default text color
 
        for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
@@ -725,7 +731,7 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> types)
                                        points.insert (std::pair<float,string>(-30.0f, "-30"));
                                        points.insert (std::pair<float,string>(-20.0f, "-20"));
                                        if (types.size() == 1) {
-                                               if (Config->get_meter_line_up_level() == MeteringLineUp24) {
+                                               if (ARDOUR_UI::config()->get_meter_line_up_level() == MeteringLineUp24) {
                                                        points.insert (std::pair<float,string>(-24.0f, "-24"));
                                                } else {
                                                        points.insert (std::pair<float,string>(-25.0f, "-25"));
@@ -882,20 +888,11 @@ meter_render_metrics (Gtk::Widget& w, MeterType type, vector<DataType> 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;
                        }