--- /dev/null
+\version "2.15.36"
+
+\header {
+ texidoc = "Stems reach correct begin points of merged noteheads.
+"
+}
+
+<< { \aikenHeads f'8 } \\ { \aikenHeads f'8 } >>
+<< { \aikenHeads f'4:32 } \\ { \aikenHeads f' } >>
+<< { \aikenHeads e'8 f' s4 } \\ { \aikenHeads e'8 f' s4 } >>
\ No newline at end of file
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (width, (SCM));
DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
+ DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM));
DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM));
DECLARE_GROB_INTERFACE ();
+
+ static SCM internal_calc_y_offset (SCM smob, bool pure);
};
MAKE_SCHEME_CALLBACK (Flag, width, 1);
return flag.smobbed_copy ();
}
+MAKE_SCHEME_CALLBACK (Flag, pure_calc_y_offset, 3);
+SCM
+Flag::pure_calc_y_offset (SCM smob,
+ SCM /* beg */,
+ SCM /* end */)
+{
+ return internal_calc_y_offset (smob, true);
+}
+
MAKE_SCHEME_CALLBACK (Flag, calc_y_offset, 1);
SCM
Flag::calc_y_offset (SCM smob)
+{
+ return internal_calc_y_offset (smob, false);
+}
+
+SCM
+Flag::internal_calc_y_offset (SCM smob, bool pure)
{
Grob *me = unsmob_grob (smob);
Grob *stem = me->get_parent (X_AXIS);
Real blot
= me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
- Real y2 = stem->extent (stem, Y_AXIS)[d];
+ Real y2 = pure
+ ? stem->pure_height (stem, 0, INT_MAX)[d]
+ : stem->extent (stem, Y_AXIS)[d];
return scm_from_double (y2 - d * blot / 2);
}
}
Real end_y
- = stem->extent (stem, Y_AXIS)[stemdir]
+ = (pure
+ ? stem->pure_height (stem, 0, INT_MAX)[stemdir]
+ : stem->extent (stem, Y_AXIS)[stemdir])
- stemdir * max (beam_count, 1) * beam_translation
- Stem::beam_end_corrective (stem);
if (d && d * head_positions (me)[get_grob_direction (me)] >= se * d)
me->warning (_ ("weird stem size, check for narrow beams"));
- Interval height = me->pure_height (me, 0, INT_MAX);
+ // trigger note collision mechanisms
+ Real stem_beg = internal_calc_stem_begin_position (me, false);
Real staff_space = Staff_symbol_referencer::staff_space (me);
Real half_space = staff_space * 0.5;
+ Interval height;
+ height[-d] = stem_beg * half_space;
height[d] = se * half_space + beam_end_corrective (me);
Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"),
(,ly:axis-group-interface::calc-staff-staff-spacing . ,ly:axis-group-interface::calc-pure-staff-staff-spacing)
(,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
(,ly:beam::rest-collision-callback . ,ly:beam::pure-rest-collision-callback)
+ (,ly:flag::calc-y-offset . ,ly:flag::pure-calc-y-offset)
(,ly:grob::stencil-height . ,pure-stencil-height)
(,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
(,ly:rest-collision::force-shift-callback-rest . ,pure-chain-offset-callback)
(list
parenthesize-elements
laissez-vibrer::print
- ly:flag::calc-y-offset
ly:rest::y-offset-callback
ly:staff-symbol-referencer::callback
ly:staff-symbol::height))