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))
99 s = *unsmob_moment (m);
100 return s != Moment (0);
104 Paper_column::is_used (Grob *me)
106 extract_grob_set (me, "elements", elts);
110 extract_grob_set (me, "bounded-by-me", bbm);
113 return Item::is_breakable (me);
117 Print a vertical line and the rank number, to aid debugging.
120 MAKE_SCHEME_CALLBACK (Paper_column, print, 1);
122 Paper_column::print (SCM p)
124 Grob *me = unsmob_grob (p);
126 String r = to_string (Paper_column::get_rank (me));
128 Moment *mom = unsmob_moment (me->get_property ("when"));
129 String when = mom ? mom->to_string () : "?/?";
131 SCM properties = Font_interface::text_font_alist_chain (me);
133 SCM scm_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
135 scm_makfrom0str (r.to_str0 ()));
136 SCM when_mol = Text_interface::interpret_markup (me->get_layout ()->self_scm (),
138 scm_makfrom0str (when.to_str0 ()));
139 Stencil t = *unsmob_stencil (scm_mol);
140 t.add_at_edge (Y_AXIS, DOWN, *unsmob_stencil (when_mol), 0.1, 0.1);
141 t.align_to (X_AXIS, CENTER);
142 t.align_to (Y_AXIS, DOWN);
144 Stencil l = Lookup::filled_box (Box (Interval (-0.01, 0.01),
148 return t.smobbed_copy ();
152 This is all too hairy. We use bounded-by-me to make sure that some
153 columns are kept "alive". Unfortunately, when spanners are suicided,
154 this falls apart again, because suicided spanners are still in
157 THIS IS BROKEN KLUDGE. WE SHOULD INVENT SOMETHING BETTER.
159 MAKE_SCHEME_CALLBACK (Paper_column, before_line_breaking, 1);
161 Paper_column::before_line_breaking (SCM grob)
163 Grob *me = unsmob_grob (grob);
165 SCM bbm = me->get_object ("bounded-by-me");
166 Grob_array *ga = unsmob_grob_array (bbm);
168 return SCM_UNSPECIFIED;
170 Link_array<Grob> &array (ga->array_reference ());
172 for (int i = array.size (); i--;)
176 if (!g || !g->is_live ())
177 { // UGH . potentially quadratic.
182 return SCM_UNSPECIFIED;