X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem.cc;h=045a90760b29d7e916f211e0c46322b99f433ea2;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=0a72fcf01953b1d276c57a64c9782e82a6844d6a;hpb=e8b68d8a878a0ee0381719230cf911dbcefa168d;p=lilypond.git diff --git a/lily/stem.cc b/lily/stem.cc index 0a72fcf019..045a90760b 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2014 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen TODO: This is way too hairy @@ -456,7 +456,7 @@ Stem::internal_calc_stem_end_position (Grob *me, bool calc_beam) /* Tremolo stuff. */ Grob *t_flag = Grob::unsmob (me->get_object ("tremolo-flag")); - if (t_flag && (!Grob::unsmob (me->get_object ("beam")) || !calc_beam)) + if (t_flag && (!Grob::is_smob (me->get_object ("beam")) || !calc_beam)) { /* Crude hack: add extra space if tremolo flag is there. @@ -575,14 +575,32 @@ Stem::calc_positioning_done (SCM smob) stem 100% whereas reversed heads only overlaps the stem 50% */ - Real reverse_overlap = 0.5; - heads[i]->translate_axis ((ell - thick * reverse_overlap) * d, - X_AXIS); + + /* + However, the first reverse head has to be shifted even + more than the full reverse overlap if it is the same + height as the first head or there will be a gap + because of the head slant (issue 346). + */ + + if (i == 1 && dy < 0.1) + reverse_overlap = 1.1; if (is_invisible (me)) - heads[i]->translate_axis (-thick * (2 - reverse_overlap) * d, - X_AXIS); + { + // Semibreves and longer are tucked in considerably + // to be recognizable as chorded rather than + // parallel voices. During the course of issue 346 + // there was a discussion to change this for unisons + // (dy < 0.1) to reduce overlap but without reaching + // agreement and with Gould being rather on the + // overlapping front. + reverse_overlap = 2; + } + + heads[i]->translate_axis ((ell - thick * reverse_overlap) * d, + X_AXIS); /* TODO: @@ -706,7 +724,7 @@ Stem::internal_height (Grob *me, bool calc_beam) If there is a beam but no stem, slope calculations depend on this routine to return where the stem end /would/ be. */ - if (calc_beam && !beam && !Stencil::unsmob (me->get_property ("stencil"))) + if (calc_beam && !beam && !Stencil::is_smob (me->get_property ("stencil"))) return Interval (); Real y1 = robust_scm2double ((calc_beam @@ -819,7 +837,7 @@ SCM Stem::calc_length (SCM smob) { Grob *me = Grob::unsmob (smob); - if (Grob::unsmob (me->get_object ("beam"))) + if (Grob::is_smob (me->get_object ("beam"))) { me->programming_error ("ly:stem::calc-length called but will not be used for beamed stem."); return scm_from_double (0.0); @@ -835,6 +853,8 @@ Stem::is_valid_stem (Grob *me) { /* TODO: make the stem start a direction ? This is required to avoid stems passing in tablature chords. */ + if (!me) + return false; Grob *lh = get_reference_head (me); Grob *beam = Grob::unsmob (me->get_object ("beam"));