+ }
+}
+
+vector<pair<double, double> >
+PortMatrixColumnLabels::port_name_shape (double xoff, double yoff) const
+{
+ vector<pair<double, double> > shape;
+
+ double const lc = _longest_channel_name + name_pad();
+ double const w = grid_spacing();
+
+ if (_matrix->arrangement() == PortMatrix::LEFT_TO_BOTTOM) {
+
+ double x_ = xoff + _height / tan (angle()) + w;
+ double y_ = yoff;
+ shape.push_back (make_pair (x_, y_));
+ x_ -= w;
+ shape.push_back (make_pair (x_, y_));
+ x_ -= lc * cos (angle());
+ y_ += lc * sin (angle());
+ shape.push_back (make_pair (x_, y_));
+ x_ += w * pow (sin (angle()), 2);
+ y_ += w * sin (angle()) * cos (angle());
+ shape.push_back (make_pair (x_, y_));
+
+ } else {
+
+ double x_ = xoff;
+ double y_ = yoff + _height;
+ shape.push_back (make_pair (x_, y_));
+ x_ += w;
+ shape.push_back (make_pair (x_, y_));
+ x_ += lc * cos (angle());
+ y_ -= lc * sin (angle());
+ shape.push_back (make_pair (x_, y_));
+ x_ -= grid_spacing() * pow (sin (angle()), 2);
+ y_ -= grid_spacing() * sin (angle()) * cos (angle());
+ shape.push_back (make_pair (x_, y_));
+ }
+
+ return shape;
+}
+
+void
+PortMatrixColumnLabels::render_bundle_name (
+ cairo_t* cr, Gdk::Color fg_colour, Gdk::Color bg_colour, double xoff, double yoff, boost::shared_ptr<ARDOUR::Bundle> b
+ )
+{
+ set_source_rgb (cr, bg_colour);
+
+ double w = 0;
+ if (_matrix->show_only_bundles()) {
+ w = grid_spacing ();
+ } else {
+ w = b->nchannels() * grid_spacing();
+ }
+
+ double x_ = xoff;
+
+ uint32_t y = yoff;
+ y += _height;
+
+ double y_ = y;
+ cairo_move_to (cr, x_, y_);
+ x_ += w;
+ cairo_line_to (cr, x_, y_);
+ x_ += _height / tan (angle ());
+ y_ -= _height;
+ cairo_line_to (cr, x_, y_);
+ x_ -= w;
+ cairo_line_to (cr, x_, y_);
+ cairo_line_to (cr, xoff, y);
+ cairo_fill_preserve (cr);
+ set_source_rgb (cr, fg_colour);
+ cairo_set_line_width (cr, label_border_width());
+ cairo_stroke (cr);
+
+ set_source_rgb (cr, text_colour());
+
+ double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height;
+
+ if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) {
+
+ double rl = 0;
+ if (_matrix->show_only_bundles()) {
+ rl = name_pad();
+ } else {
+ rl = 3 * name_pad() + _longest_channel_name;
+ }
+ cairo_move_to (
+ cr,
+ xoff + grid_spacing() - q * sin (angle ()) + rl * cos (angle()),
+ yoff + _height - q * cos (angle ()) - rl * sin (angle())
+ );
+
+ } else {
+
+ cairo_move_to (
+ cr,
+ xoff + grid_spacing() - q * sin (angle ()),
+ yoff + _height - q * cos (angle ())
+ );
+ }
+
+ cairo_save (cr);
+ cairo_rotate (cr, -angle());
+ cairo_show_text (cr, b->name().c_str());
+ cairo_restore (cr);
+}
+
+void
+PortMatrixColumnLabels::render_channel_name (
+ cairo_t* cr, Gdk::Color fg_colour, Gdk::Color bg_colour, double xoff, double yoff, ARDOUR::BundleChannel const &bc
+ )
+{
+ vector<pair<double, double> > const shape = port_name_shape (xoff, yoff);
+
+ cairo_move_to (cr, shape[0].first, shape[0].second);
+ for (uint32_t i = 1; i < 4; ++i) {
+ cairo_line_to (cr, shape[i].first, shape[i].second);
+ }
+ cairo_line_to (cr, shape[0].first, shape[0].second);
+
+ set_source_rgb (cr, bg_colour);
+ cairo_fill_preserve (cr);
+ set_source_rgb (cr, fg_colour);
+ cairo_set_line_width (cr, label_border_width());
+ cairo_stroke (cr);
+
+ set_source_rgb (cr, text_colour());
+
+ double const q = ((grid_spacing() * sin (angle())) - _text_height) / 2 + _descender_height;
+
+ if (_matrix->arrangement() == PortMatrix::TOP_TO_RIGHT) {
+
+ cairo_move_to (
+ cr,
+ xoff + grid_spacing() - q * sin (angle ()),
+ yoff + _height - q * cos (angle ())
+ );
+
+
+ } else {
+
+ double const rl = 3 * name_pad() + _longest_bundle_name;
+ cairo_move_to (
+ cr,
+ xoff + grid_spacing() - q * sin (angle ()) + rl * cos (angle ()),
+ yoff + _height - q * cos (angle ()) - rl * sin (angle())
+ );
+ }
+
+ if (bc.bundle->nchannels() > 1) {
+
+ /* only plot the name if the bundle has more than one channel;
+ the name of a single channel is assumed to be redundant */
+