X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fseparating-group-spanner.cc;h=f8975cd5158e5eb62be38f642899c8d3972cc220;hb=f9214bac21e9926dc3248416f58190c98c4167a9;hp=0ca1a16471a3d679943b223c6057c88aeea07458;hpb=ba858880848d6aca1de4401d185860eb2017a01c;p=lilypond.git diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index 0ca1a16471..f8975cd515 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--2007 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, + vector const &separators, + vsize idx, + Real padding) { /* @@ -24,99 +27,68 @@ 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 (; ly_c_pair_p (next); next = ly_cdr (next)) + for (; idx != VPOS; 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) { - Interval li (Separation_item::width (lb)); - Interval ri (Separation_item::conditional_width (r, lb)); - if (!li.is_empty () && !ri.is_empty ()) - { - Rod rod; - - rod.item_l_drul_[LEFT] = lb; - rod.item_l_drul_[RIGHT] = r; - - rod.distance_ = li[RIGHT] - ri[LEFT] + padding; - rod.add_to_cols (); - } + Separation_item::set_distance (Drul_array (lb, r), padding); } - Interval li (Separation_item::width (l)); - Interval ri (Separation_item::conditional_width (r, l)); - if (!li.is_empty () && !ri.is_empty ()) - { - Rod rod; - - rod.item_l_drul_[LEFT] =l; - rod.item_l_drul_[RIGHT]=r; - - rod.distance_ = li[RIGHT] - ri[LEFT] + padding; - - rod.add_to_cols (); - break; - } + if (Separation_item::set_distance (Drul_array (l, r), padding)) + break; /* 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"); ly_c_pair_p (s) && ly_c_pair_p (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 (vsize 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); + Pointer_group_interface::add_unordered_grob (me, ly_symbol2scm ("elements"), i); } - - - - -ADD_INTERFACE (Separating_group_spanner,"separation-spanner-interface", +ADD_INTERFACE (Separating_group_spanner, "A spanner that calculates spacing constraints (\"rods\") " "using the @code{separation-item-interface} grobs in @code{elements}.", - "elements padding"); + + /* properties */ + "elements " + "padding ");