X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspaceable-grob.cc;h=c6ed9120396c3e9550edc8b4088f7bc081606aa3;hb=97a0169312a260933246ab224e4f8b0969871dd5;hp=d2326b6afb4adc8646850e9706b2b91421dc64af;hpb=e42585017a01fd02f6353b994cf0c87b03a7bb2e;p=lilypond.git diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index d2326b6afb..c6ed912039 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -1,9 +1,20 @@ /* - spaceable-grob.cc -- implement Spaceable_grob + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 2000--2015 Han-Wen Nienhuys - (c) 2000--2006 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ #include "spaceable-grob.hh" @@ -40,12 +51,12 @@ Spaceable_grob::add_rod (Grob *me, Grob *p, Real d) for (SCM s = mins; scm_is_pair (s); s = scm_cdr (s)) { SCM dist = scm_car (s); - if (scm_car (dist) == p->self_scm ()) - { - scm_set_cdr_x (dist, scm_max (scm_cdr (dist), - newdist)); - return; - } + if (scm_is_eq (scm_car (dist), p->self_scm ())) + { + scm_set_cdr_x (dist, scm_max (scm_cdr (dist), + newdist)); + return; + } } if (Paper_column::get_rank (p) < Paper_column::get_rank (me)) @@ -56,86 +67,47 @@ 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 *this_col, Grob *next_col, Real *dist, Real *inv_strength) +Spring +Spaceable_grob::get_spring (Grob *this_col, Grob *next_col) { - Spring_smob *spring = 0; + Spring *spring = 0; for (SCM s = this_col->get_object ("ideal-distances"); !spring && scm_is_pair (s); s = scm_cdr (s)) { - Spring_smob *sp = unsmob_spring (scm_car (s)); - - if (sp && sp->other_ == next_col) - spring = sp; + if (scm_is_pair (scm_car (s)) + && unsmob (scm_cdar (s)) == next_col + && unsmob (scm_caar (s))) + spring = unsmob (scm_caar (s)); } if (!spring) - programming_error (_f ("No spring between column %d and next one", - Paper_column::get_rank (this_col))); + programming_error (to_string ("No spring between column %d and next one", + Paper_column::get_rank (this_col))); - *dist = (spring) ? spring->distance_ : 5.0; - *inv_strength = (spring) ? spring->inverse_strength_ : 1.0; + return spring ? *spring : Spring (); } - - ADD_INTERFACE (Spaceable_grob, - "A layout object that takes part in the spacing problem. ", - - - /* properties */ - "allow-loose-spacing " - "ideal-distances " - "keep-inside-line " - "left-neighbors " - "measure-length " - "minimum-distances " - "right-neighbors " - "spacing-wishes " - - ); + "A layout object that takes part in the spacing problem.", + + /* properties */ + "allow-loose-spacing " + "ideal-distances " + "keep-inside-line " + "left-neighbor " + "measure-length " + "minimum-distances " + "right-neighbor " + "spacing-wishes " + );