X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspacing-spanner.cc;h=fd9585f1352e2b8dfe2af52a136b3cacbe2c7b0e;hb=f05cfd7757b31723fe6af2f5c0e2fdbaebea3b85;hp=2fff9c08e6d954c68c197fd5b33f49c6b92ed000;hpb=f7f4d9dcd37086b5c8b417719a0fcc924aceef92;p=lilypond.git diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index 2fff9c08e6..fd9585f135 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -34,11 +34,15 @@ class Spacing_spanner { public: + static void standard_breakable_column_spacing (Grob * me, Item*l, Item*r, + Real * fixed, Real * space, Moment); + + static Real default_bar_spacing (Grob*,Grob*,Grob*,Moment); static Real note_spacing (Grob*,Grob*,Grob*,Moment, bool*); static Real get_duration_space (Grob*,Moment dur, Rational shortest, bool*); static Rational find_shortest (Link_array const &); - static void breakable_column_spacing (Item* l, Item *r); + static void breakable_column_spacing (Grob*, Item* l, Item *r, Moment); static void find_loose_columns () {} static void prune_loose_colunms (Grob*,Link_array *cols, Rational); static void find_loose_columns (Link_array cols); @@ -470,7 +474,7 @@ Spacing_spanner::do_measure (Rational shortest, Grob*me, Link_array *cols) if (!Paper_column::musical_b (l)) { - breakable_column_spacing (l, r); + breakable_column_spacing (me, l, r, shortest); /* @@ -483,12 +487,12 @@ Spacing_spanner::do_measure (Rational shortest, Grob*me, Link_array *cols) Item *rb = r->find_prebroken_piece (LEFT); if (lb) - breakable_column_spacing (lb,r); + breakable_column_spacing (me, lb,r, shortest); if (rb) - breakable_column_spacing (l, rb); + breakable_column_spacing (me, l, rb, shortest); if (lb && rb) - breakable_column_spacing (lb, rb); + breakable_column_spacing (me, lb, rb, shortest); continue ; } @@ -553,15 +557,47 @@ Spacing_spanner::musical_column_spacing (Grob *me, Item * lc, Item *rc, Real inc Spaceable_grob::add_spring (lc, rc, max_note_space, 1 / (max_note_space -max_fixed_note_space), expand_only); } +void +Spacing_spanner::standard_breakable_column_spacing (Grob * me, Item*l, Item*r, + Real * fixed, Real * space, + Moment shortest) +{ + *fixed = l->extent (l, X_AXIS)[RIGHT] - r->extent (r, X_AXIS)[LEFT]; + + if (l->breakable_b (l) && r->breakable_b(r)) + { + Moment *dt = unsmob_moment (l->get_grob_property ("measure-length")); + Moment mlen (1); + if (dt) + mlen = *dt; + + Real incr = gh_scm2double (me->get_grob_property ("spacing-increment")); + + *space = *fixed + incr * double (mlen.main_part_ / shortest.main_part_) * 0.8; + } + else + { + Moment dt = Paper_column::when_mom (r) - Paper_column::when_mom (l); + bool dummy; + + *space = *fixed + get_duration_space (me, dt, shortest.main_part_, &dummy); + } + + +} + /* Read hints from L and generate springs. */ void -Spacing_spanner::breakable_column_spacing (Item* l, Item *r) +Spacing_spanner::breakable_column_spacing (Grob*me, Item* l, Item *r,Moment shortest) { Real max_fixed = -infinity_f; Real max_space = -infinity_f; + + standard_breakable_column_spacing (me, l, r, &max_fixed, &max_space , + shortest); for (SCM s = l->get_grob_property ("spacing-wishes"); gh_pair_p (s); s = gh_cdr (s)) @@ -590,6 +626,9 @@ Spacing_spanner::breakable_column_spacing (Item* l, Item *r) } } + + + if (isinf (max_space)) { programming_error ("No pref spacing found"); @@ -661,11 +700,14 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc, programming_error ("can't find a ruling note at " + Paper_column::when_mom (lc).str ()); shortest_playing_len = 1; } - - Moment delta_t = Paper_column::when_mom (rc) - Paper_column::when_mom (lc); + + Moment lwhen = Paper_column::when_mom (lc); + Moment rwhen = Paper_column::when_mom (rc); + + Moment delta_t = rwhen - lwhen; Real dist = 0.0; - if (delta_t.main_part_) + if (delta_t.main_part_ && !lwhen.grace_part_) { dist = get_duration_space (me, shortest_playing_len, shortest.main_part_, expand_only); dist *= (double) (delta_t.main_part_ / shortest_playing_len.main_part_);