X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem.cc;h=19279d7cd061e7b0c309f96c2a6f74b67f236e95;hb=310229863d7253a87aa28bce502e190023f77dfd;hp=8571cf35f9c2560231b892fbc6e22bbaa1e4bdf3;hpb=e65a2fb4c6e0e2e75f457531cab49aaf74364015;p=lilypond.git diff --git a/lily/system.cc b/lily/system.cc index 8571cf35f9..19279d7cd0 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--2010 Han-Wen Nienhuys + Copyright (C) 1996--2011 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 @@ -250,10 +250,16 @@ System::break_into_pieces (vector const &breaking) c[j]->translate_axis (breaking[i].config_[j], X_AXIS); dynamic_cast (c[j])->set_system (system); /* collect the column labels */ - SCM col_labels = c[j]->get_property ("labels"); - if (scm_is_pair (col_labels)) - system_labels = scm_append (scm_list_2 (col_labels, system_labels)); + collect_labels (c[j], &system_labels); } + /* + Collect labels from any loose columns too: theses will be set on + an empty bar line or a column which is otherwise unused mid-line + */ + vector loose (breaking[i].loose_cols_); + for (vsize j = 0; j < loose.size (); j++) + collect_labels (loose[j], &system_labels); + system->set_property ("labels", system_labels); set_loose_columns (system, &breaking[i]); @@ -261,6 +267,14 @@ System::break_into_pieces (vector const &breaking) } } +void +System::collect_labels (Grob const *col, SCM *labels) +{ + SCM col_labels = col->get_property ("labels"); + if (scm_is_pair (col_labels)) + *labels = scm_append (scm_list_2 (col_labels, *labels)); +} + void System::add_column (Paper_column *p) { @@ -572,6 +586,34 @@ System::get_extremal_staff (Direction dir, Interval const &iv) return 0; } +Interval +System::pure_refpoint_extent (vsize start, vsize end) +{ + Interval ret; + Grob *alignment = get_vertical_alignment (); + if (!alignment) + return Interval (); + + extract_grob_set (alignment, "elements", staves); + vector offsets = Align_interface::get_pure_minimum_translations (alignment, staves, Y_AXIS, start, end); + + for (vsize i = 0; i < offsets.size (); ++i) + if (Page_layout_problem::is_spaceable (staves[i])) + { + ret[UP] = offsets[i]; + break; + } + + for (vsize i = offsets.size (); i--;) + if (Page_layout_problem::is_spaceable (staves[i])) + { + ret[DOWN] = offsets[i]; + break; + } + + return ret; +} + Interval System::part_of_line_pure_height (vsize start, vsize end, bool begin) { @@ -580,7 +622,7 @@ System::part_of_line_pure_height (vsize start, vsize end, bool begin) return Interval (); extract_grob_set (alignment, "elements", staves); - vector offsets = Align_interface::get_minimum_translations (alignment, staves, Y_AXIS, true, start, end); + vector offsets = Align_interface::get_pure_minimum_translations (alignment, staves, Y_AXIS, start, end); Interval ret; for (vsize i = 0; i < staves.size (); ++i) @@ -629,9 +671,23 @@ System::calc_pure_relevant_grobs (SCM smob) for (vsize i = 0; i < elts.size (); ++i) { - if (!Axis_group_interface::has_interface (elts[i]) - && to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL))) - relevant_grobs.push_back (elts[i]); + if (!Axis_group_interface::has_interface (elts[i])) + { + if (to_boolean (scm_apply_1 (pure_relevant_p, elts[i]->self_scm (), SCM_EOL))) + relevant_grobs.push_back (elts[i]); + + if (Item *it = dynamic_cast (elts[i])) + { + Direction d = LEFT; + do + { + 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); + } + } } SCM grobs_scm = Grob_array::make_array (); @@ -662,6 +718,29 @@ System::calc_pure_height (SCM smob, SCM start_scm, SCM end_scm) return ly_interval2scm (begin); } +Grob* +System::get_pure_bound (Direction d, int start, int end) +{ + vector ranks = pscore_->get_break_ranks (); + vector indices = pscore_->get_break_indices (); + vector cols = pscore_->get_columns (); + + vsize target_rank = (d == LEFT ? start : end); + vector::const_iterator i = + lower_bound (ranks.begin (), ranks.end (), target_rank, std::less ()); + + if (i != ranks.end () && (*i) == target_rank) + return cols[indices[i - ranks.begin ()]]; + else + return 0; +} + +Grob* +System::get_maybe_pure_bound (Direction d, bool pure, int start, int end) +{ + return pure ? get_pure_bound (d, start, end) : get_bound (d); +} + ADD_INTERFACE (System, "This is the top-level object: Each object in a score" " ultimately has a @code{System} object as its X and" @@ -672,6 +751,5 @@ ADD_INTERFACE (System, "columns " "labels " "pure-Y-extent " - "skyline-distance " "skyline-horizontal-padding " );