X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fseparating-group-spanner.cc;h=d112fa3621c56e1d070484b6b1443039a7d1087b;hb=8536db51578c1d3ba3da834e5a308c2790dd4f87;hp=5ac17e5b1717218cbf0efee58ba1684ccb41aab0;hpb=28976d28a04cfb9abe97af7214d7dce11f732604;p=lilypond.git diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index 5ac17e5b17..d112fa3621 100644 --- a/lily/separating-group-spanner.cc +++ b/lily/separating-group-spanner.cc @@ -1,21 +1,24 @@ -/* - separating-group-spanner.cc -- implement Separating_group_spanner - +/* + separating-group-spanner.cc -- implement Separating_group_spanner + source file of the GNU LilyPond music typesetter - - (c) 1998--2004 Han-Wen Nienhuys - - */ + + (c) 1998--2005 Han-Wen Nienhuys +*/ #include "separating-group-spanner.hh" + #include "separation-item.hh" #include "paper-column.hh" -#include "paper-def.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) { /* @@ -24,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 (; is_pair (next); next = ly_cdr (next)) + for (; idx >= 0; idx--) { - Item *l = dynamic_cast (unsmob_grob (ly_car ( next))); + Item *l = dynamic_cast (separators[idx]); Item *lb = l->find_prebroken_piece (RIGHT); if (lb) @@ -41,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 (); @@ -55,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; } @@ -68,55 +68,50 @@ 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. */ - } } -MAKE_SCHEME_CALLBACK (Separating_group_spanner,set_spacing_rods,1); +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"); is_pair (s) && is_pair (ly_cdr (s)); s = ly_cdr (s)) - { - /* - Order of elements is reversed! - */ - SCM elt = ly_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, ly_cdr (s), padding); + = dynamic_cast (r->find_prebroken_piece (LEFT)); + + find_rods (r, elts, i - 1, padding); if (rb) - find_rods (rb, ly_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", +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}.", "elements padding");