- Glib::RefPtr<Gdk::Window> win (w.get_window());
- Glib::RefPtr<Gdk::GC> bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL));
-
- gint width, height;
- win->get_size (width, height);
-
- Glib::RefPtr<Gdk::Pixmap> pixmap = Gdk::Pixmap::create (win, width, height);
-
- metric_pixmaps[w.get_name()] = pixmap;
-
- pixmap->draw_rectangle (bg_gc, true, 0, 0, width, height);
-
- Glib::RefPtr<Pango::Layout> layout = w.create_pango_layout ("");
-
- for (vector<DataType>::const_iterator i = types.begin(); i != types.end(); ++i) {
-
- Glib::RefPtr<Gdk::GC> fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL));
-
- if (types.size() > 1) {
- /* we're overlaying more than 1 set of marks, so use different colours */
- Gdk::Color c;
- switch (*i) {
- case DataType::AUDIO:
- c.set_rgb_p (1, 1, 1);
- break;
- case DataType::MIDI:
- c.set_rgb_p (0.2, 0.2, 0.5);
- break;
- }
-
- fg_gc->set_rgb_fg_color (c);
- }
-
- vector<int> points;
-
- switch (*i) {
- case DataType::AUDIO:
- points.push_back (-50);
- points.push_back (-40);
- points.push_back (-30);
- points.push_back (-20);
- points.push_back (-10);
- points.push_back (-3);
- points.push_back (0);
- points.push_back (4);
- break;
-
- case DataType::MIDI:
- points.push_back (0);
- if (types.size() == 1) {
- points.push_back (32);
- } else {
- /* tweak so as not to overlay the -30dB mark */
- points.push_back (48);
- }
- points.push_back (64);
- points.push_back (96);
- points.push_back (127);
- break;
- }
-
- char buf[32];
-
- for (vector<int>::const_iterator j = points.begin(); j != points.end(); ++j) {
-
- float fraction = 0;
- switch (*i) {
- case DataType::AUDIO:
- fraction = log_meter (*j);
- break;
- case DataType::MIDI:
- fraction = *j / 127.0;
- break;
- }
-
- gint const pos = height - (gint) floor (height * fraction);
-
- snprintf (buf, sizeof (buf), "%d", abs (*j));
-
- layout->set_text (buf);
-
- /* we want logical extents, not ink extents here */
-
- int tw, th;
- layout->get_pixel_size (tw, th);
-
- pixmap->draw_line (fg_gc, 0, pos, 4, pos);
-
- int p = pos - (th / 2);
- p = min (p, height - th);
- p = max (p, 0);
-
- pixmap->draw_layout (fg_gc, 6, p, layout);
- }
- }
-
- return pixmap;