X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem.cc;h=fdcc2b133d1b056f78482087218aac7abbc559ff;hb=0e85f4fc28bf8e7a703abc45d836a3b59174bb23;hp=cc4cbda54960abf192f5a5ad99ea42cf5e66740d;hpb=66336e13517363e4603368d42fae23227a760ab4;p=lilypond.git diff --git a/lily/system.cc b/lily/system.cc index cc4cbda549..fdcc2b133d 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2011 Han-Wen Nienhuys + Copyright (C) 1996--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -23,7 +23,6 @@ #include "all-font-metrics.hh" #include "axis-group-interface.hh" #include "break-align-interface.hh" -#include "column-description.hh" #include "grob-array.hh" #include "hara-kiri-group-spanner.hh" #include "international.hh" @@ -207,7 +206,7 @@ System::get_broken_system_grobs () SCM ret = SCM_EOL; for (vsize i = 0; i < broken_intos_.size (); i++) ret = scm_cons (broken_intos_[i]->self_scm (), ret); - return scm_reverse (ret); + return scm_reverse_x (ret, SCM_EOL); } SCM @@ -336,7 +335,7 @@ System::num_footnotes () bool grob_2D_less (Grob *g1, Grob *g2) { - int sri[] = {0,0}; + int sri[] = {0, 0}; Grob *gs[] = {g1, g2}; for (int i = 0; i < 2; i++) @@ -357,7 +356,7 @@ grob_2D_less (Grob *g1, Grob *g2) if (sri[0] == sri[1]) return Grob::vertical_less (gs[0], gs[1]); - return sri[0] < sri[1]; + return sri[0] < sri[1]; } MAKE_SCHEME_CALLBACK (System, footnotes_before_line_breaking, 1); @@ -605,7 +604,7 @@ System::get_paper_system () pl->set_property ("page-break-penalty", right_bound->get_property ("page-break-penalty")); pl->set_property ("page-turn-penalty", right_bound->get_property ("page-turn-penalty")); - if (right_bound->original () == dynamic_cast (original ())->get_bound (RIGHT)) + if (right_bound->original () == dynamic_cast (original ())->get_bound (RIGHT)) pl->set_property ("last-in-score", SCM_BOOL_T); Interval staff_refpoints; @@ -753,80 +752,34 @@ System::get_extremal_staff (Direction dir, Interval const &iv) return 0; } -vector -System::get_simple_spacers (Real line_len, Real indent, bool ragged) +// Finds the neighboring staff in the given direction over bounds +Grob * +System::get_neighboring_staff (Direction dir, Grob *vertical_axis_group, Interval_t bounds) { - if (!simple_spacers_.size ()) - gen_simple_spacers (line_len, indent, ragged); - - return simple_spacers_; -} + Grob *align = get_vertical_alignment (); + if (!align) + return 0; -void -System::gen_simple_spacers (Real line_len, Real indent, bool ragged) -{ - vector breaks; - vector non_loose; - vector cols; - SCM force_break = ly_symbol2scm ("force"); - vector columns = used_columns (); - - for (vsize i = 0; i < columns.size (); i++) - if (!Paper_column::is_loose (columns[i]) - || Paper_column::is_breakable (columns[i])) - non_loose.push_back (columns[i]); - - breaks.clear (); - breaks.push_back (0); - cols.push_back (Column_description ()); - for (vsize i = 1; i + 1 < non_loose.size (); i++) - { - if (Paper_column::is_breakable (non_loose[i])) - breaks.push_back (cols.size ()); + extract_grob_set (align, "elements", elts); + vsize start = (dir == UP) ? 0 : elts.size () - 1; + vsize end = (dir == UP) ? elts.size () : VPOS; - cols.push_back (Column_description::get_column_description (non_loose, i, false)); - } - breaks.push_back (cols.size ()); - simple_spacers_.resize (breaks.size () * breaks.size (), Simple_spacer ()); + Grob *out = 0; - for (vsize b = 0; b + 1 < breaks.size (); b++) + for (vsize i = start; i != end; i += dir) { - cols[breaks[b]] = Column_description::get_column_description (non_loose, breaks[b], true); - vsize st = breaks[b]; + if (elts[i] == vertical_axis_group) + return out; - for (vsize c = b + 1; c < breaks.size (); c++) - { - vsize end = breaks[c]; - Simple_spacer spacer; - - for (vsize i = breaks[b]; i < end - 1; i++) - spacer.add_spring (cols[i].spring_); - spacer.add_spring (cols[end - 1].end_spring_); + if (Hara_kiri_group_spanner::has_interface (elts[i])) + Hara_kiri_group_spanner::consider_suicide (elts[i]); - for (vsize i = breaks[b]; i < end; i++) - { - for (vsize r = 0; r < cols[i].rods_.size (); r++) - if (cols[i].rods_[r].r_ < end) - spacer.add_rod (i - st, cols[i].rods_[r].r_ - st, cols[i].rods_[r].dist_); - for (vsize r = 0; r < cols[i].end_rods_.size (); r++) - if (cols[i].end_rods_[r].r_ == end) - spacer.add_rod (i - st, end - st, cols[i].end_rods_[r].dist_); - if (!cols[i].keep_inside_line_.is_empty ()) - { - spacer.add_rod (i - st, end - st, cols[i].keep_inside_line_[RIGHT]); - spacer.add_rod (0, i - st, -cols[i].keep_inside_line_[LEFT]); - } - } - spacer.solve ((b == 0) ? line_len - indent : line_len, ragged); - spacer.minimal_ = c == b + 1; - simple_spacers_[b * breaks.size () + c] = spacer; - - if (!spacer.fits () - || (end < cols.size () - && cols[end].break_permission_ == force_break)) - break; - } + bounds.intersect (elts[i]->spanned_rank_interval ()); + if (elts[i]->is_live () && !bounds.is_empty ()) + out = elts[i]; } + + return 0; } Interval @@ -921,14 +874,12 @@ System::calc_pure_relevant_grobs (SCM smob) if (Item *it = dynamic_cast (elts[i])) { - Direction d = LEFT; - do + for (LEFT_and_RIGHT (d)) { Item *piece = it->find_prebroken_piece (d); if (piece && to_boolean (scm_apply_1 (pure_relevant_p, piece->self_scm (), SCM_EOL))) relevant_grobs.push_back (piece); } - while (flip (&d) != LEFT); } } } @@ -984,7 +935,8 @@ System::get_maybe_pure_bound (Direction d, bool pure, int start, int end) return pure ? get_pure_bound (d, start, end) : get_bound (d); } -enum { +enum +{ SPACEABLE_STAVES, NONSPACEABLE_STAVES, ALL_STAVES @@ -993,7 +945,7 @@ enum { static SCM get_maybe_spaceable_staves (SCM smob, int filter) { - System *me = dynamic_cast (unsmob_grob (smob)); + System *me = dynamic_cast (unsmob_grob (smob)); Grob *align = me->get_vertical_alignment (); SCM ret = SCM_EOL; @@ -1005,10 +957,10 @@ get_maybe_spaceable_staves (SCM smob, int filter) for (vsize i = 0; i < staves.size (); ++i) { bool spaceable = Page_layout_problem::is_spaceable (staves[i]); - if (staves[i]->is_live () && - ((filter == ALL_STAVES) - || (filter == SPACEABLE_STAVES && spaceable) - || (filter == NONSPACEABLE_STAVES && !spaceable))) + if (staves[i]->is_live () + && ((filter == ALL_STAVES) + || (filter == SPACEABLE_STAVES && spaceable) + || (filter == NONSPACEABLE_STAVES && !spaceable))) { *tail = scm_cons (staves[i]->self_scm (), SCM_EOL); tail = SCM_CDRLOC (*tail); @@ -1040,7 +992,6 @@ System::get_nonspaceable_staves (SCM smob) return get_maybe_spaceable_staves (smob, NONSPACEABLE_STAVES); } - ADD_INTERFACE (System, "This is the top-level object: Each object in a score" " ultimately has a @code{System} object as its X and"