X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fseparating-group-spanner.cc;h=5ef9038dfbc3859c1377da7368c658b4db08b855;hb=fa938d4b51ccb3c18e489b395838f2587b531ec2;hp=47bacd392fdf4cf06d7009f7ae991b11417f32f7;hpb=7e72a1e50e94a7f9738d62599de79fe7745f600c;p=lilypond.git diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc index 47bacd392f..5ef9038dfb 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--2006 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,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(; gh_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) @@ -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,59 +68,51 @@ 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_and_seqs,1); +MAKE_SCHEME_CALLBACK (Separating_group_spanner, set_spacing_rods, 1); SCM -Separating_group_spanner::set_spacing_rods_and_seqs (SCM smob) +Separating_group_spanner::set_spacing_rods (SCM smob) { - set_spacing_rods (smob); + Grob *me = unsmob_grob (smob); - return SCM_UNSPECIFIED; -} + /* + Ugh: padding is added doubly, also for SeparationItem + */ + Real padding = robust_scm2double (me->get_property ("padding"), 0.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); - Real padding = robust_scm2double (me->get_grob_property ("padding"), 0.1); - - for (SCM s = me->get_grob_property ("elements"); gh_pair_p (s) && gh_pair_p (ly_cdr (s)); s = ly_cdr (s)) + extract_grob_set (me, "elements", elts); + for (vsize i = elts.size (); i-- > 1;) { - /* - Order of elements is reversed! - */ - SCM elt = ly_car (s); - Item *r = unsmob_item (elt); - + 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", + "A spanner that calculates spacing constraints (\"rods\") " + "using the @code{separation-item-interface} grobs in @code{elements}.", - - - -ADD_INTERFACE (Separating_group_spanner,"separation-spanner-interface", - "Spanner that containing @code{separation-item-interface} grobs to calculate rods", - ""); + /* properties */ + "elements " + "padding");