X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspaceable-grob.cc;h=2088284412eca98598941367477a85e3145fb8e2;hb=5b4b0d6e9a197e8f9eb085b7c2ad78b8be3e5cfc;hp=679c2bcb195651dc1954d371c59830d7d447b887;hpb=9e69cb84d6ee5b0a861cd97869b10e3bdf0c833c;p=lilypond.git diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index 679c2bcb19..2088284412 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000--2006 Han-Wen Nienhuys + (c) 2000--2008 Han-Wen Nienhuys */ #include "spaceable-grob.hh" @@ -15,6 +15,7 @@ #include "pointer-group-interface.hh" #include "grob.hh" #include "paper-column.hh" +#include "international.hh" SCM Spaceable_grob::get_minimum_distances (Grob *me) @@ -55,74 +56,40 @@ Spaceable_grob::add_rod (Grob *me, Grob *p, Real d) } void -Spaceable_grob::add_spring (Grob *me, Grob *other, - Real distance, Real inverse_strength) +Spaceable_grob::add_spring (Grob *me, Grob *other, Spring sp) { - if (distance <= 0.0 || inverse_strength < 0.0) - { - programming_error ("adding reverse spring, setting to unit"); - distance = 1.0; - inverse_strength = 1.0; - } - - if (isinf (distance) || isnan (distance) - || isnan (inverse_strength)) - { - /* strength == INF is possible. It means fixed distance. */ - programming_error ("insane distance found"); - distance = 1.0; - inverse_strength = 1.0; - } - -#ifndef NDEBUG - 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_ == other) - { - programming_error ("already have that spring"); - return; - } - } -#endif - - Spring_smob spring; - spring.inverse_strength_ = inverse_strength; - spring.distance_ = distance; - spring.other_ = other; - SCM ideal = me->get_object ("ideal-distances"); - ideal = scm_cons (spring.smobbed_copy (), ideal); + + ideal = scm_cons (scm_cons (sp.smobbed_copy (), other->self_scm ()), ideal); me->set_object ("ideal-distances", ideal); } -void -Spaceable_grob::get_spring (Grob *me, Grob *other, Real *dist, Real *inv_strength) +Spring +Spaceable_grob::get_spring (Grob *this_col, Grob *next_col) { - for (SCM s = me->get_object ("ideal-distances"); - scm_is_pair (s); s = scm_cdr (s)) + Spring *spring = 0; + + for (SCM s = this_col->get_object ("ideal-distances"); + !spring && 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_; - } + if (scm_is_pair (scm_car (s)) + && unsmob_grob (scm_cdar (s)) == next_col + && unsmob_spring (scm_caar (s))) + spring = unsmob_spring (scm_caar (s)); } -} -void -Spaceable_grob::remove_interface (Grob *me) -{ - me->set_object ("minimum-distances", SCM_EOL); - me->set_object ("spacing-wishes", SCM_EOL); - me->set_object ("ideal-distances", SCM_EOL); + if (!spring) + programming_error (_f ("No spring between column %d and next one", + Paper_column::get_rank (this_col))); + + return spring ? *spring : Spring (); } + + ADD_INTERFACE (Spaceable_grob, - "A layout object that takes part in the spacing problem. ", - + "A layout object that takes part in the spacing problem.", /* properties */ "allow-loose-spacing " @@ -132,5 +99,6 @@ ADD_INTERFACE (Spaceable_grob, "measure-length " "minimum-distances " "right-neighbors " - "spacing-wishes"); + "spacing-wishes " + );