X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-spacing.cc;h=4a089529f118c319792e8e780b5ca5dc6df12fc6;hb=c7a23c5c727ce283c5a2e9fc44382d22c7728905;hp=5b8bc0ed38a0208a2d082cdc336a745bd333472b;hpb=bdf4ab13203502e7ec7cf9cf5896527643a07c1f;p=lilypond.git diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index 5b8bc0ed38..4a089529f1 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -8,6 +8,7 @@ #include "note-spacing.hh" +#include "grob-array.hh" #include "paper-column.hh" #include "moment.hh" #include "note-column.hh" @@ -17,6 +18,8 @@ #include "staff-spacing.hh" #include "accidental-placement.hh" #include "output-def.hh" +#include "pointer-group-interface.hh" + /* TODO: detect hshifts due to collisions, and account for them in @@ -27,9 +30,8 @@ void Note_spacing::get_spacing (Grob *me, Item *right_col, Real base_space, Real increment, Real *space, Real *fixed) { - - Drul_array props (me->get_property ("left-items"), - me->get_property ("right-items")); + Drul_array props (me->get_object ("left-items"), + me->get_object ("right-items")); Direction d = LEFT; Direction col_dir = right_col->break_status_dir (); Drul_array extents; @@ -37,9 +39,10 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, Interval left_head_wid; do { - for (SCM s = props[d]; scm_is_pair (s); s = scm_cdr (s)) + Link_array const &items (ly_scm2link_array (props [d])); + for (int i = items.size (); i--;) { - Item *it = dynamic_cast (unsmob_grob (scm_car (s))); + Item *it = dynamic_cast (items[i]); if (d == RIGHT && it->break_status_dir () != col_dir) { @@ -64,7 +67,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, if (d == LEFT) { - SCM r = it->get_property ("rest"); + SCM r = it->get_object ("rest"); Grob *g = unsmob_grob (r); if (!g) g = Note_column::first_head (it); @@ -176,15 +179,15 @@ Note_spacing::right_column (Grob *me) if (!me->is_live ()) return 0; - SCM right = me->get_property ("right-items"); + Grob_array * a = unsmob_grob_array (me->get_object ("right-items")); Item *mincol = 0; int min_rank = INT_MAX; bool prune = false; - for (SCM s = right; scm_is_pair (s); s = scm_cdr (s)) + for (int i = 0; a && i < a->size (); i++) { - Item *ri = unsmob_item (scm_car (s)); - + Item *ri = a->item (i); Item *col = ri->get_column (); + int rank = Paper_column::get_rank (col); if (rank < min_rank) @@ -197,26 +200,18 @@ Note_spacing::right_column (Grob *me) } } - if (prune) + if (prune && a) { - // I'm a lazy bum. We could do this in-place. - SCM newright = SCM_EOL; - for (SCM s = right; scm_is_pair (s); s = scm_cdr (s)) + Link_array & right = a->array_reference (); + for (int i = right.size(); i--;) { - if (unsmob_item (scm_car (s))->get_column () == mincol) - newright = scm_cons (scm_car (s), newright); + if (dynamic_cast (right[i])->get_column () != mincol) + right.del (i); } - - me->set_property ("right-items", newright); } if (!mincol) { - /* - int r = Paper_column::get_rank (dynamic_cast(me)->get_column ()); - programming_error (_f ("Spacing wish column %d has no right item.", r)); - */ - return 0; } @@ -238,8 +233,8 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Drul_array stem_dirs (CENTER, CENTER); Drul_array stem_posns; Drul_array head_posns; - Drul_array props (me->get_property ("left-items"), - me->get_property ("right-items")); + Drul_array props (me->get_object ("left-items"), + me->get_object ("right-items")); Drul_array beams_drul (0, 0); Drul_array stems_drul (0, 0); @@ -255,9 +250,10 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, do { - for (SCM s = props[d]; scm_is_pair (s); s = scm_cdr (s)) + Link_array const &items (ly_scm2link_array (props [d])); + for (int i = 0; i < items.size(); i++) { - Item *it = dynamic_cast (unsmob_grob (scm_car (s))); + Item *it = dynamic_cast (items[i]); if (d == RIGHT) acc_right = acc_right || Note_column::accidentals (it); @@ -317,7 +313,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Real chord_start = hp[sd]; Real stem_end = Stem::stem_end_position (stem); - stem_posns[d] = Interval (chord_start ? stem_end); + stem_posns[d] = Interval (min (chord_start, stem_end), max (chord_start, stem_end)); head_posns[d].unite (hp); } } @@ -383,7 +379,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, /* Ugh. 7 is hardcoded. */ - correction = (correction / 7) get_property ("stem-spacing-correction"), 0); @@ -425,10 +421,10 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, = (head_posns[LEFT][DOWN] > head_posns[RIGHT][UP]) ? RIGHT : LEFT; Real delta = head_posns[-lowest][DOWN] - head_posns[lowest][UP]; - Real corr = robust_scm2double (me->get_property ("stem-spacing-correction"), 0); - corr = (delta <= 1) ? 0.0 : 0.25; - - correction = -lowest * corr; + Real corr = robust_scm2double (me->get_property ("same-direction-correction"), 0); + + if (delta > 1) + correction = -lowest * corr; } *space += correction; @@ -440,5 +436,5 @@ 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 knee-spacing-correction"); + "left-items right-items stem-spacing-correction same-direction-correction knee-spacing-correction");