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 "
52 Paper_column::do_break_processing ()
54 Spaceable_grob::remove_interface (this);
55 Item::do_break_processing ();
59 Paper_column::get_rank (Grob *me)
61 return dynamic_cast<Paper_column *> (me)->rank_;
65 Paper_column::get_system () const
71 Paper_column::get_column () const
73 return (Paper_column *) (this);
76 Paper_column::Paper_column (SCM l, Object_key const *key)
77 : Item (l, key) // guh.?
83 Paper_column::Paper_column (Paper_column const &src, int count)
91 Paper_column::when_mom (Grob *me)
93 SCM m = me->get_property ("when");
94 if (Moment *when = unsmob_moment (m))
100 Paper_column::is_musical (Grob *me)
102 SCM m = me->get_property ("shortest-starter-duration");
104 if (unsmob_moment (m))
105 s = *unsmob_moment (m);
106 return s != Moment (0);
110 Paper_column::is_used (Grob *me)
112 extract_grob_set (me, "elements", elts);
116 extract_grob_set (me, "bounded-by-me", bbm);
120 return Item::is_breakable (me);
124 Print a vertical line and the rank number, to aid debugging.
127 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
129 Paper_column::print (SCM p)
131 Grob *me = unsmob_grob (p);
133 String r = to_string (Paper_column::get_rank (me));
135 Moment *mom = unsmob_moment (me->get_property ("when"));
136 String when = mom ? mom->to_string () : "?/?";
138 SCM properties = Font_interface::text_font_alist_chain (me);
140 SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
142 scm_makfrom0str (r.to_str0 ()));
143 SCM when_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
145 scm_makfrom0str (when.to_str0 ()));
146 Stencil t = *unsmob_stencil (scm_mol);
147 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
148 t.align_to (X_AXIS, CENTER);
149 t.align_to (Y_AXIS, DOWN);
151 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
155 return t.smobbed_copy ();
159 This is all too hairy. We use bounded-by-me to make sure that some
160 columns are kept "alive". Unfortunately, when spanners are suicided,
161 this falls apart again, because suicided spanners are still in
164 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
166 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
168 Paper_column::before_line_breaking (SCM grob)
170 Grob *me = unsmob_grob (grob);
172 SCM bbm = me->get_object ("bounded-by-me");
173 Grob_array *ga = unsmob_grob_array (bbm);
175 return SCM_UNSPECIFIED;
177 Link_array<Grob> &array (ga->array_reference ());
179 for (int i = array.size (); i--;)
183 if (!g || !g->is_live ())
184 { // UGH . potentially quadratic.
189 return SCM_UNSPECIFIED;