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::get_column () const
51 return (Paper_column *) (this);
54 Paper_column::Paper_column (SCM l, Object_key const *key)
55 : Item (l, key) // guh.?
61 Paper_column::Paper_column (Paper_column const &src, int count)
69 Paper_column::compare (Grob * const &a,
72 return sign (dynamic_cast<Paper_column*> (a)->rank_
73 - dynamic_cast<Paper_column*> (b)->rank_);
77 Paper_column::when_mom (Grob *me)
79 SCM m = me->get_property ("when");
80 if (Moment *when = unsmob_moment (m))
86 Paper_column::is_musical (Grob *me)
88 SCM m = me->get_property ("shortest-starter-duration");
90 if (unsmob_moment (m))
91 s = *unsmob_moment (m);
92 return s != Moment (0);
96 Paper_column::is_used (Grob *me)
98 extract_grob_set (me, "elements", elts);
102 extract_grob_set (me, "bounded-by-me", bbm);
106 if (Paper_column::is_breakable (me))
109 if (to_boolean (me->get_property ("used")))
115 Paper_column::is_breakable (Grob *me)
117 return scm_is_symbol (me->get_property ("line-break-permission"));
121 Print a vertical line and the rank number, to aid debugging.
124 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
126 Paper_column::print (SCM p)
128 Grob *me = unsmob_grob (p);
130 string r = to_string (Paper_column::get_rank (me));
132 Moment *mom = unsmob_moment (me->get_property ("when"));
133 string when = mom ? mom->to_string () : "?/?";
135 SCM properties = Font_interface::text_font_alist_chain (me);
137 SCM scm_mol = Text_interface::interpret_markup (me->layout ()->self_scm (),
139 scm_makfrom0str (r.c_str ()));
140 SCM when_mol = Text_interface::interpret_markup (me->layout ()->self_scm (),
142 scm_makfrom0str (when.c_str ()));
143 Stencil t = *unsmob_stencil (scm_mol);
144 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
145 t.align_to (X_AXIS, CENTER);
146 t.align_to (Y_AXIS, DOWN);
148 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
152 return t.smobbed_copy ();
156 This is all too hairy. We use bounded-by-me to make sure that some
157 columns are kept "alive". Unfortunately, when spanners are suicided,
158 this falls apart again, because suicided spanners are still in
161 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
163 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
165 Paper_column::before_line_breaking (SCM grob)
167 Grob *me = unsmob_grob (grob);
169 SCM bbm = me->get_object ("bounded-by-me");
170 Grob_array *ga = unsmob_grob_array (bbm);
172 return SCM_UNSPECIFIED;
174 vector<Grob*> &array (ga->array_reference ());
176 for (vsize i = array.size (); i--;)
180 if (!g || !g->is_live ())
181 /* UGH . potentially quadratic. */
182 array.erase (array.begin () + i);
185 return SCM_UNSPECIFIED;
189 ADD_INTERFACE (Paper_column,
191 "paper-column-interface",
192 "@code{Paper_column} objects form the top-most X-parents for items."
193 " The are two types of columns: musical columns, where are attached to, and "
194 " non-musical columns, where bar-lines, clefs etc. are attached to. "
195 " The spacing engine determines the X-positions of these objects."
199 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
200 " line-breaking, and columns are not renumbered after line breaking.\n"
201 " Since many columns go unused, you should only use the rank field to\n"
202 " get ordering information. Two adjacent columns may have\n"
203 " non-adjacent numbers.\n",
209 "line-break-system-details "
210 "line-break-penalty "
211 "line-break-permission "
212 "page-break-penalty "
213 "page-break-permission "
215 "page-turn-permission "
216 "shortest-playing-duration "
217 "shortest-starter-duration "