X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspaceable-grob.cc;h=99b87cd24264bd526b7ed3548ffbbe13690ab0cc;hb=c7be17948fb3aec4e57e21027a0eb98f05be43bb;hp=cbef93ce5ab860b3f727f57737978b53073e9d89;hpb=d9b43b93f2c885409bafdb157138158f65cc49aa;p=lilypond.git diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index cbef93ce5a..99b87cd242 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -3,18 +3,23 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2002 Han-Wen Nienhuys + (c) 2000--2004 Han-Wen Nienhuys */ #include "spaceable-grob.hh" -#include "grob.hh" + +#include +#include + #include "warn.hh" +#include "spring.hh" +#include "group-interface.hh" SCM Spaceable_grob::get_minimum_distances (Grob*me) { - return me->get_grob_property ("minimum-distances"); + return me->get_property ("minimum-distances"); } /*todo: merge code of spring & rod? @@ -22,56 +27,83 @@ Spaceable_grob::get_minimum_distances (Grob*me) void Spaceable_grob::add_rod (Grob *me , Grob * p, Real d) { + // printf ("rod %lf\n", d); + + SCM mins = get_minimum_distances (me); - SCM newdist = gh_double2scm (d); - for (SCM s = mins; gh_pair_p (s); s = ly_cdr (s)) + SCM newdist = scm_make_real (d); + for (SCM s = mins; scm_is_pair (s); s = scm_cdr (s)) { - SCM dist = ly_car (s); - if (ly_car (dist) == p->self_scm ()) + SCM dist = scm_car (s); + if (scm_car (dist) == p->self_scm ()) { - gh_set_cdr_x (dist, scm_max (ly_cdr (dist), + scm_set_cdr_x (dist, scm_max (scm_cdr (dist), newdist)); return ; } } - mins = gh_cons (gh_cons (p->self_scm (), newdist), mins); - me->set_grob_property ("minimum-distances", mins); + mins = scm_cons (scm_cons (p->self_scm (), newdist), mins); + me->set_property ("minimum-distances", mins); } void Spaceable_grob::add_spring (Grob*me, Grob * p, Real d, Real strength) { - SCM mins = me->get_grob_property ("ideal-distances"); - + // printf ("dist %lf, str %lf\n", d, strength); + if (d <= 0.0 || strength <= 0.0) + { + programming_error ("Adding reverse spring! Setting to unit spring"); + d = 1.0; + strength = 1.0; + } - SCM newdist= gh_double2scm (d); - for (SCM s = mins; gh_pair_p (s); s = ly_cdr (s)) + if (isinf (d) || isnan(d) + || isnan (strength)) { - SCM dist = ly_car (s); - if (ly_car (dist) == p->self_scm ()) + /* + strength == INF is possible. It means fixed distance. + */ + programming_error ("Insane distance found."); + d = 1.0; + strength = 1.0; + } + +#ifndef NDEBUG + SCM mins = me->get_property ("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) { programming_error ("already have that spring"); return ; } } - SCM newstrength= gh_double2scm (strength); +#endif + + Spring_smob spring; + spring.strength_ = strength; + spring.distance_ = d; + spring.other_ = p; - mins = gh_cons (gh_cons (p->self_scm (), gh_cons (newdist, newstrength)), mins); - me->set_grob_property ("ideal-distances", mins); + Group_interface::add_thing (me, ly_symbol2scm ("ideal-distances"), spring.smobbed_copy ()); } void Spaceable_grob::remove_interface (Grob*me) { - me->remove_grob_property ("minimum-distances"); - me->remove_grob_property ("ideal-distances"); + me->set_property ("minimum-distances" , SCM_EOL); + me->set_property ("spacing-wishes", SCM_EOL); + me->set_property ("ideal-distances", SCM_EOL); } -void -Spaceable_grob::set_interface (Grob*me) -{ - me->set_interface (ly_symbol2scm ("spaceable-grob-interface")); -} + +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"); +