X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=525dca36b89fca5d7ee639d354f3d774b8d956fd;hb=68d7330f72a14a8df49c49ed1566179248096092;hp=14f1340464e2f2c334e437b18d8132350720d73d;hpb=cd1c15ac06a3b427e6b4d22061939092751e4a1c;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 14f1340464..525dca36b8 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -3,156 +3,210 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2000 Han-Wen Nienhuys + (c) 1997--2006 Han-Wen Nienhuys */ -#include "moment.hh" + #include "paper-column.hh" + +#include "moment.hh" #include "paper-score.hh" -#include "debug.hh" +#include "warn.hh" #include "axis-group-interface.hh" +#include "spaceable-grob.hh" +#include "text-interface.hh" +#include "lookup.hh" +#include "font-interface.hh" +#include "output-def.hh" +#include "pointer-group-interface.hh" +#include "grob-array.hh" + +Grob * +Paper_column::clone (int count) const +{ + return new Paper_column (*this, count); +} void -Paper_column::add_rod (Paper_column * p, Real d) +Paper_column::do_break_processing () { - Direction dir = Direction (sign (p->rank_i () - rank_i ())); - - if (!dir) - { - programming_error ("Must set minimum distance between differing columns."); - return; - } - - for (int i=0; i < minimal_dists_arr_drul_[dir].size (); i++) - { - Column_rod &rod = minimal_dists_arr_drul_[dir][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_arr_drul_[dir].push (cr); + Spaceable_grob::remove_interface (this); + Item::do_break_processing (); } -void -Paper_column::add_spring (Paper_column * p, Real d, Real s) +int +Paper_column::get_rank (Grob *me) { - Direction dir = Direction (sign (p->rank_i () - rank_i ())); - - if (!dir) - { - warning (_ ("Must set spring between differing columns")); - return; - } - - for (int i=0; i < spring_arr_drul_[dir].size (); i++) - { - Column_spring &spring = spring_arr_drul_[dir][i]; - if (spring.other_l_ == p) - { - spring.distance_f_ = spring.distance_f_ >? d; - return ; - } - } + return dynamic_cast (me)->rank_; +} - Column_spring cr; - cr.distance_f_ = d; - cr.strength_f_ = s; - cr.other_l_ = p; +System * +Paper_column::get_system () const +{ + return system_; +} - spring_arr_drul_[dir].push (cr); +Paper_column * +Paper_column::get_column () const +{ + return (Paper_column *) (this); } -int -Paper_column::rank_i() const +Paper_column::Paper_column (SCM l, Object_key const *key) + : Item (l, key) // guh.? { - return rank_i_; + system_ = 0; + rank_ = -1; } -void -Paper_column::set_rank (int i) +Paper_column::Paper_column (Paper_column const &src, int count) + : Item (src, count) { - rank_i_ = i; + system_ = 0; + rank_ = src.rank_; } -void -Paper_column::do_print() const +Moment +Paper_column::when_mom (Grob *me) { -#ifndef NPRINT - DEBUG_OUT << "rank: " << rank_i_ << '\n'; - Direction d = LEFT; - do - { - for (int i=0; i < minimal_dists_arr_drul_[d].size (); i++) - { - minimal_dists_arr_drul_[d][i].print (); - } - for (int i=0; i < spring_arr_drul_[d].size (); i++) - { - spring_arr_drul_[d][i].print (); - } - - } - while ((flip (&d))!=LEFT); - Item::do_print (); -#endif + SCM m = me->get_property ("when"); + if (Moment *when = unsmob_moment (m)) + return *when; + return Moment (0); } -Line_of_score* -Paper_column::line_l() const +bool +Paper_column::is_musical (Grob *me) { - return line_l_; + SCM m = me->get_property ("shortest-starter-duration"); + Moment s (0); + if (unsmob_moment (m)) + s = *unsmob_moment (m); + return s != Moment (0); } +bool +Paper_column::is_used (Grob *me) +{ + extract_grob_set (me, "elements", elts); + if (elts.size ()) + return true; + extract_grob_set (me, "bounded-by-me", bbm); + if (bbm.size ()) + return true; + + if (Paper_column::is_breakable (me)) + return true; + if (to_boolean (me->get_property ("used"))) + return true; + return false; +} -Paper_column* -Paper_column::column_l () const +bool +Paper_column::is_breakable (Grob *me) { - return (Paper_column*)(this); + return scm_is_symbol (me->get_property ("line-break-permission")); } +/* + Print a vertical line and the rank number, to aid debugging. +*/ +MAKE_SCHEME_CALLBACK (Paper_column, print, 1); +SCM +Paper_column::print (SCM p) +{ + Grob *me = unsmob_grob (p); + string r = to_string (Paper_column::get_rank (me)); -Paper_column::Paper_column (Moment w) -{ - SCM when = (new Moment (w))->smobify_self (); - scm_unprotect_object (when); - set_elt_property ("when", when); - - axis_group (this).set_axes (X_AXIS, X_AXIS); + Moment *mom = unsmob_moment (me->get_property ("when")); + string when = mom ? mom->to_string () : "?/?"; - line_l_=0; - rank_i_ = -1; -} + SCM properties = Font_interface::text_font_alist_chain (me); -Moment -Paper_column::when_mom () const -{ - SCM m = get_elt_property ("when"); - Moment s (0); - if (SMOB_IS_TYPE_B(Moment, m)) - { - s = *SMOB_TO_TYPE (Moment,m); - } - return s; + SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), + properties, + scm_makfrom0str (r.c_str ())); + SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (), + properties, + scm_makfrom0str (when.c_str ())); + Stencil t = *unsmob_stencil (scm_mol); + t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1); + t.align_to (X_AXIS, CENTER); + t.align_to (Y_AXIS, DOWN); + + Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01), + Interval (-2, -1))); + + t.add_stencil (l); + return t.smobbed_copy (); } - -bool -Paper_column::musical_b () const + +/* + 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, because suicided spanners are still in + bounded-by-me + + 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) { - SCM m = get_elt_property ("shortest-starter-duration"); - Moment s (0); - if (SMOB_IS_TYPE_B(Moment, m)) + Grob *me = unsmob_grob (grob); + + SCM bbm = me->get_object ("bounded-by-me"); + Grob_array *ga = unsmob_grob_array (bbm); + if (!ga) + return SCM_UNSPECIFIED; + + vector &array (ga->array_reference ()); + + for (vsize i = array.size (); i--;) { - s = *SMOB_TO_TYPE (Moment,m); + Grob *g = array[i]; + + if (!g || !g->is_live ()) + /* UGH . potentially quadratic. */ + array.erase (array.begin () + i); } - return s != Moment(0); + + return SCM_UNSPECIFIED; } + + +ADD_INTERFACE (Paper_column, + + "paper-column-interface", + "@code{Paper_column} objects form the top-most X-parents for items." + " The are two types of columns: musical columns, where are attached to, and " + " non-musical columns, where bar-lines, clefs etc. are attached to. " + " The spacing engine determines the X-positions of these objects." + + "\n\n" + "They are\n" + " numbered, the first (leftmost) is column 0. Numbering happens before\n" + " line-breaking, and columns are not renumbered after line breaking.\n" + " Since many columns go unused, you should only use the rank field to\n" + " get ordering information. Two adjacent columns may have\n" + " non-adjacent numbers.\n", + + + /* properties */ + "between-cols " + "bounded-by-me " + "line-break-system-details " + "line-break-penalty " + "line-break-permission " + "page-break-penalty " + "page-break-permission " + "page-turn-penalty " + "page-turn-permission " + "shortest-playing-duration " + "shortest-starter-duration " + "used " + "when "); +