X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fseparating-group-spanner.cc;h=d112fa3621c56e1d070484b6b1443039a7d1087b;hb=8536db51578c1d3ba3da834e5a308c2790dd4f87;hp=2cc6c35999afcff6c25810850fd725c1edf9a9d4;hpb=634ad74db688a5305f001917453c5cd15305c539;p=lilypond.git diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index 2cc6c35999..d112fa3621 100644 --- a/lily/separating-group-spanner.cc +++ b/lily/separating-group-spanner.cc @@ -1,11 +1,10 @@ -/* +/* separating-group-spanner.cc -- implement Separating_group_spanner - + source file of the GNU LilyPond music typesetter - + (c) 1998--2005 Han-Wen Nienhuys - - */ +*/ #include "separating-group-spanner.hh" @@ -13,10 +12,13 @@ #include "paper-column.hh" #include "output-def.hh" #include "dimensions.hh" -#include "group-interface.hh" +#include "pointer-group-interface.hh" void -Separating_group_spanner::find_rods (Item * r, SCM next, Real padding) +Separating_group_spanner::find_rods (Item *r, + Link_array const &separators, + int idx, + Real padding) { /* @@ -25,13 +27,9 @@ Separating_group_spanner::find_rods (Item * r, SCM next, Real padding) most cases, the interesting L will just be the first entry of NEXT, making it linear in most of the cases. */ - if (Separation_item::width (r).is_empty ()) - return; - - - for (; scm_is_pair (next); next = scm_cdr (next)) + for (; idx >= 0; idx--) { - Item *l = dynamic_cast (unsmob_grob (scm_car ( next))); + Item *l = dynamic_cast (separators[idx]); Item *lb = l->find_prebroken_piece (RIGHT); if (lb) @@ -42,8 +40,8 @@ Separating_group_spanner::find_rods (Item * r, SCM next, Real padding) { Rod rod; - rod.item_l_drul_[LEFT] = lb; - rod.item_l_drul_[RIGHT] = r; + rod.item_drul_[LEFT] = lb; + rod.item_drul_[RIGHT] = r; rod.distance_ = li[RIGHT] - ri[LEFT] + padding; rod.add_to_cols (); @@ -56,12 +54,13 @@ Separating_group_spanner::find_rods (Item * r, SCM next, Real padding) { Rod rod; - rod.item_l_drul_[LEFT] = l; - rod.item_l_drul_[RIGHT]= r; + rod.item_drul_[LEFT] = l; + rod.item_drul_[RIGHT] = r; rod.distance_ = li[RIGHT] - ri[LEFT] + padding; - - rod.add_to_cols (); + + if (rod.distance_ > 0.0) + rod.add_to_cols (); break; } @@ -69,7 +68,6 @@ Separating_group_spanner::find_rods (Item * r, SCM next, Real padding) this grob doesn't cause a constraint. We look further until we find one that does. */ - } } @@ -77,46 +75,42 @@ MAKE_SCHEME_CALLBACK (Separating_group_spanner, set_spacing_rods, 1); SCM Separating_group_spanner::set_spacing_rods (SCM smob) { - Grob*me = unsmob_grob (smob); + Grob *me = unsmob_grob (smob); /* Ugh: padding is added doubly, also for SeparationItem - */ + */ Real padding = robust_scm2double (me->get_property ("padding"), 0.1); - - for (SCM s = me->get_property ("elements"); scm_is_pair (s) && scm_is_pair (scm_cdr (s)); s = scm_cdr (s)) - { - /* - Order of elements is reversed! - */ - SCM elt = scm_car (s); - Item *r = unsmob_item (elt); + extract_grob_set (me, "elements", elts); + for (int i = elts.size (); + i-- > 1; ) + { + Item *r = dynamic_cast (elts[i]); if (!r) continue; + if (Separation_item::width (r).is_empty ()) + continue; + Item *rb - = dynamic_cast (r->find_prebroken_piece (LEFT)); - - find_rods (r, scm_cdr (s), padding); + = dynamic_cast (r->find_prebroken_piece (LEFT)); + + find_rods (r, elts, i - 1, padding); if (rb) - find_rods (rb, scm_cdr (s), padding); + find_rods (rb, elts, i - 1, padding); } - return SCM_UNSPECIFIED ; + return SCM_UNSPECIFIED; } void -Separating_group_spanner::add_spacing_unit (Grob* me , Item*i) +Separating_group_spanner::add_spacing_unit (Grob *me, Item *i) { Pointer_group_interface::add_grob (me, ly_symbol2scm ("elements"), i); me->add_dependency (i); } - - - - ADD_INTERFACE (Separating_group_spanner, "separation-spanner-interface", "A spanner that calculates spacing constraints (\"rods\") " "using the @code{separation-item-interface} grobs in @code{elements}.",