&& me->get_bound (event_dir)->break_status_dir ())
{
current.horizontal_[event_dir]
- = (me->get_bound (event_dir)->extent (commonx, X_AXIS)[RIGHT]
+ = (robust_relative_extent (me->get_bound (event_dir), commonx, X_AXIS)[RIGHT]
+ event_dir * break_overshoot[event_dir]);
}
else
{
current.horizontal_[event_dir] += event_dir * segs[j].width_/2;
if (segs[j].gapped_)
- current.horizontal_[event_dir] -= event_dir * gap_length;
+ {
+ current.horizontal_[event_dir] -= event_dir * gap_length;
+
+ if (Stem::is_invisible (segs[j].stem_))
+ {
+ /*
+ Need to do this in case of whole notes. We don't want the
+ heads to collide with the beams.
+ */
+ extract_grob_set (segs[j].stem_, "note-heads", heads);
+
+ for (vsize k = 0; k < heads.size (); k ++)
+ current.horizontal_[event_dir]
+ = event_dir * min (event_dir * current.horizontal_[event_dir],
+ - gap_length/2
+ + event_dir * heads[k]->extent (commonx, X_AXIS)[-event_dir]);
+ }
+ }
}
if (event_dir == RIGHT)
sets stem directions, a constant shift does not have an
influence.
*/
- head_extents += stem->relative_coordinate (common, Y_AXIS);
+ head_extents += stem->pure_relative_y_coordinate (common, 0, INT_MAX);
if (to_dir (stem->get_property_data ("direction")))
{
Real dx = lvs->relative_coordinate (commonx, X_AXIS) - x0;
Drul_array<Real> pos = ly_scm2interval (posns);
-
scale_drul (&pos, Staff_symbol_referencer::staff_space (me));
return knee;
}
+bool
+Beam::is_cross_staff (Grob *me)
+{
+ extract_grob_set (me, "stems", stems);
+ Grob *staff_symbol = Staff_symbol_referencer::get_staff_symbol (me);
+ for (vsize i = 0; i < stems.size (); i++)
+ if (Staff_symbol_referencer::get_staff_symbol (stems[i]) != staff_symbol)
+ return true;
+ return false;
+}
+
+MAKE_SCHEME_CALLBACK (Beam, calc_cross_staff, 1)
+SCM
+Beam::calc_cross_staff (SCM smob)
+{
+ return scm_from_bool (is_cross_staff (unsmob_grob (smob)));
+}
+
int
Beam::get_direction_beam_count (Grob *me, Direction d)
{