X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstem.cc;h=f21e0de6b5dac5b7dffbd0a3b1da25f4fcbb0562;hb=f809d8dbd69fab7d23c8fae198269984d918778b;hp=0a72fcf01953b1d276c57a64c9782e82a6844d6a;hpb=e8b68d8a878a0ee0381719230cf911dbcefa168d;p=lilypond.git diff --git a/lily/stem.cc b/lily/stem.cc index 0a72fcf019..f21e0de6b5 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 @@ -110,10 +110,10 @@ Stem::head_positions (Grob *me) Real Stem::chord_start_y (Grob *me) { - Interval hp = head_positions (me); - if (!hp.is_empty ()) - return hp[get_grob_direction (me)] * Staff_symbol_referencer::staff_space (me) - * 0.5; + if (head_count (me)) + return Staff_symbol_referencer::get_position (last_head (me)) + * Staff_symbol_referencer::staff_space (me) * 0.5; + return 0; } @@ -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: @@ -640,9 +658,9 @@ Stem::calc_default_direction (SCM smob) Direction dir = CENTER; int staff_center = 0; - Interval hp = head_positions (me); - if (!hp.is_empty ()) + if (head_count (me)) { + Interval hp = head_positions (me); int udistance = (int) (UP * hp[UP] - staff_center); int ddistance = (int) (DOWN * hp[DOWN] - staff_center); @@ -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"));