X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspacing-spanner.cc;h=a61bffb98a3aa41d7a417ee493a17e7412e127b0;hb=644cd97fc602c18b7e0aafdc027cb8454d62560c;hp=b21ce3d3ab7feac013832be6d105b7758ee98550;hpb=1bcba0490ef7ad8671d221844b16b95da22ce9a0;p=lilypond.git diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index b21ce3d3ab..a61bffb98a 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -3,15 +3,17 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2006 Han-Wen Nienhuys + (c) 1999--2007 Han-Wen Nienhuys */ #include "spacing-spanner.hh" #include #include + using namespace std; +#include "spacing-options.hh" #include "international.hh" #include "main.hh" #include "moment.hh" @@ -27,14 +29,15 @@ using namespace std; #include "warn.hh" vector -Spacing_spanner::get_columns (Spanner *me) +Spacing_spanner::get_columns (Grob *me_grob) { - vector all (get_root_system (me)->columns ()); + Spanner *me = dynamic_cast (me_grob); + vector all (get_root_system (me)->used_columns ()); vsize start = binary_search (all, (Grob*)me->get_bound (LEFT), - &Paper_column::compare); + &Paper_column::less_than); vsize end = binary_search (all, (Grob*) me->get_bound (RIGHT), - &Paper_column::compare); - + &Paper_column::less_than); + all = vector::vector (all.begin () + start, all.begin () + end + 1); return all; @@ -47,17 +50,16 @@ Spacing_spanner::set_springs (SCM smob) Spanner *me = unsmob_spanner (smob); /* - can't use get_system() ? --hwn. + can't use get_system () ? --hwn. */ - vector all (get_columns (me)); - set_explicit_neighbor_columns (all); - Spacing_options options; options.init_from_grob (me); + vector cols = Spacing_spanner::get_columns (me); + set_explicit_neighbor_columns (cols); - prune_loose_columns (me, &all, &options); - set_implicit_neighbor_columns (all); - generate_springs (me, all, &options); + prune_loose_columns (me, &cols, &options); + set_implicit_neighbor_columns (cols); + generate_springs (me, cols, &options); return SCM_UNSPECIFIED; } @@ -144,9 +146,6 @@ Spacing_spanner::calc_common_shortest_duration (SCM grob) max_idx = i; max_count = counts[i]; } - - // printf ("duration %d/%d, count %d\n", - // durations[i].num (), durations[i].den (), counts[i]); } SCM bsd = me->get_property ("base-shortest-duration"); @@ -224,7 +223,7 @@ Spacing_spanner::generate_springs (Grob *me, for (vsize i = 0; i < cols.size (); i++) { Paper_column *col = dynamic_cast (cols[i]); - Paper_column *next = (i < cols.size()-1) ? dynamic_cast (cols[i+1]) : 0; + Paper_column *next = (i + 1 < cols.size ()) ? dynamic_cast (cols[i+1]) : 0; if (i > 0) generate_pair_spacing (me, prev, col, next, options); @@ -268,7 +267,7 @@ Spacing_spanner::musical_column_spacing (Grob *me, else { int wish_count = 0; - + extract_grob_set (left_col, "right-neighbors", neighbors); /* @@ -316,21 +315,37 @@ Spacing_spanner::musical_column_spacing (Grob *me, if (compound_note_space < 0 || wish_count == 0) { - /* - Fixed should be 0.0. If there are no spacing wishes, we're - likely dealing with polyphonic spacing of hemiolas. + + if (!Paper_column::is_musical (right_col)) + { + /* + There used to be code that examined left_col->extent + (X_AXIS), but this is resulted in unexpected wide + spacing, because the width of s^"text" output is also + taken into account here. + */ + compound_fixed_note_space = options->increment_; + compound_note_space = max (base_note_space, + options->increment_); + } + else + { + /* + Fixed should be 0.0. If there are no spacing wishes, we're + likely dealing with polyphonic spacing of hemiolas. - We used to have compound_fixed_note_space = options->increment_ + We used to have compound_fixed_note_space = options->increment_ - but this can lead to numeric instability problems when we - do + but this can lead to numeric instability problems when we + do - inverse_strength = (compound_note_space - compound_fixed_note_space) + inverse_strength = (compound_note_space - compound_fixed_note_space) - */ - - compound_note_space = base_note_space; - compound_fixed_note_space = 0.0; + */ + + compound_note_space = base_note_space; + compound_fixed_note_space = 0.0; + } } else if (to_boolean (me->get_property ("average-spacing-wishes"))) { @@ -383,6 +398,42 @@ Spacing_spanner::musical_column_spacing (Grob *me, Spaceable_grob::add_spring (left_col, right_col, distance, inverse_strength); } +/* + Check if COL fills the whole measure. + */ +bool +Spacing_spanner::fills_measure (Grob *me, Item *left, Item *col) +{ + System *sys = get_root_system (me); + Item *next = sys->column (col->get_column ()->get_rank () + 1); + if (!next) + return false; + + if (Paper_column::is_musical (next) + || Paper_column::is_musical (left) + || !Paper_column::is_musical (col) + || !Paper_column::is_used (next)) + return false; + + Moment dt = + Paper_column::when_mom (next) - Paper_column::when_mom (col); + + Moment *len = unsmob_moment (left->get_property ("measure-length")); + if (!len) + return false; + + /* + Don't check for exact measure length, since ending measures are + often shortened due to pickups. + */ + if (dt.main_part_ > len->main_part_ / Rational (2) + && (next->is_broken () + || next->break_status_dir ())) + return true; + + return false; +} + /* Read hints from L and generate springs. */ @@ -410,13 +461,12 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r, if (!spacing_grob || !Staff_spacing::has_interface (spacing_grob)) continue; - Real space; - Real fixed_space; + Real space = 0.; + Real fixed_space = 0.; /* column for the left one settings should be ok due automatic pointer munging. - */ assert (spacing_grob->get_column () == l); @@ -463,25 +513,25 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r, } + if (Paper_column::is_musical (r) + && l->break_status_dir () == CENTER + && fills_measure (me, l, r)) + { + compound_space += 1.0; + } + if (options->stretch_uniformly_ && l->break_status_dir () != RIGHT) compound_fixed = 0.0; assert (!isinf (compound_space)); compound_space = max (compound_space, compound_fixed); - /* - There used to be code that changed spacing depending on - raggedright setting. Ugh. - - Do it more cleanly, or rename the property. - - */ Real inverse_strength = (compound_space - compound_fixed); Real distance = compound_space; Spaceable_grob::add_spring (l, r, distance, inverse_strength); } -ADD_INTERFACE (Spacing_spanner, "spacing-spanner-interface", +ADD_INTERFACE (Spacing_spanner, "The space taken by a note is dependent on its duration. Doubling a\n" "duration adds spacing-increment to the space. The most common shortest\n" "note gets @code{shortest-duration-space}. Notes that are even shorter are\n" @@ -506,9 +556,3 @@ ADD_INTERFACE (Spacing_spanner, "spacing-spanner-interface", ); -ADD_INTERFACE (Spacing_interface, "spacing-interface", - "Something to do with line breaking and spacing. " - "Kill this one after determining line breaks.", - - ""); -