+ set_source_rgb (cr, bg_colour);
+
+ double w = 0;
+ if (_matrix->show_only_bundles()) {
+ w = grid_spacing ();
+ } else {
+ w = _matrix->count_of_our_type_min_1 (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);