X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=df02af8fa84494e0b6cd2c1ad49a6c1615590397;hb=bdfe0b360b4d864feff276f4efbf58101c90d6b3;hp=5ab553257f9e028413abaab825d2769ec8bfc6b5;hpb=b542997680bb2d95c3a03a77468b67e04d30685f;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 5ab553257f..df02af8fa8 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -3,87 +3,60 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2002 Han-Wen Nienhuys */ + #include "moment.hh" #include "paper-column.hh" #include "paper-score.hh" -#include "debug.hh" +#include "warn.hh" #include "axis-group-interface.hh" +#include "spaceable-grob.hh" +#include "molecule.hh" +#include "text-item.hh" +#include "lookup.hh" +#include "font-interface.hh" -void -Paper_column::add_rod (Paper_column * p, Real d) -{ - Direction dir = Direction (sign (p->rank_i () - rank_i ())); - - if (dir != RIGHT) - { - programming_error ("Must set minimum distance LTOR."); - return; - } - - for (int i=0; i < minimal_dists_.size (); i++) - { - Column_rod &rod = minimal_dists_[i]; - if (rod.other_l_ == p) - { - rod.distance_f_ = rod.distance_f_ >? d; - return ; - } - } - Column_rod cr; - cr.distance_f_ = d; - cr.other_l_ = p; - minimal_dists_.push (cr); -} -void -Paper_column::add_spring (Paper_column * p, Real d, Real s) -{ - Direction dir = Direction (sign (p->rank_i () - rank_i ())); - - if (dir != RIGHT) - { - programming_error ("Must set springs LTOR"); - return; - } - - for (int i=0; i < springs_.size (); i++) - { - Column_spring &spring = springs_[i]; - if (spring.other_l_ == p) - { - spring.distance_f_ = spring.distance_f_ >? d; - return ; - } - } - Column_spring cr; - cr.distance_f_ = d; - cr.strength_f_ = s; - cr.other_l_ = p; +ADD_INTERFACE (Paper_column, "paper-column-interface", + " Paper_columns form the top-most item parent. (The Paper_columns X + parent is System, which is a spanner.) - springs_.push (cr); -} + Paper_columns form the units for the spacing engine. They are + numbered, the first (leftmost) is column 0. Numbering happens before + line-breaking, and columns are not renumbered after line breaking. + + Since many columns go unused, you should only use the rank field to + get ordering information. Two adjacent columns may have + non-adjacent numbers. + + Don't be confused by right-items: each spacing wish can also contain + a number of items, with which a spacing constraint may be kept. It's + a little baroque, but it might come in handy later on? + +", + "between-cols between-system-string when bounded-by-me shortest-playing-duration shortest-starter-duration"); -int -Paper_column::rank_i() const -{ - return rank_i_; -} void -Paper_column::set_rank (int i) +Paper_column::do_break_processing () { - rank_i_ = i; + Spaceable_grob::remove_interface (this); + Item::do_break_processing (); } +int +Paper_column::rank_i (Grob*me) +{ + return dynamic_cast (me)->rank_i_; +} -Line_of_score* -Paper_column::line_l() const +System* +Paper_column::line_l () const { return line_l_; } @@ -91,50 +64,105 @@ Paper_column::line_l() const Paper_column* Paper_column::column_l () const { - return (Paper_column*)(this); + return (Paper_column*) (this); } -Paper_column::Paper_column (Moment w) - : Item (SCM_EOL) // guh.? +Paper_column::Paper_column (SCM l) + : Item (l) // guh.? { - SCM when = smobify (new Moment (w)); - set_elt_property ("when", when); - - Axis_group_interface (this).set_interface (); - Axis_group_interface (this).set_axes (X_AXIS, X_AXIS); - set_elt_pointer ("bounded-by-me", SCM_EOL); line_l_=0; rank_i_ = -1; } Moment -Paper_column::when_mom () const +Paper_column::when_mom (Grob*me) { - SCM m = get_elt_property ("when"); + SCM m = me->get_grob_property ("when"); Moment s (0); - if (SMOB_IS_TYPE_B(Moment, m)) + if (unsmob_moment (m)) { - s = *SMOB_TO_TYPE (Moment,m); + return *unsmob_moment (m); } return s; } - + bool -Paper_column::musical_b () const +Paper_column::musical_b (Grob *me) { - SCM m = get_elt_property ("shortest-starter-duration"); + SCM m = me->get_grob_property ("shortest-starter-duration"); Moment s (0); - if (SMOB_IS_TYPE_B(Moment, m)) + if (unsmob_moment (m)) { - s = *SMOB_TO_TYPE (Moment,m); + s = *unsmob_moment (m); } - return s != Moment(0); + return s != Moment (0); + } + bool -Paper_column::used_b ()const +Paper_column::used_b (Grob*me) { - return gh_pair_p (get_elt_pointer ("elements")) || breakable_b () - || gh_pair_p (get_elt_pointer ("bounded-by-me")) + return gh_pair_p (me->get_grob_property ("elements")) || Item::breakable_b (me) + || gh_pair_p (me->get_grob_property ("bounded-by-me")) ; } + +/* + Print a vertical line and the rank number, to aid debugging. + */ + +MAKE_SCHEME_CALLBACK(Paper_column,brew_molecule,1); +SCM +Paper_column::brew_molecule (SCM p) +{ + Grob *me = unsmob_grob (p); + + String r = to_str (Paper_column::rank_i (me)); + SCM properties = Font_interface::font_alist_chain (me); + + Molecule t = Text_item::text2molecule (me, ly_str02scm (r.ch_C()), + properties); + t.align_to (X_AXIS, CENTER); + t.align_to (Y_AXIS, DOWN); + + Molecule l = Lookup::filledbox (Box (Interval (-0.01, 0.01), + Interval (-2, -1))); + + t.add_molecule (l); + return t.smobbed_copy (); +} + +/* + This is all too hairy. We use bounded-by-me to make sure that some + columns are kept "alive". Unfortunately, when spanners are suicided, + this falls apart again. (sigh.) + + THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER. + */ +MAKE_SCHEME_CALLBACK(Paper_column,before_line_breaking,1); +SCM +Paper_column::before_line_breaking (SCM grob) +{ + Grob *me = unsmob_grob (grob); + + SCM c = me->get_grob_property ("bounded-by-me"); + SCM *ptrptr = &c; + + while (gh_pair_p (*ptrptr)) + { + Grob * g = unsmob_grob (gh_car (*ptrptr)); + + if (!g || !g->live ()) + { + *ptrptr = gh_cdr (*ptrptr); + } + else + { + ptrptr = SCM_CDRLOC (*ptrptr); + } + } + + me->set_grob_property ("bounded-by-me", c); + return SCM_UNSPECIFIED; +}