diff options
author | Nick Mainsbridge <beatroute@iprimus.com.au> | 2009-05-21 17:30:45 +0000 |
---|---|---|
committer | Nick Mainsbridge <beatroute@iprimus.com.au> | 2009-05-21 17:30:45 +0000 |
commit | 882e3a690a38b447f00bd14bfdfea88e9ad49f93 (patch) | |
tree | 840071f5ecd2bdac73e3dcf2037f65bab0ad8c37 /gtk2_ardour/marker.cc | |
parent | d1ee2a06cab5b4e08e12f352d91721442d8851de (diff) |
A different fix for record crash, use pixfufs instead of canvas text in markers, use leftmost_frame instead of querying canvas coords when scrolling (speeds up canvas scrolling somewhat), remove old include, remove first_action_message and some other unused methods.
git-svn-id: svn://localhost/ardour2/branches/3.0@5108 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/marker.cc')
-rw-r--r-- | gtk2_ardour/marker.cc | 79 |
1 files changed, 54 insertions, 25 deletions
diff --git a/gtk2_ardour/marker.cc b/gtk2_ardour/marker.cc index 9bc475214a..392ba85152 100644 --- a/gtk2_ardour/marker.cc +++ b/gtk2_ardour/marker.cc @@ -27,6 +27,8 @@ #include "ardour_ui.h" #include "simpleline.h" +#include <gtkmm2ext/utils.h> + #include "i18n.h" using namespace std; @@ -38,7 +40,6 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con : editor (ed), _parent(&parent), _type(type) { double label_offset = 0; - bool annotate_left = false; /* Shapes we use: @@ -180,7 +181,6 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con shift = 13; label_offset = 6.0; - annotate_left = true; break; case LoopStart: @@ -203,7 +203,6 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con shift = 13; label_offset = 0.0; - annotate_left = true; break; case PunchIn: @@ -226,7 +225,6 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con shift = 13; label_offset = 0.0; - annotate_left = true; break; } @@ -245,23 +243,27 @@ Marker::Marker (PublicEditor& ed, ArdourCanvas::Group& parent, guint32 rgba, con mark->property_fill_color_rgba() = rgba; mark->property_outline_color_rgba() = rgba; mark->property_width_pixels() = 1; - Pango::FontDescription* font = get_font_for_style (N_("MarkerText")); - //cerr << " font->get_size() = " << font->get_size() << " is_absolute = " << pango_font_description_get_size_is_absolute(font->gobj()) << " to_string = " << font->to_string() << endl; - text = new Text (*group); - text->property_font_desc() = *font; - text->property_text() = annotation.c_str(); - delete font; + /* setup name pixbuf sizes */ + name_font = get_font_for_style (N_("MarkerText")); + + Gtk::Window win; + Gtk::Label foo; + win.add (foo); + + Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout (X_("Hg")); /* ascender + descender */ + int width; + int height; + + layout->set_font_description (*name_font); + Gtkmm2ext::get_ink_pixel_size (layout, width, height); + name_height = height + 6; + + name_pixbuf = new ArdourCanvas::Pixbuf(*group); + name_pixbuf->property_x() = label_offset; + + set_name (annotation.c_str()); - if (annotate_left) { - text->property_x() = -(text->property_text_width()); - } else { - text->property_x() = label_offset; - } - text->property_y() = 0.0; - text->property_anchor() = Gtk::ANCHOR_NW; - text->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerLabel.get(); - editor.ZoomChanged.connect (mem_fun (*this, &Marker::reposition)); mark->set_data ("marker", this); @@ -280,7 +282,7 @@ Marker::~Marker () drop_references (); /* destroying the parent group destroys its contents, namely any polygons etc. that we added */ - delete text; + delete name_pixbuf; delete mark; delete points; @@ -346,12 +348,39 @@ Marker::the_item() const } void -Marker::set_name (const string& name) +Marker::set_name (const string& new_name) { - text->property_text() = name.c_str(); - if (_type == End) { - text->property_x() = -(text->property_text_width()); - } + uint32_t pb_width; + double font_size; + + font_size = name_font->get_size() / Pango::SCALE; + pb_width = new_name.length() * font_size; + + Glib::RefPtr<Gdk::Pixbuf> buf = Gdk::Pixbuf::create(Gdk::COLORSPACE_RGB, true, 8, pb_width, name_height); + + cairo_surface_t* surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, pb_width, name_height); + cairo_t *cr = cairo_create (surface); + cairo_text_extents_t te; + cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0); + cairo_select_font_face (cr, name_font->get_family().c_str(), + CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); + cairo_set_font_size (cr, font_size); + cairo_text_extents (cr, new_name.c_str(), &te); + + cairo_move_to (cr, 0.5, + 0.5 - te.height / 2 - te.y_bearing + name_height / 2); + cairo_show_text (cr, new_name.c_str()); + + unsigned char* src = cairo_image_surface_get_data (surface); + convert_bgra_to_rgba(src, buf->get_pixels(), pb_width, name_height); + + cairo_destroy(cr); + name_pixbuf->property_pixbuf() = buf; + + if (_type == End || _type == LoopEnd || _type == PunchOut) { + name_pixbuf->property_x() = -(te.width); + } + } void |