X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspacing-determine-loose-columns.cc;h=93f70b5cecd477ebed82c058fa2d5f79c8345d12;hb=6eeb079ba4ed77997316262c842b215016dfe1e7;hp=2565d61adbfa398865bc82ccc96d6d5178bccea0;hpb=2c22efe5a46a37065b10c3f51c5d7db00d07d318;p=lilypond.git diff --git a/lily/spacing-determine-loose-columns.cc b/lily/spacing-determine-loose-columns.cc index 2565d61adb..93f70b5cec 100644 --- a/lily/spacing-determine-loose-columns.cc +++ b/lily/spacing-determine-loose-columns.cc @@ -4,7 +4,7 @@ source file of the GNU LilyPond music typesetter - (c) 2005 Han-Wen Nienhuys + (c) 2005--2006 Han-Wen Nienhuys */ #include "staff-spacing.hh" @@ -32,12 +32,13 @@ static bool is_loose_column (Grob *l, Grob *c, Grob *r, Spacing_options const *options) { - if (options->float_nonmusical_columns_ + if ((options->float_nonmusical_columns_ + ||options->float_grace_columns_) && Paper_column::when_mom (c).grace_part_) return true; if (Paper_column::is_musical (c) - || Item::is_breakable (c)) + || Paper_column::is_breakable (c)) return false; extract_grob_set (c, "right-neighbors", rns); @@ -64,7 +65,7 @@ is_loose_column (Grob *l, Grob *c, Grob *r, Spacing_options const *options) such a borderline case.) */ - if (lns.is_empty () || rns.is_empty ()) + if (lns.empty () || rns.empty ()) return false; Item *l_neighbor = dynamic_cast (lns[0]); @@ -87,11 +88,9 @@ is_loose_column (Grob *l, Grob *c, Grob *r, Spacing_options const *options) some cases (two isolated, consecutive clef changes) won't be nicely folded, but hey, then don't do that. */ - if (! ((Paper_column::is_musical (l_neighbor) || Item::is_breakable (l_neighbor)) - && (Paper_column::is_musical (r_neighbor) || Item::is_breakable (r_neighbor)))) - { - return false; - } + if (! ((Paper_column::is_musical (l_neighbor) || Paper_column::is_breakable (l_neighbor)) + && (Paper_column::is_musical (r_neighbor) || Paper_column::is_breakable (r_neighbor)))) + return false; /* A rather hairy check, but we really only want to move around @@ -100,13 +99,13 @@ is_loose_column (Grob *l, Grob *c, Grob *r, Spacing_options const *options) in any case, we don't want to move bar lines. */ extract_grob_set (c, "elements", elts); - for (int i = elts.size (); i--;) + for (vsize i = elts.size (); i--;) { Grob *g = elts[i]; if (g && Break_align_interface::has_interface (g)) { extract_grob_set (g, "elements", gelts); - for (int j = gelts.size (); j--;) + for (vsize j = gelts.size (); j--;) { Grob *h = gelts[j]; @@ -128,25 +127,25 @@ is_loose_column (Grob *l, Grob *c, Grob *r, Spacing_options const *options) between. */ void -Spacing_spanner::prune_loose_columns (Grob *me, Link_array *cols, +Spacing_spanner::prune_loose_columns (Grob *me, vector *cols, Spacing_options const *options) { - Link_array newcols; + vector newcols; - for (int i = 0; i < cols->size (); i++) + for (vsize i = 0; i < cols->size (); i++) { - Grob *c = cols->elem (i); + Grob *c = cols->at (i); bool loose = (i > 0 && i < cols->size () - 1) - && is_loose_column (cols->elem (i - 1), c, cols->elem (i + 1), options); + && is_loose_column (cols->at (i - 1), c, cols->at (i + 1), options); if (loose) { extract_grob_set (c, "right-neighbors", rns_arr); extract_grob_set (c, "left-neighbors", lns_arr); - SCM lns = lns_arr.size () ? lns_arr.top ()->self_scm () : SCM_BOOL_F; - SCM rns = rns_arr.size () ? rns_arr.top ()->self_scm () : SCM_BOOL_F; + SCM lns = lns_arr.size () ? lns_arr.back ()->self_scm () : SCM_BOOL_F; + SCM rns = rns_arr.size () ? rns_arr.back ()->self_scm () : SCM_BOOL_F; /* Either object can be non existent, if the score ends @@ -161,8 +160,8 @@ Spacing_spanner::prune_loose_columns (Grob *me, Link_array *cols, Set distance constraints for loose columns */ Drul_array next_door; - next_door[LEFT] = cols->elem (i - 1); - next_door[RIGHT] = cols->elem (i + 1); + next_door[LEFT] = cols->at (i - 1); + next_door[RIGHT] = cols->at (i + 1); Direction d = LEFT; Drul_array dists (0, 0); @@ -173,7 +172,7 @@ Spacing_spanner::prune_loose_columns (Grob *me, Link_array *cols, Item *rc = dynamic_cast (d == LEFT ? c : next_door[RIGHT]); extract_grob_set (lc, "spacing-wishes", wishes); - for (int k = wishes.size (); k--;) + for (vsize k = wishes.size (); k--;) { Grob *sp = wishes[k]; if (Note_spacing::left_column (sp) != lc @@ -207,22 +206,20 @@ Spacing_spanner::prune_loose_columns (Grob *me, Link_array *cols, dists[d] = max (dists[d], fixed_space); } else - { - programming_error ("Subversive spacing wish"); - } + programming_error ("Subversive spacing wish"); } } while (flip (&d) != LEFT); Rod r; r.distance_ = dists[LEFT] + dists[RIGHT]; - r.item_drul_[LEFT] = dynamic_cast (cols->elem (i - 1)); - r.item_drul_[RIGHT] = dynamic_cast (cols->elem (i + 1)); + r.item_drul_[LEFT] = dynamic_cast (cols->at (i - 1)); + r.item_drul_[RIGHT] = dynamic_cast (cols->at (i + 1)); r.add_to_cols (); } else - newcols.push (c); + newcols.push_back (c); } *cols = newcols; @@ -232,16 +229,16 @@ Spacing_spanner::prune_loose_columns (Grob *me, Link_array *cols, Set neighboring columns determined by the spacing-wishes grob property. */ void -Spacing_spanner::set_explicit_neighbor_columns (Link_array const &cols) +Spacing_spanner::set_explicit_neighbor_columns (vector const &cols) { - for (int i = 0; i < cols.size (); i++) + for (vsize i = 0; i < cols.size (); i++) { SCM right_neighbors = Grob_array::make_array (); Grob_array *rn_arr = unsmob_grob_array (right_neighbors); int min_rank = 100000; // inf. extract_grob_set (cols[i], "spacing-wishes", wishes); - for (int k = wishes.size (); k--;) + for (vsize k = wishes.size (); k--;) { Item *wish = dynamic_cast (wishes[k]); @@ -276,7 +273,7 @@ Spacing_spanner::set_explicit_neighbor_columns (Link_array const &cols) extract_grob_set (rc, "left-neighbors", lns_arr); if (lns_arr.size ()) { - Item *it = dynamic_cast (lns_arr.top ()); + Item *it = dynamic_cast (lns_arr.back ()); maxrank = Paper_column::get_rank (it->get_column ()); } @@ -295,9 +292,7 @@ Spacing_spanner::set_explicit_neighbor_columns (Link_array const &cols) } if (rn_arr->size ()) - { - cols[i]->set_object ("right-neighbors", right_neighbors); - } + cols[i]->set_object ("right-neighbors", right_neighbors); } } @@ -306,12 +301,12 @@ Spacing_spanner::set_explicit_neighbor_columns (Link_array const &cols) yet. Only do breakable non-musical columns, and musical columns. */ void -Spacing_spanner::set_implicit_neighbor_columns (Link_array const &cols) +Spacing_spanner::set_implicit_neighbor_columns (vector const &cols) { - for (int i = 0; i < cols.size (); i++) + for (vsize i = 0; i < cols.size (); i++) { Item *it = dynamic_cast (cols[i]); - if (!Item::is_breakable (it) && !Paper_column::is_musical (it)) + if (!Paper_column::is_breakable (it) && !Paper_column::is_musical (it)) continue; // it->breakable || it->musical @@ -320,7 +315,7 @@ Spacing_spanner::set_implicit_neighbor_columns (Link_array const &cols) sloppy with typing left/right-neighbors should take list, but paper-column found instead. */ extract_grob_set (cols[i], "left-neighbors", lns); - if (lns.is_empty () && i) + if (lns.empty () && i) { SCM ga_scm = Grob_array::make_array (); Grob_array *ga = unsmob_grob_array (ga_scm); @@ -328,7 +323,7 @@ Spacing_spanner::set_implicit_neighbor_columns (Link_array const &cols) cols[i]->set_object ("left-neighbors", ga_scm); } extract_grob_set (cols[i], "right-neighbors", rns); - if (rns.is_empty () && i < cols.size () - 1) + if (rns.empty () && i < cols.size () - 1) { SCM ga_scm = Grob_array::make_array (); Grob_array *ga = unsmob_grob_array (ga_scm);