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."
36 " numbered, the first (leftmost) is column 0. Numbering happens before\n"
37 " line-breaking, and columns are not renumbered after line breaking.\n"
38 " Since many columns go unused, you should only use the rank field to\n"
39 " get ordering information. Two adjacent columns may have\n"
40 " non-adjacent numbers.\n"
42 "between-cols when bounded-by-me "
43 "page-penalty shortest-playing-duration shortest-starter-duration");
46 Paper_column::do_break_processing ()
48 Spaceable_grob::remove_interface (this);
49 Item::do_break_processing ();
53 Paper_column::get_rank (Grob *me)
55 return dynamic_cast<Paper_column *> (me)->rank_;
59 Paper_column::get_system () const
65 Paper_column::get_column () const
67 return (Paper_column *) (this);
70 Paper_column::Paper_column (SCM l, Object_key const *key)
71 : Item (l, key) // guh.?
77 Paper_column::Paper_column (Paper_column const &src, int count)
85 Paper_column::when_mom (Grob *me)
87 SCM m = me->get_property ("when");
88 if (Moment *when = unsmob_moment (m))
94 Paper_column::is_musical (Grob *me)
96 SCM m = me->get_property ("shortest-starter-duration");
98 if (unsmob_moment (m))
100 s = *unsmob_moment (m);
102 return s != Moment (0);
106 Paper_column::is_used (Grob *me)
108 extract_grob_set (me ,"elements", elts);
112 extract_grob_set (me ,"bounded-by-me", bbm);
115 return Item::is_breakable (me);
119 Print a vertical line and the rank number, to aid debugging.
122 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
124 Paper_column::print (SCM p)
126 Grob *me = unsmob_grob (p);
128 String r = to_string (Paper_column::get_rank (me));
130 Moment *mom = unsmob_moment (me->get_property ("when"));
131 String when = mom ? mom->to_string () : "?/?";
133 SCM properties = Font_interface::text_font_alist_chain (me);
135 SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
137 scm_makfrom0str (r.to_str0 ()));
138 SCM when_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
140 scm_makfrom0str (when.to_str0 ()));
141 Stencil t = *unsmob_stencil (scm_mol);
142 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
143 t.align_to (X_AXIS, CENTER);
144 t.align_to (Y_AXIS, DOWN);
146 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
150 return t.smobbed_copy ();
154 This is all too hairy. We use bounded-by-me to make sure that some
155 columns are kept "alive". Unfortunately, when spanners are suicided,
156 this falls apart again, because suicided spanners are still in
159 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
161 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
163 Paper_column::before_line_breaking (SCM grob)
165 Grob *me = unsmob_grob (grob);
167 SCM bbm = me->get_object ("bounded-by-me");
168 Grob_array * ga = unsmob_grob_array (bbm);
170 return SCM_UNSPECIFIED;
172 Link_array<Grob> &array (ga->array_reference ());
174 for (int i = array.size(); i--; )
178 if (!g || !g->is_live ())
179 { // UGH . potentially quadratic.
184 return SCM_UNSPECIFIED;