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 const *me)
39 return dynamic_cast<Paper_column const *> (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 Paper_column *pa = dynamic_cast<Paper_column*> (a);
87 Paper_column *pb = dynamic_cast<Paper_column*> (b);
89 return pa->rank_ < pb->rank_;
93 Paper_column::when_mom (Grob *me)
95 SCM m = me->get_property ("when");
96 if (Moment *when = unsmob_moment (m))
102 Paper_column::is_musical (Grob *me)
104 SCM m = me->get_property ("shortest-starter-duration");
106 if (unsmob_moment (m))
107 s = *unsmob_moment (m);
108 return s != Moment (0);
112 Paper_column::is_used (Grob *me)
114 extract_grob_set (me, "elements", elts);
118 extract_grob_set (me, "bounded-by-me", bbm);
122 if (Paper_column::is_breakable (me))
125 if (to_boolean (me->get_property ("used")))
131 Paper_column::is_breakable (Grob *me)
133 return scm_is_symbol (me->get_property ("line-break-permission"));
137 Print a vertical line and the rank number, to aid debugging.
140 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
142 Paper_column::print (SCM p)
144 Grob *me = unsmob_grob (p);
146 string r = to_string (Paper_column::get_rank (me));
148 Moment *mom = unsmob_moment (me->get_property ("when"));
149 string when = mom ? mom->to_string () : "?/?";
151 SCM properties = Font_interface::text_font_alist_chain (me);
153 SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (),
156 SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (),
158 ly_string2scm (when));
159 Stencil t = *unsmob_stencil (scm_mol);
160 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
161 t.align_to (X_AXIS, CENTER);
162 t.align_to (Y_AXIS, DOWN);
164 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
168 return t.smobbed_copy ();
172 This is all too hairy. We use bounded-by-me to make sure that some
173 columns are kept "alive". Unfortunately, when spanners are suicided,
174 this falls apart again, because suicided spanners are still in
177 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
179 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
181 Paper_column::before_line_breaking (SCM grob)
183 Grob *me = unsmob_grob (grob);
185 SCM bbm = me->get_object ("bounded-by-me");
186 Grob_array *ga = unsmob_grob_array (bbm);
188 return SCM_UNSPECIFIED;
190 vector<Grob*> &array (ga->array_reference ());
192 for (vsize i = array.size (); i--;)
196 if (!g || !g->is_live ())
197 /* UGH . potentially quadratic. */
198 array.erase (array.begin () + i);
201 return SCM_UNSPECIFIED;
205 ADD_INTERFACE (Paper_column,
206 "@code{Paper_column} objects form the top-most X-parents for items."
207 " The are two types of columns: musical columns, where are attached to, and "
208 " non-musical columns, where bar-lines, clefs etc. are attached to. "
209 " The spacing engine determines the X-positions of these objects."
213 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
214 " line-breaking, and columns are not renumbered after line breaking.\n"
215 " Since many columns go unused, you should only use the rank field to\n"
216 " get ordering information. Two adjacent columns may have\n"
217 " non-adjacent numbers.\n",
224 "line-break-system-details "
225 "line-break-penalty "
226 "line-break-permission "
227 "page-break-penalty "
228 "page-break-permission "
230 "page-turn-permission "
232 "shortest-playing-duration "
233 "shortest-starter-duration "