From 5b578911083910b5d3c20b939884a2c5972f3d89 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 17 Jun 2008 20:56:58 +0000 Subject: some cleanups after the last commit/changes git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@3469 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/gain_meter.cc | 156 +++++++++++++++++++++++----------------------- gtk2_ardour/gain_meter.h | 9 ++- 2 files changed, 81 insertions(+), 84 deletions(-) diff --git a/gtk2_ardour/gain_meter.cc b/gtk2_ardour/gain_meter.cc index 4b598a06f4..7dde6e4acf 100644 --- a/gtk2_ardour/gain_meter.cc +++ b/gtk2_ardour/gain_meter.cc @@ -55,8 +55,8 @@ using namespace std; sigc::signal GainMeterBase::ResetAllPeakDisplays; sigc::signal GainMeterBase::ResetGroupPeakDisplays; -map > GainMeterBase::metric_pixmaps; +map > GainMeter::metric_pixmaps; Glib::RefPtr GainMeter::slider; @@ -725,84 +725,6 @@ GainMeterBase::set_width (Width w, int len) level_meter->setup_meters (len); } -Glib::RefPtr -GainMeterBase::render_metrics (Gtk::Widget& w) -{ - //cerr << "name: " << w.get_name();//DEBUG - //cerr << " bg_red = " << w.get_style()->get_bg(Gtk::STATE_NORMAL).get_red();//DEBUG - //cerr << " fg_red = " << w.get_style()->get_fg(Gtk::STATE_NORMAL).get_red();//DEBUG - Glib::RefPtr win (w.get_window()); - Glib::RefPtr fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); - Glib::RefPtr bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL)); - gint width, height; - int db_points[] = { -50, -40, -20, -30, -10, -3, 0, 4 }; - char buf[32]; - - win->get_size (width, height); - - Glib::RefPtr 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 layout = w.create_pango_layout(""); - - for (uint32_t i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) { - - float fraction = log_meter (db_points[i]); - gint pos = height - (gint) floor (height * fraction); - - snprintf (buf, sizeof (buf), "%d", abs (db_points[i])); - - layout->set_text (buf); - - /* we want logical extents, not ink extents here */ - - int width, height; - layout->get_pixel_size (width, height); - - pixmap->draw_line (fg_gc, 0, pos, 4, pos); - pixmap->draw_layout (fg_gc, 6, pos - (height/2), layout); - } - - return pixmap; -} - -gint -GainMeterBase::meter_metrics_expose (GdkEventExpose *ev) -{ - static Glib::RefPtr meter_style; - if (style_changed) { - meter_style = meter_metric_area.get_style(); - } - Glib::RefPtr win (meter_metric_area.get_window()); - Glib::RefPtr bg_gc (meter_style->get_bg_gc (Gtk::STATE_INSENSITIVE)); - GdkRectangle base_rect; - GdkRectangle draw_rect; - gint width, height; - - win->get_size (width, height); - - base_rect.width = width; - base_rect.height = height; - base_rect.x = 0; - base_rect.y = 0; - - Glib::RefPtr pixmap; - std::map >::iterator i = metric_pixmaps.find (meter_metric_area.get_name()); - - if (i == metric_pixmaps.end() || style_changed || dpi_changed) { - pixmap = render_metrics (meter_metric_area); - } else { - pixmap = i->second; - } - - gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect); - win->draw_drawable (bg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height); - style_changed = false; - return true; -} void GainMeterBase::on_theme_changed() @@ -877,3 +799,79 @@ GainMeter::get_gm_width () return sz.width; } +Glib::RefPtr +GainMeter::render_metrics (Gtk::Widget& w) +{ + Glib::RefPtr win (w.get_window()); + Glib::RefPtr fg_gc (w.get_style()->get_fg_gc (Gtk::STATE_NORMAL)); + Glib::RefPtr bg_gc (w.get_style()->get_bg_gc (Gtk::STATE_NORMAL)); + gint width, height; + int db_points[] = { -50, -40, -20, -30, -10, -3, 0, 4 }; + char buf[32]; + + win->get_size (width, height); + + Glib::RefPtr 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 layout = w.create_pango_layout(""); + + for (uint32_t i = 0; i < sizeof (db_points)/sizeof (db_points[0]); ++i) { + + float fraction = log_meter (db_points[i]); + gint pos = height - (gint) floor (height * fraction); + + snprintf (buf, sizeof (buf), "%d", abs (db_points[i])); + + layout->set_text (buf); + + /* we want logical extents, not ink extents here */ + + int width, height; + layout->get_pixel_size (width, height); + + pixmap->draw_line (fg_gc, 0, pos, 4, pos); + pixmap->draw_layout (fg_gc, 6, pos - (height/2), layout); + } + + return pixmap; +} + +gint +GainMeter::meter_metrics_expose (GdkEventExpose *ev) +{ + static Glib::RefPtr meter_style; + if (style_changed) { + meter_style = meter_metric_area.get_style(); + } + Glib::RefPtr win (meter_metric_area.get_window()); + Glib::RefPtr bg_gc (meter_style->get_bg_gc (Gtk::STATE_INSENSITIVE)); + GdkRectangle base_rect; + GdkRectangle draw_rect; + gint width, height; + + win->get_size (width, height); + + base_rect.width = width; + base_rect.height = height; + base_rect.x = 0; + base_rect.y = 0; + + Glib::RefPtr pixmap; + std::map >::iterator i = metric_pixmaps.find (meter_metric_area.get_name()); + + if (i == metric_pixmaps.end() || style_changed || dpi_changed) { + pixmap = render_metrics (meter_metric_area); + } else { + pixmap = i->second; + } + + gdk_rectangle_intersect (&ev->area, &base_rect, &draw_rect); + win->draw_drawable (bg_gc, pixmap, draw_rect.x, draw_rect.y, draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height); + style_changed = false; + return true; +} + diff --git a/gtk2_ardour/gain_meter.h b/gtk2_ardour/gain_meter.h index dc75b55996..549bd091d0 100644 --- a/gtk2_ardour/gain_meter.h +++ b/gtk2_ardour/gain_meter.h @@ -116,11 +116,6 @@ class GainMeterBase Width _width; - static std::map > metric_pixmaps; - static Glib::RefPtr render_metrics (Gtk::Widget&); - - gint meter_metrics_expose (GdkEventExpose *); - void show_gain (); void gain_activated (); bool gain_focused (GdkEventFocus*); @@ -182,6 +177,10 @@ class GainMeter : public GainMeterBase, public Gtk::VBox protected: void hide_all_meters (); + gint meter_metrics_expose (GdkEventExpose *); + + static std::map > metric_pixmaps; + static Glib::RefPtr render_metrics (Gtk::Widget&); private: Gtk::HBox gain_display_box; -- cgit v1.2.3