X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fspaceable-grob.cc;h=0153e6d804009f4972e772d921df7b87bfb5a960;hb=5bbfc22fce036b9b69df5e420de93e11da23c05e;hp=17d15ba94b66664f2bb3bf1641adab698ae67d47;hpb=58bcc84c9480dae1b21bc24d8396b91fe19e0131;p=lilypond.git diff --git a/lily/spaceable-grob.cc b/lily/spaceable-grob.cc index 17d15ba94b..0153e6d804 100644 --- a/lily/spaceable-grob.cc +++ b/lily/spaceable-grob.cc @@ -1,24 +1,37 @@ /* - 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--2014 Han-Wen Nienhuys - (c) 2000--2005 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" #include -#include #include "warn.hh" #include "spring.hh" -#include "group-interface.hh" +#include "pointer-group-interface.hh" +#include "grob.hh" +#include "paper-column.hh" +#include "international.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? @@ -27,78 +40,74 @@ void 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); if (scm_car (dist) == p->self_scm ()) - { - scm_set_cdr_x (dist, scm_max (scm_cdr (dist), - newdist)); - return; - } + { + scm_set_cdr_x (dist, scm_max (scm_cdr (dist), + newdist)); + return; + } } + 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 strength) +Spaceable_grob::add_spring (Grob *me, Grob *other, Spring sp) { - // 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 ideal = me->get_object ("ideal-distances"); - if (isinf (d) || isnan (d) - || isnan (strength)) - { - /* - strength == INF is possible. It means fixed distance. - */ - programming_error ("Insane distance found."); - d = 1.0; - strength = 1.0; - } + ideal = scm_cons (scm_cons (sp.smobbed_copy (), other->self_scm ()), ideal); + me->set_object ("ideal-distances", ideal); +} -#ifndef NDEBUG - SCM mins = me->get_property ("ideal-distances"); - for (SCM s = mins; scm_is_pair (s); s = scm_cdr (s)) +Spring +Spaceable_grob::get_spring (Grob *this_col, Grob *next_col) +{ + 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->other_ == p) - { - programming_error ("already have that spring"); - return; - } + if (scm_is_pair (scm_car (s)) + && Grob::unsmob (scm_cdar (s)) == next_col + && Spring::unsmob (scm_caar (s))) + spring = Spring::unsmob (scm_caar (s)); } -#endif - Spring_smob spring; - spring.strength_ = strength; - spring.distance_ = d; - spring.other_ = p; + if (!spring) + programming_error (to_string ("No spring between column %d and next one", + Paper_column::get_rank (this_col))); - Group_interface::add_thing (me, ly_symbol2scm ("ideal-distances"), spring.smobbed_copy ()); -} - -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); + return spring ? *spring : Spring (); } -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"); +ADD_INTERFACE (Spaceable_grob, + "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 " + );