X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-spacing.cc;h=2839309ecb39c39aa065a1a2cc87b2693babb0dd;hb=c0be3d8c0c337802b5a0f8d341e514e10db6de70;hp=8586cc5f4cd209d6dd508117795eb587d61600d3;hpb=9f3572d98bb948c9689cd1f75401a029451fa001;p=lilypond.git diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index 8586cc5f4c..2839309ecb 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2006 Han-Wen Nienhuys + (c) 2001--2007 Han-Wen Nienhuys */ #include "note-spacing.hh" @@ -64,7 +64,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, continue; } - if (d == LEFT) + if (d == LEFT + && Note_column::has_interface (it)) { SCM r = it->get_object ("rest"); Grob *g = unsmob_grob (r); @@ -78,7 +79,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, if (g) { if (g->common_refpoint (it_col, X_AXIS) != it_col) - programming_error ("Note_spacing::get_spacing(): Common refpoint incorrect"); + programming_error ("Note_spacing::get_spacing (): Common refpoint incorrect"); else left_head_wid = g->extent (it_col, X_AXIS); } @@ -306,13 +307,13 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, stems_drul[d] = stem; beams_drul[d] = Stem::get_beam (stem); - Direction sd = get_grob_direction (stem); - if (stem_dirs[d] && stem_dirs[d] != sd) + Direction stem_dir = get_grob_direction (stem); + if (stem_dirs[d] && stem_dirs[d] != stem_dir) { correct_stem_dirs = false; continue; } - stem_dirs[d] = sd; + stem_dirs[d] = stem_dir; /* Correction doesn't seem appropriate when there is a large flag @@ -323,12 +324,20 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, correct_stem_dirs = false; Interval hp = Stem::head_positions (stem); - if (!hp.is_empty ()) + if (correct_stem_dirs + && !hp.is_empty ()) { - Real chord_start = hp[sd]; - Real stem_end = Stem::stem_end_position (stem); + Real chord_start = hp[stem_dir]; + + /* + can't look at stem-end-position, since that triggers + beam slope computations. + */ + Real stem_end = hp[stem_dir] + + stem_dir * robust_scm2double (stem->get_property ("length"), 7); - stem_posns[d] = Interval (min (chord_start, stem_end), max (chord_start, stem_end)); + stem_posns[d] = Interval (min (chord_start, stem_end), + max (chord_start, stem_end)); head_posns[d].unite (hp); } } @@ -347,6 +356,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, { stem_dirs[RIGHT] = -stem_dirs[LEFT]; stem_posns[RIGHT] = bar_yextent; + stem_posns[RIGHT] *= 2; } if (correct_stem_dirs && stem_dirs[LEFT] * stem_dirs[RIGHT] == -1) @@ -447,7 +457,15 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, */ } -ADD_INTERFACE (Note_spacing, "note-spacing-interface", +ADD_INTERFACE (Note_spacing, "This object calculates spacing wishes for individual voices.", - "left-items right-items stem-spacing-correction same-direction-correction knee-spacing-correction"); + + + "knee-spacing-correction " + "left-items " + "right-items " + "same-direction-correction " + "stem-spacing-correction " + + );