2 paper-column.cc -- implement Paper_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "paper-column.hh"
12 #include "paper-score.hh"
14 #include "axis-group-interface.hh"
15 #include "spaceable-grob.hh"
16 #include "text-item.hh"
18 #include "font-interface.hh"
19 #include "output-def.hh"
22 Paper_column::clone (int count) const
24 return new Paper_column (*this, count);
28 ADD_INTERFACE (Paper_column, "paper-column-interface",
29 "@code{Paper_column} objects form the top-most X-parents for items. "
30 " The are two types of columns: musical columns, where are attached to, and "
31 " non-musical columns, where bar-lines, clefs etc. are attached to. "
32 " The spacing engine determines the X-positions of these objects."
35 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
36 " line-breaking, and columns are not renumbered after line breaking.\n"
37 " Since many columns go unused, you should only use the rank field to\n"
38 " get ordering information. Two adjacent columns may have\n"
39 " non-adjacent numbers.\n"
42 "between-cols when bounded-by-me "
43 "page-penalty shortest-playing-duration shortest-starter-duration");
46 Paper_column::do_break_processing ()
48 Spaceable_grob::remove_interface (this);
49 Item::do_break_processing ();
54 Paper_column::get_rank (Grob*me)
56 return dynamic_cast<Paper_column*> (me)->rank_;
60 Paper_column::get_system () const
66 Paper_column::get_column () const
68 return (Paper_column*) (this);
71 Paper_column::Paper_column (SCM l, Object_key const*key)
72 : Item (l, key) // guh.?
79 Paper_column::Paper_column (Paper_column const& src, int count)
88 Paper_column::when_mom (Grob *me)
90 SCM m = me->get_property ("when");
91 if (Moment *when = unsmob_moment (m))
97 Paper_column::is_musical (Grob *me)
99 SCM m = me->get_property ("shortest-starter-duration");
101 if (unsmob_moment (m))
103 s = *unsmob_moment (m);
105 return s != Moment (0);
110 Paper_column::is_used (Grob*me)
112 return scm_is_pair (me->get_property ("elements")) || Item::is_breakable (me)
113 || scm_is_pair (me->get_property ("bounded-by-me"))
118 Print a vertical line and the rank number, to aid debugging.
121 MAKE_SCHEME_CALLBACK (Paper_column,print,1);
123 Paper_column::print (SCM p)
125 Grob *me = unsmob_grob (p);
127 String r = to_string (Paper_column::get_rank (me));
128 SCM properties = Font_interface::text_font_alist_chain (me);
130 SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
132 scm_makfrom0str (r.to_str0 ()));
133 Stencil t = *unsmob_stencil (scm_mol);
134 t.align_to (X_AXIS, CENTER);
135 t.align_to (Y_AXIS, DOWN);
137 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
141 return t.smobbed_copy ();
145 This is all too hairy. We use bounded-by-me to make sure that some
146 columns are kept "alive". Unfortunately, when spanners are suicided,
147 this falls apart again. (sigh.)
149 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
151 MAKE_SCHEME_CALLBACK (Paper_column,before_line_breaking,1);
153 Paper_column::before_line_breaking (SCM grob)
155 Grob *me = unsmob_grob (grob);
157 SCM c = me->get_property ("bounded-by-me");
160 while (scm_is_pair (*ptrptr))
162 Grob * g = unsmob_grob (scm_car (*ptrptr));
164 if (!g || !g->is_live ())
166 *ptrptr = scm_cdr (*ptrptr);
170 ptrptr = SCM_CDRLOC (*ptrptr);
174 me->set_property ("bounded-by-me", c);
175 return SCM_UNSPECIFIED;