X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem.cc;h=e686e3b58cad0585e3ea7303686e50bfeb5e13aa;hb=0a08e87869663425d8f5bcaef4197c3bae1b2de5;hp=a8a0ff5160f7ba0730c8ce20eee15796780cf5a5;hpb=2893f2dd20c081c06c1c7356551344801f8a233a;p=lilypond.git diff --git a/lily/system.cc b/lily/system.cc index a8a0ff5160..e686e3b58c 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2006 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys */ #include "system.hh" @@ -13,19 +13,19 @@ #include "axis-group-interface.hh" #include "grob-array.hh" #include "international.hh" +#include "lookup.hh" #include "main.hh" #include "output-def.hh" #include "paper-column.hh" #include "paper-score.hh" #include "paper-system.hh" #include "pointer-group-interface.hh" -#include "spacing-interface.hh" +#include "skyline-pair.hh" #include "staff-symbol-referencer.hh" -#include "tweak-registration.hh" #include "warn.hh" -System::System (System const &src, int count) - : Spanner (src, count) +System::System (System const &src) + : Spanner (src) { all_elements_ = 0; pscore_ = 0; @@ -33,8 +33,8 @@ System::System (System const &src, int count) init_elements (); } -System::System (SCM s, Object_key const *key) - : Spanner (s, key) +System::System (SCM s) + : Spanner (s) { all_elements_ = 0; rank_ = 0; @@ -51,9 +51,9 @@ System::init_elements () } Grob * -System::clone (int index) const +System::clone () const { - return new System (*this, index); + return new System (*this); } int @@ -112,8 +112,8 @@ fixup_refpoints (vector const &grobs) grobs[i]->fixup_refpoint (); } -SCM -System::get_paper_systems () +void +System::do_break_substitution_and_fixup_refpoints () { for (vsize i = 0; i < all_elements_->size (); i++) { @@ -176,7 +176,20 @@ System::get_paper_systems () if (be_verbose_global) message (_f ("Element count %d.", count + element_count ())); +} + +SCM +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); +} +SCM +System::get_paper_systems () +{ SCM lines = scm_c_make_vector (broken_intos_.size (), SCM_EOL); for (vsize i = 0; i < broken_intos_.size (); i++) { @@ -185,7 +198,6 @@ System::get_paper_systems () System *system = dynamic_cast (broken_intos_[i]); - system->post_processing (); scm_vector_set_x (lines, scm_from_int (i), system->get_paper_system ()); @@ -200,7 +212,7 @@ System::break_into_pieces (vector const &breaking) { for (vsize i = 0; i < breaking.size (); i++) { - System *system = dynamic_cast (clone (broken_intos_.size ())); + System *system = dynamic_cast (clone ()); system->rank_ = broken_intos_.size (); vector c (breaking[i].cols_); @@ -213,11 +225,18 @@ System::break_into_pieces (vector const &breaking) system->set_bound (LEFT, c[0]); system->set_bound (RIGHT, c.back ()); + SCM system_labels = SCM_EOL; for (vsize j = 0; j < c.size (); j++) { c[j]->translate_axis (breaking[i].config_[j], X_AXIS); dynamic_cast (c[j])->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)); } + system->set_property ("labels", system_labels); + set_loose_columns (system, &breaking[i]); broken_intos_.push_back (system); } @@ -235,30 +254,12 @@ System::add_column (Paper_column *p) ga = unsmob_grob_array (scm_ga); } - p->rank_ - = ga->size () - ? Paper_column::get_rank (ga->array ().back ()) + 1 - : 0; + p->rank_ = ga->size (); ga->add (p); Axis_group_interface::add_element (this, p); } -void -apply_tweaks (Grob *g, bool broken) -{ - if (bool (g->original ()) == broken) - { - SCM tweaks = global_registry_->get_tweaks (g); - for (SCM s = tweaks; scm_is_pair (s); s = scm_cdr (s)) - { - SCM proc = scm_caar (s); - SCM rest = scm_cdar (s); - scm_apply_1 (proc, g->self_scm (), rest); - } - } -} - void System::pre_processing () { @@ -278,9 +279,6 @@ System::pre_processing () fixup_refpoints (all_elements_->array ()); - for (vsize i = 0; i < all_elements_->size (); i++) - apply_tweaks (all_elements_->grob (i), false); - for (vsize i = 0; i < all_elements_->size (); i++) { Grob *g = all_elements_->grob (i); @@ -301,7 +299,6 @@ System::post_processing () { Grob *g = all_elements_->grob (i); - apply_tweaks (g, true); (void) g->get_property ("after-line-breaking"); } @@ -316,7 +313,7 @@ System::post_processing () anyway. */ vector all_elts_sorted (all_elements_->array ()); - vector_sort (all_elts_sorted, default_compare); + vector_sort (all_elts_sorted, std::less ()); uniq (all_elts_sorted); this->get_stencil (); for (vsize i = all_elts_sorted.size (); i--;) @@ -346,6 +343,8 @@ System::get_paper_system () SCM exprs = SCM_EOL; SCM *tail = &exprs; + post_processing (); + vector entries; for (vsize j = 0; j < all_elements_->size (); j++) { @@ -356,13 +355,13 @@ System::get_paper_system () entries.push_back (e); } - vector_sort (entries, default_compare); + vector_sort (entries, std::less ()); for (vsize j = 0; j < entries.size (); j++) { Grob *g = entries[j].grob_; Stencil st = g->get_print_stencil (); - if (st.expr() == SCM_EOL) + if (st.expr () == SCM_EOL) continue; Offset o; @@ -390,34 +389,39 @@ System::get_paper_system () Stencil sys_stencil (Box (x, y), scm_cons (ly_symbol2scm ("combine-stencil"), exprs)); + if (debug_skylines) + { + Skyline_pair *skylines = Skyline_pair::unsmob (get_property ("vertical-skylines")); + if (skylines) + { + Stencil up + = Lookup::points_to_line_stencil (0.1, (*skylines)[UP].to_points (X_AXIS)); + Stencil down + = Lookup::points_to_line_stencil (0.1, (*skylines)[DOWN].to_points (X_AXIS)); + sys_stencil.add_stencil (up.in_color (255, 0, 0)); + sys_stencil.add_stencil (down.in_color (0, 255, 0)); + } + } Grob *left_bound = this->get_bound (LEFT); SCM prop_init = left_bound->get_property ("line-break-system-details"); Prob *pl = make_paper_system (prop_init); paper_system_set_stencil (pl, sys_stencil); - /* backwards-compatibility hack for the old page-breaker */ - SCM turn_perm = left_bound->get_property ("page-break-permission"); - if (!scm_is_symbol (turn_perm)) - pl->set_property ("penalty", scm_from_double (10001.0)); - else if (turn_perm == ly_symbol2scm ("force")) - pl->set_property ("penalty", scm_from_double (-10001.0)); - else - pl->set_property ("penalty", scm_from_double (0.0)); - - if (!scm_is_pair (pl->get_property ("refpoint-Y-extent"))) - { - Interval staff_refpoints; - staff_refpoints.set_empty (); - extract_grob_set (this, "spaceable-staves", staves); - for (vsize i = 0; i < staves.size (); i++) - { - Grob *g = staves[i]; - staff_refpoints.add_point (g->relative_coordinate (this, Y_AXIS)); - } - pl->set_property ("refpoint-Y-extent", ly_interval2scm (staff_refpoints)); - } + /* information that the page breaker might need */ + Grob *right_bound = this->get_bound (RIGHT); + pl->set_property ("vertical-skylines", this->get_property ("vertical-skylines")); + pl->set_property ("page-break-permission", right_bound->get_property ("page-break-permission")); + pl->set_property ("page-turn-permission", right_bound->get_property ("page-turn-permission")); + 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")); + Interval staff_refpoints; + extract_grob_set (this, "spaceable-staves", staves); + for (vsize i = 0; i < staves.size (); i++) + staff_refpoints.add_point (staves[i]->relative_coordinate (this, Y_AXIS)); + + pl->set_property ("staff-refpoint-extent", ly_interval2scm (staff_refpoints)); pl->set_property ("system-grob", this->self_scm ()); return pl->unprotect (); @@ -431,17 +435,16 @@ System::broken_col_range (Item const *left, Item const *right) const left = left->get_column (); right = right->get_column (); + extract_grob_set (this, "columns", cols); - vsize i = 0; - while (i < cols.size () - && cols[i] != left) - i++; + vsize i = Paper_column::get_rank (left); + int end_rank = Paper_column::get_rank (right); if (i < cols.size ()) i++; while (i < cols.size () - && cols[i] != right) + && Paper_column::get_rank (cols[i]) < end_rank) { Paper_column *c = dynamic_cast (cols[i]); if (Paper_column::is_breakable (c) && !c->system_) @@ -452,10 +455,11 @@ System::broken_col_range (Item const *left, Item const *right) const return ret; } + /** Return all columns, but filter out any unused columns , since they might disrupt the spacing problem. */ vector -System::columns () const +System::used_columns () const { extract_grob_set (this, "columns", ro_columns); @@ -477,6 +481,16 @@ System::columns () const return columns; } +Paper_column * +System::column (vsize which) const +{ + extract_grob_set (this, "columns", columns); + if (which >= columns.size ()) + return 0; + + return dynamic_cast (columns[which]); +} + Paper_score* System::paper_score () const { @@ -500,15 +514,17 @@ get_root_system (Grob *me) return dynamic_cast (system_grob); } - - -ADD_INTERFACE (System, "system-interface", - "This is the toplevel object: each object in a score " - "ultimately has a System object as its X and Y parent. ", +ADD_INTERFACE (System, + "This is the top-level object: Each object in a score" + " ultimately has a @code{System} object as its X and" + " Y@tie{}parent.", /* properties */ "all-elements " "columns " + "labels " "pure-Y-extent " "spaceable-staves " + "skyline-distance " + "skyline-horizontal-padding " )