+
+ commonx = common_refpoint_of_array (cols, commonx, X_AXIS);
+ Grob *commony = common_refpoint_of_array (cols, me, Y_AXIS);
+ vector<Offset> bottom_points;
+ vector<Offset> top_points;
+
+ Real left_coord = left_bound->relative_coordinate (commonx, X_AXIS);
+
+ /*
+ TODO: should we move the cluster a little to the right to be in
+ line with the center of the note heads?
+
+ */
+ for (vsize i = 0; i < cols.size (); i++)
+ {
+ Grob *col = cols[i];
+
+ Interval yext = col->extent (commony, Y_AXIS);
+
+ Real x = col->relative_coordinate (commonx, X_AXIS) - left_coord;
+ bottom_points.push_back (Offset (x, yext[DOWN]));
+ top_points.push_back (Offset (x, yext[UP]));
+ }
+
+ /*
+ Across a line break we anticipate on the next pitches.
+ */
+ if (spanner->original ())
+ {
+ Spanner *orig = dynamic_cast<Spanner *> (spanner->original ());
+
+ if (spanner->get_break_index () < orig->broken_intos_.size () - 1)
+ {
+ Spanner *next = orig->broken_intos_[spanner->get_break_index () + 1];
+ vector<Grob*> const &next_cols = extract_grob_array (next, "columns");
+ if (next_cols.size () > 0)
+ {
+ Grob *next_commony = common_refpoint_of_array (next_cols, next, Y_AXIS);
+ Grob *col = next_cols[0];
+
+ Interval v = col->extent (next_commony, Y_AXIS);
+ Real x = right_bound->relative_coordinate (commonx, X_AXIS) - left_coord;
+
+ bottom_points.insert (bottom_points.begin (),
+ Offset (x, v[DOWN]));
+ top_points.insert (top_points.begin (), Offset (x, v[UP]));
+ }
+ }
+ }
+
+ reverse (bottom_points);
+ reverse (top_points);
+
+ Stencil out = brew_cluster_piece (me, bottom_points, top_points);
+ out.translate_axis (- me->relative_coordinate (commony, Y_AXIS), Y_AXIS);