2 paper-column.cc -- implement Paper_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.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-interface.hh"
18 #include "font-interface.hh"
19 #include "output-def.hh"
20 #include "pointer-group-interface.hh"
21 #include "grob-array.hh"
24 Paper_column::clone (int count) const
26 return new Paper_column (*this, count);
30 Paper_column::do_break_processing ()
32 Spaceable_grob::remove_interface (this);
33 Item::do_break_processing ();
37 Paper_column::get_rank (Grob *me)
39 return dynamic_cast<Paper_column *> (me)->rank_;
43 Paper_column::get_system () const
49 Paper_column::set_system (System *s)
55 Paper_column::get_column () const
57 return (Paper_column *) (this);
60 Paper_column::Paper_column (SCM l, Object_key const *key)
61 : Item (l, key) // guh.?
67 Paper_column::Paper_column (Paper_column const &src, int count)
75 Paper_column::compare (Grob * const &a,
78 return sign (dynamic_cast<Paper_column*> (a)->rank_
79 - dynamic_cast<Paper_column*> (b)->rank_);
83 Paper_column::less_than (Grob *const &a,
86 return dynamic_cast<Paper_column*> (a)->rank_ < dynamic_cast<Paper_column*> (b)->rank_;
90 Paper_column::when_mom (Grob *me)
92 SCM m = me->get_property ("when");
93 if (Moment *when = unsmob_moment (m))
99 Paper_column::is_musical (Grob *me)
101 SCM m = me->get_property ("shortest-starter-duration");
103 if (unsmob_moment (m))
104 s = *unsmob_moment (m);
105 return s != Moment (0);
109 Paper_column::is_used (Grob *me)
111 extract_grob_set (me, "elements", elts);
115 extract_grob_set (me, "bounded-by-me", bbm);
119 if (Paper_column::is_breakable (me))
122 if (to_boolean (me->get_property ("used")))
128 Paper_column::is_breakable (Grob *me)
130 return scm_is_symbol (me->get_property ("line-break-permission"));
134 Print a vertical line and the rank number, to aid debugging.
137 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
139 Paper_column::print (SCM p)
141 Grob *me = unsmob_grob (p);
143 string r = to_string (Paper_column::get_rank (me));
145 Moment *mom = unsmob_moment (me->get_property ("when"));
146 string when = mom ? mom->to_string () : "?/?";
148 SCM properties = Font_interface::text_font_alist_chain (me);
150 SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (),
152 scm_makfrom0str (r.c_str ()));
153 SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (),
155 scm_makfrom0str (when.c_str ()));
156 Stencil t = *unsmob_stencil (scm_mol);
157 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
158 t.align_to (X_AXIS, CENTER);
159 t.align_to (Y_AXIS, DOWN);
161 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
165 return t.smobbed_copy ();
169 This is all too hairy. We use bounded-by-me to make sure that some
170 columns are kept "alive". Unfortunately, when spanners are suicided,
171 this falls apart again, because suicided spanners are still in
174 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
176 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
178 Paper_column::before_line_breaking (SCM grob)
180 Grob *me = unsmob_grob (grob);
182 SCM bbm = me->get_object ("bounded-by-me");
183 Grob_array *ga = unsmob_grob_array (bbm);
185 return SCM_UNSPECIFIED;
187 vector<Grob*> &array (ga->array_reference ());
189 for (vsize i = array.size (); i--;)
193 if (!g || !g->is_live ())
194 /* UGH . potentially quadratic. */
195 array.erase (array.begin () + i);
198 return SCM_UNSPECIFIED;
202 ADD_INTERFACE (Paper_column,
204 "paper-column-interface",
205 "@code{Paper_column} objects form the top-most X-parents for items."
206 " The are two types of columns: musical columns, where are attached to, and "
207 " non-musical columns, where bar-lines, clefs etc. are attached to. "
208 " The spacing engine determines the X-positions of these objects."
212 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
213 " line-breaking, and columns are not renumbered after line breaking.\n"
214 " Since many columns go unused, you should only use the rank field to\n"
215 " get ordering information. Two adjacent columns may have\n"
216 " non-adjacent numbers.\n",
223 "line-break-system-details "
224 "line-break-penalty "
225 "line-break-permission "
226 "page-break-penalty "
227 "page-break-permission "
229 "page-turn-permission "
230 "shortest-playing-duration "
231 "shortest-starter-duration "