X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fsystem.cc;h=bbbe941faf40bf3ab622eea5e8e87c0c5d247df8;hb=ade2bb7da653fbd9d670590afd67376fe69c59dd;hp=2a869c450134692dc56b9492fdfdec06b5b76b31;hpb=04e10efb0566620b4b7972d6775c8e59f04fa209;p=lilypond.git diff --git a/lily/system.cc b/lily/system.cc index 2a869c4501..bbbe941faf 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" @@ -21,13 +21,13 @@ #include "pointer-group-interface.hh" #include "spacing-interface.hh" #include "staff-symbol-referencer.hh" -#include "tweak-registration.hh" #include "warn.hh" +#include "lookup.hh" extern bool debug_skylines; -System::System (System const &src, int count) - : Spanner (src, count) +System::System (System const &src) + : Spanner (src) { all_elements_ = 0; pscore_ = 0; @@ -35,8 +35,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; @@ -53,9 +53,9 @@ System::init_elements () } Grob * -System::clone (int index) const +System::clone () const { - return new System (*this, index); + return new System (*this); } int @@ -209,7 +209,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_); @@ -245,30 +245,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 () { @@ -288,9 +270,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); @@ -311,7 +290,6 @@ System::post_processing () { Grob *g = all_elements_->grob (i); - apply_tweaks (g, true); (void) g->get_property ("after-line-breaking"); } @@ -372,7 +350,7 @@ System::get_paper_system () Grob *g = entries[j].grob_; Stencil st = g->get_print_stencil (); - if (st.expr() == SCM_EOL) + if (st.expr () == SCM_EOL) continue; Offset o; @@ -402,8 +380,8 @@ System::get_paper_system () exprs)); if (debug_skylines) { - sys_stencil.add_stencil (to_stencil (skylines_[UP]).in_color (255, 0, 0)); - sys_stencil.add_stencil (to_stencil (skylines_[DOWN]).in_color (0, 255, 0)); + sys_stencil.add_stencil (Lookup::points_to_line_stencil (0.1, skylines_[UP].to_points ()).in_color (255, 0, 0)); + sys_stencil.add_stencil (Lookup::points_to_line_stencil (0.1, skylines_[DOWN].to_points ()).in_color (0, 255, 0)); } Grob *left_bound = this->get_bound (LEFT); @@ -445,17 +423,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_) @@ -466,10 +443,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); @@ -491,6 +469,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 { @@ -530,8 +518,10 @@ System::build_skylines () boxes.push_back (Box (xiv, yiv)); } - skylines_[UP] = Skyline (boxes, X_AXIS, UP); - skylines_[DOWN] = Skyline (boxes, X_AXIS, DOWN); + SCM horizon_padding_scm = get_property ("skyline-horizontal-padding"); + Real horizon_padding = robust_scm2double (horizon_padding_scm, 0); + skylines_[UP] = Skyline (boxes, horizon_padding, X_AXIS, UP); + skylines_[DOWN] = Skyline (boxes, horizon_padding, X_AXIS, DOWN); } @@ -545,4 +535,5 @@ ADD_INTERFACE (System, "pure-Y-extent " "spaceable-staves " "skyline-distance " + "skyline-horizontal-padding " )