+ /* The offsets computed in this routine are multiplied,
+ in calc_positioning_done(), by the width of the downstem note.
+ The shift required to clear collisions, however, depends on the extents
+ of the note heads on the sides that interfere. */
+ if (shift_amount < 0.0) // Down-stem shifts right.
+ shift_amount *= (extent_up[RIGHT] - extent_down[LEFT]) / extent_down.length ();
+ else // Up-stem shifts right.
+ shift_amount *= (extent_down[RIGHT] - extent_up[LEFT]) / extent_down.length ();
+
+ /* If any dotted notes ended up on the left,
+ tell the Dot_Columnn to avoid the note heads on the right.
+ */
+ if (shift_amount < -1e-6
+ && Rhythmic_head::dot_count (head_up))
+ {
+ Grob *d = Grob::unsmob (head_up->get_object ("dot"));
+ Grob *parent = d->get_parent (X_AXIS);
+ if (Dot_column::has_interface (parent))
+ Side_position_interface::add_support (parent, head_down);
+ }
+ else if (Rhythmic_head::dot_count (head_down))