X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-column.cc;h=af2469199941743b690c33b9f83a375518e11e42;hb=402045837e7134cdf90d1fcf31768c62227a4936;hp=7296041000ced4c25196c42e339e4ed63d30d300;hpb=d9b43b93f2c885409bafdb157138158f65cc49aa;p=lilypond.git diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 7296041000..af24691999 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -3,34 +3,42 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2004 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 "stencil.hh" #include "text-item.hh" #include "lookup.hh" #include "font-interface.hh" +#include "paper-def.hh" -/* - Paper_columns form the top-most item parent. (The Paper_columns X - parent is Line_of_score, which is a spanner.) - 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. - - */ +ADD_INTERFACE (Paper_column, "paper-column-interface", + " Paper_columns form the top-most item parent. (The Paper_columns X\n" +" parent is System, which is a spanner.)\n" +"\n" +" Paper_columns form the units for the spacing engine. 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" +"\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" +"\n" +" Don't be confused by right-items: each spacing wish can also contain\n" +" a number of items, with which a spacing constraint may be kept. It's\n" +" a little baroque, but it might come in handy later on?\n" +"\n", + "between-cols between-system-string when bounded-by-me shortest-playing-duration shortest-starter-duration"); + void Paper_column::do_break_processing () @@ -39,20 +47,21 @@ Paper_column::do_break_processing () Item::do_break_processing (); } + int -Paper_column::rank_i (Grob*me) +Paper_column::get_rank (Grob*me) { - return dynamic_cast (me)->rank_i_; + return dynamic_cast (me)->rank_; } -Line_of_score* -Paper_column::line_l () const +System* +Paper_column::get_system () const { - return line_l_; + return system_; } Paper_column* -Paper_column::column_l () const +Paper_column::get_column () const { return (Paper_column*) (this); } @@ -60,12 +69,8 @@ Paper_column::column_l () const Paper_column::Paper_column (SCM l) : Item (l) // guh.? { - Axis_group_interface::set_interface (this); - Axis_group_interface::set_axes (this, X_AXIS, X_AXIS); - Spaceable_grob::set_interface (this); - - line_l_=0; - rank_i_ = -1; + system_=0; + rank_ = -1; } Moment @@ -81,7 +86,7 @@ Paper_column::when_mom (Grob*me) } bool -Paper_column::musical_b (Grob *me) +Paper_column::is_musical (Grob *me) { SCM m = me->get_grob_property ("shortest-starter-duration"); Moment s (0); @@ -90,12 +95,11 @@ Paper_column::musical_b (Grob *me) s = *unsmob_moment (m); } return s != Moment (0); - } bool -Paper_column::used_b (Grob*me) +Paper_column::is_used (Grob*me) { return gh_pair_p (me->get_grob_property ("elements")) || Item::breakable_b (me) || gh_pair_p (me->get_grob_property ("bounded-by-me")) @@ -106,24 +110,59 @@ Paper_column::used_b (Grob*me) Print a vertical line and the rank number, to aid debugging. */ -MAKE_SCHEME_CALLBACK(Paper_column,brew_molecule,1); +MAKE_SCHEME_CALLBACK(Paper_column,print,1); SCM -Paper_column::brew_molecule (SCM p) +Paper_column::print (SCM p) { Grob *me = unsmob_grob (p); - String r = to_str (Paper_column::rank_i (me)); + String r = to_string (Paper_column::get_rank (me)); SCM properties = Font_interface::font_alist_chain (me); - - Molecule t = Text_item::text2molecule (me, ly_str02scm (r.ch_C()), - properties); + + SCM scm_mol = Text_item::interpret_markup (me->get_paper ()->self_scm (), + properties, + scm_makfrom0str (r.to_str0 ())); + Stencil t = *unsmob_stencil (scm_mol); t.align_to (X_AXIS, CENTER); t.align_to (Y_AXIS, DOWN); - Molecule l = Lookup::filledbox (Box (Interval (-0.01, 0.01), + Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01), Interval (-2, -1))); - t.add_molecule (l); + t.add_stencil (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; +}