X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-spacing.cc;h=2700c12835a990362644667ddf8da5df43c903f2;hb=8feb4129f717f38c6bf41a924ec298424ec63065;hp=2bc95d7650420fee548c938ddb913c8e1b7ee79b;hpb=108cf0e8c08c8e15e2a800feb161cfad9057daa8;p=lilypond.git diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index 2bc95d7650..2700c12835 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -3,11 +3,12 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2005 Han-Wen Nienhuys + (c) 2001--2006 Han-Wen Nienhuys */ #include "note-spacing.hh" +#include "directional-element-interface.hh" #include "grob-array.hh" #include "paper-column.hh" #include "moment.hh" @@ -38,8 +39,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, Interval left_head_wid; do { - Link_array const &items (ly_scm2link_array (props [d])); - for (int i = items.size (); i--;) + vector const &items (ly_scm2link_array (props [d])); + for (vsize i = items.size (); i--;) { Item *it = dynamic_cast (items[i]); @@ -75,7 +76,12 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, first note head will be. */ if (g) - left_head_wid = g->extent (it_col, X_AXIS); + { + if (g->common_refpoint (it_col, X_AXIS) != it_col) + programming_error ("Note_spacing::get_spacing(): Common refpoint incorrect"); + else + left_head_wid = g->extent (it_col, X_AXIS); + } } extents[d].unite (it->extent (it_col, X_AXIS)); @@ -105,6 +111,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, /* We look at the width of the note head, since smaller heads get less space + eg. a quarter rest gets almost 0.5 ss less horizontal space than a note. What is sticking out of the note head (eg. a flag), doesn't get @@ -134,7 +141,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, /* Add that which sticks out a lot. */ - + max (0.0, -extents[RIGHT][LEFT] - (base_space - increment)))); + + max (0.0, -extents[RIGHT][LEFT] - (base_space - 0.5 * increment)))); /* We don't do complicated stuff: (base_space - increment) is the @@ -144,9 +151,14 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, */ *space = (base_space - increment) + *fixed; +#if 0 + /* + The below situation is now handled by the "sticks out a lot" case + above. However we keep around the code for a few releases before + we drop it. + */ if (!extents[RIGHT].is_empty () - && (Item::is_breakable (right_col) - || right_col->original_)) + && (Paper_column::is_breakable (right_col))) { /* This is for the situation @@ -161,7 +173,8 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, *space += -extents[RIGHT][LEFT] / 2; *fixed += -extents[RIGHT][LEFT] / 2; } - +#endif + stem_dir_correction (me, right_col, increment, space, fixed); } @@ -191,7 +204,7 @@ Note_spacing::right_column (Grob *me) Item *mincol = 0; int min_rank = INT_MAX; bool prune = false; - for (int i = 0; a && i < a->size (); i++) + for (vsize i = 0; a && i < a->size (); i++) { Item *ri = a->item (i); Item *col = ri->get_column (); @@ -210,11 +223,11 @@ Note_spacing::right_column (Grob *me) if (prune && a) { - Link_array &right = a->array_reference (); - for (int i = right.size (); i--;) + vector &right = a->array_reference (); + for (vsize i = right.size (); i--;) { if (dynamic_cast (right[i])->get_column () != mincol) - right.del (i); + right.erase (right.begin () + i); } } @@ -256,8 +269,8 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, do { - Link_array const &items (ly_scm2link_array (props [d])); - for (int i = 0; i < items.size (); i++) + vector const &items (ly_scm2link_array (props [d])); + for (vsize i = 0; i < items.size (); i++) { Item *it = dynamic_cast (items[i]); @@ -293,13 +306,13 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, stems_drul[d] = stem; beams_drul[d] = Stem::get_beam (stem); - Direction sd = Stem::get_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 @@ -310,12 +323,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]; - stem_posns[d] = Interval (min (chord_start, stem_end), max (chord_start, stem_end)); + /* + 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)); head_posns[d].unite (hp); } } @@ -436,5 +457,13 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, ADD_INTERFACE (Note_spacing, "note-spacing-interface", "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 " + + );