2 paper-column.cc -- implement Paper_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2005 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-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);
29 ADD_INTERFACE (Paper_column, "paper-column-interface",
30 "@code{Paper_column} objects form the top-most X-parents for items."
31 " The are two types of columns: musical columns, where are attached to, and "
32 " non-musical columns, where bar-lines, clefs etc. are attached to. "
33 " The spacing engine determines the X-positions of these objects."
37 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
38 " line-breaking, and columns are not renumbered after line breaking.\n"
39 " Since many columns go unused, you should only use the rank field to\n"
40 " get ordering information. Two adjacent columns may have\n"
41 " non-adjacent numbers.\n",
47 "shortest-playing-duration "
48 "shortest-starter-duration "
53 Paper_column::do_break_processing ()
55 Spaceable_grob::remove_interface (this);
56 Item::do_break_processing ();
60 Paper_column::get_rank (Grob *me)
62 return dynamic_cast<Paper_column *> (me)->rank_;
66 Paper_column::get_system () const
72 Paper_column::get_column () const
74 return (Paper_column *) (this);
77 Paper_column::Paper_column (SCM l, Object_key const *key)
78 : Item (l, key) // guh.?
84 Paper_column::Paper_column (Paper_column const &src, int count)
92 Paper_column::when_mom (Grob *me)
94 SCM m = me->get_property ("when");
95 if (Moment *when = unsmob_moment (m))
101 Paper_column::is_musical (Grob *me)
103 SCM m = me->get_property ("shortest-starter-duration");
105 if (unsmob_moment (m))
106 s = *unsmob_moment (m);
107 return s != Moment (0);
111 Paper_column::is_used (Grob *me)
113 extract_grob_set (me, "elements", elts);
117 extract_grob_set (me, "bounded-by-me", bbm);
121 if (Item::is_breakable (me))
124 if (to_boolean (me->get_property ("used")))
130 Print a vertical line and the rank number, to aid debugging.
133 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
135 Paper_column::print (SCM p)
137 Grob *me = unsmob_grob (p);
139 String r = to_string (Paper_column::get_rank (me));
141 Moment *mom = unsmob_moment (me->get_property ("when"));
142 String when = mom ? mom->to_string () : "?/?";
144 SCM properties = Font_interface::text_font_alist_chain (me);
146 SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
148 scm_makfrom0str (r.to_str0 ()));
149 SCM when_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
151 scm_makfrom0str (when.to_str0 ()));
152 Stencil t = *unsmob_stencil (scm_mol);
153 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
154 t.align_to (X_AXIS, CENTER);
155 t.align_to (Y_AXIS, DOWN);
157 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
161 return t.smobbed_copy ();
165 This is all too hairy. We use bounded-by-me to make sure that some
166 columns are kept "alive". Unfortunately, when spanners are suicided,
167 this falls apart again, because suicided spanners are still in
170 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
172 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
174 Paper_column::before_line_breaking (SCM grob)
176 Grob *me = unsmob_grob (grob);
178 SCM bbm = me->get_object ("bounded-by-me");
179 Grob_array *ga = unsmob_grob_array (bbm);
181 return SCM_UNSPECIFIED;
183 Link_array<Grob> &array (ga->array_reference ());
185 for (int i = array.size (); i--;)
189 if (!g || !g->is_live ())
190 { // UGH . potentially quadratic.
195 return SCM_UNSPECIFIED;