X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem.cc;h=09786b750b5d205d4b7f834b6c6fa69fe507453b;hb=c5a3f0c024f4cb629811cff9eb04abff36e94138;hp=7c369e4bb060c281d4aeaeb797eaf097c08e02bc;hpb=87eedcd59f4082cb0841528ad5bc82cb1d1191e3;p=lilypond.git diff --git a/lily/stem.cc b/lily/stem.cc index 7c369e4bb0..09786b750b 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -239,6 +239,10 @@ Stem::pure_height (SCM smob, SCM start, SCM end) if (!is_normal_stem (me)) return ly_interval2scm (iv); + + /* if we are part of a cross-staff beam, return empty */ + if (get_beam (me) && Beam::is_cross_staff (get_beam (me))) + return ly_interval2scm (iv); Real ss = Staff_symbol_referencer::staff_space (me); Real len = scm_to_double (calc_length (smob)) * ss / 2; @@ -410,6 +414,8 @@ Stem::calc_positioning_done (SCM smob) if (!head_count (me)) return SCM_BOOL_T; + me->set_property ("positioning-done", SCM_BOOL_T); + extract_grob_set (me, "note-heads", ro_heads); vector heads (ro_heads); vector_sort (heads, position_less); @@ -555,13 +561,11 @@ SCM Stem::height (SCM smob) { Grob *me = unsmob_grob (smob); - + if (!is_normal_stem (me)) + return ly_interval2scm (Interval ()); + Direction dir = get_grob_direction (me); - /* Trigger callback. - - UGH. Should be automatic - */ Grob *beam = get_beam (me); if (beam) { @@ -908,10 +912,14 @@ Stem::calc_stem_info (SCM smob) Real height_of_my_trem = 0.0; Grob *trem = unsmob_grob (me->get_object ("tremolo-flag")); if (trem) - height_of_my_trem = trem->extent (trem, Y_AXIS).length () + { + height_of_my_trem + = Stem_tremolo::vertical_length (trem) /* hack a bit of space around the trem. */ + beam_translation; + } + /* UGH It seems that also for ideal minimum length, we must use the maximum beam count (for this direction): @@ -997,6 +1005,20 @@ Stem::beam_multiplicity (Grob *stem) return le; } +bool +Stem::is_cross_staff (Grob *stem) +{ + Grob *beam = unsmob_grob (stem->get_object ("beam")); + return beam && Beam::is_cross_staff (beam); +} + +MAKE_SCHEME_CALLBACK (Stem, cross_staff, 1) +SCM +Stem::cross_staff (SCM smob) +{ + return scm_from_bool (is_cross_staff (unsmob_grob (smob))); +} + /* FIXME: Too many properties */ ADD_INTERFACE (Stem, "The stem represent the graphical stem. "