X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fspaceable-grob.cc;h=d19eb13a3c1ab64de95d663d7740b52dcfbff832;hb=d445cda01e4d86896f55fd1cf2ccbaba8cb7917a;hp=4149e48b323a704c01ab04133a0507a7c6692cfe;hpb=9d1e56447d21a8a1cfbc751535183916efffe7a0;p=lilypond.git diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index 4149e48b32..d19eb13a3c 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -3,22 +3,23 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2005 Han-Wen Nienhuys + (c) 2000--2006 Han-Wen Nienhuys */ #include "spaceable-grob.hh" #include -#include #include "warn.hh" #include "spring.hh" -#include "group-interface.hh" +#include "pointer-group-interface.hh" +#include "grob.hh" +#include "paper-column.hh" SCM Spaceable_grob::get_minimum_distances (Grob *me) { - return me->get_property ("minimum-distances"); + return me->get_object ("minimum-distances"); } /*todo: merge code of spring & rod? @@ -29,12 +30,12 @@ Spaceable_grob::add_rod (Grob *me, Grob *p, Real d) // printf ("rod %lf\n", d); if (d < 0) return; - + if (isinf (d)) programming_error ("infinite rod"); SCM mins = get_minimum_distances (me); - SCM newdist = scm_make_real (d); + SCM newdist = scm_from_double (d); for (SCM s = mins; scm_is_pair (s); s = scm_cdr (s)) { SCM dist = scm_car (s); @@ -46,35 +47,39 @@ Spaceable_grob::add_rod (Grob *me, Grob *p, Real d) } } + if (Paper_column::get_rank (p) < Paper_column::get_rank (me)) + programming_error ("Adding reverse rod"); + mins = scm_cons (scm_cons (p->self_scm (), newdist), mins); - me->set_property ("minimum-distances", mins); + me->set_object ("minimum-distances", mins); } void -Spaceable_grob::add_spring (Grob *me, Grob *p, Real d, Real inverse_strength) +Spaceable_grob::add_spring (Grob *me, Grob *other, + Real distance, Real inverse_strength) { - if (d <= 0.0 || inverse_strength < 0.0) + if (distance <= 0.0 || inverse_strength < 0.0) { programming_error ("adding reverse spring, setting to unit"); - d = 1.0; + distance = 1.0; inverse_strength = 1.0; } - if (isinf (d) || isnan (d) + if (isinf (distance) || isnan (distance) || isnan (inverse_strength)) { /* strength == INF is possible. It means fixed distance. */ programming_error ("insane distance found"); - d = 1.0; + distance = 1.0; inverse_strength = 1.0; } #ifndef NDEBUG - SCM mins = me->get_property ("ideal-distances"); + SCM mins = me->get_object ("ideal-distances"); for (SCM s = mins; scm_is_pair (s); s = scm_cdr (s)) { Spring_smob *sp = unsmob_spring (scm_car (s)); - if (sp->other_ == p) + if (sp->other_ == other) { programming_error ("already have that spring"); return; @@ -84,22 +89,39 @@ Spaceable_grob::add_spring (Grob *me, Grob *p, Real d, Real inverse_strength) Spring_smob spring; spring.inverse_strength_ = inverse_strength; - spring.distance_ = d; - spring.other_ = p; + spring.distance_ = distance; + spring.other_ = other; - Group_interface::add_thing (me, ly_symbol2scm ("ideal-distances"), spring.smobbed_copy ()); + SCM ideal = me->get_object ("ideal-distances"); + ideal = scm_cons (spring.smobbed_copy (), ideal); + me->set_object ("ideal-distances", ideal); +} + +void +Spaceable_grob::get_spring (Grob *me, Grob *other, Real *dist, Real *inv_strength) +{ + for (SCM s = me->get_object ("ideal-distances"); + scm_is_pair (s); s = scm_cdr (s)) + { + Spring_smob *spring = unsmob_spring (scm_car (s)); + if (spring && spring->other_ == other) + { + *dist = spring->distance_; + *inv_strength = spring->inverse_strength_; + } + } } void Spaceable_grob::remove_interface (Grob *me) { - me->set_property ("minimum-distances", SCM_EOL); - me->set_property ("spacing-wishes", SCM_EOL); - me->set_property ("ideal-distances", SCM_EOL); + me->set_object ("minimum-distances", SCM_EOL); + me->set_object ("spacing-wishes", SCM_EOL); + me->set_object ("ideal-distances", SCM_EOL); } ADD_INTERFACE (Spaceable_grob, "spaceable-grob-interface", "A layout object that takes part in the spacing problem. ", "measure-length spacing-wishes penalty minimum-distances ideal-distances " - "allow-outside-line left-neighbors right-neighbors"); + "keep-inside-line left-neighbors right-neighbors");