2 dot-column.cc -- implement Dot_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
12 #include "dot-column.hh"
13 #include "rhythmic-head.hh"
14 #include "group-interface.hh"
15 #include "staff-symbol-referencer.hh"
16 #include "directional-element-interface.hh"
17 #include "side-position-interface.hh"
18 #include "axis-group-interface.hh"
24 TODO: let Dot_column communicate with stem via Note_column.
27 MAKE_SCHEME_CALLBACK (Dot_column,force_shift_callback,2);
29 Dot_column::force_shift_callback (SCM element_smob, SCM axis)
31 Grob *me = unsmob_grob (element_smob);
32 Axis a = (Axis) gh_scm2int (axis);
34 me = me->get_parent (X_AXIS);
36 if (!to_boolean (me->get_grob_property ("collision-done")))
38 SCM l = me->get_grob_property ("dots");
39 me->set_grob_property ("collision-done", SCM_BOOL_T);
43 return gh_double2scm (0.0);
46 MAKE_SCHEME_CALLBACK(Dot_column,side_position, 2);
48 Dot_column::side_position (SCM element_smob, SCM axis)
50 Grob *me = unsmob_grob (element_smob);
51 Axis a = (Axis) gh_scm2int (axis);
54 Grob * stem = unsmob_grob (me->get_grob_property ("stem"));
56 && !Stem::get_beam (stem)
57 && Stem::duration_log (stem) > 2
58 && !Stem::invisible_b (stem)
62 trigger stem end & direction calculation.
64 This will add the stem to the support if a flag collision happens.
66 Stem::stem_end_position (stem);
68 return Side_position_interface::aligned_side (element_smob, axis);
73 Put the dots in the spaces, close to the heads.
75 This is somewhat gruesome; the problem really is
77 minimize (sum_j dist (head_j, dot_j))
79 over all configurations. This sounds like a messy optimization
84 Dot_column::do_shifts (Grob*me, SCM l)
86 Link_array<Grob> dots;
89 dots.push (unsmob_grob (ly_car (l)));
93 dots.sort (compare_position);
97 for (int i=0; i < dots.size (); i++)
100 int p = int (Staff_symbol_referencer::get_position (d));
102 if (Staff_symbol_referencer::on_staffline (d, p)
103 || taken_posns.find (p) != taken_posns.end ())
107 if (Staff_symbol_referencer::on_staffline (d, p))
113 Direction dir = to_dir (d->get_grob_property ("direction"));
120 if (taken_posns.find (pu) == taken_posns.end ())
129 if (taken_posns.find (pd) == taken_posns.end ())
137 Staff_symbol_referencer::set_position (d, p);
140 taken_posns.insert (p);
143 return SCM_UNSPECIFIED;
149 Dot_column::add_head (Grob * me, Grob *rh)
151 Grob * d = unsmob_grob (rh->get_grob_property ("dot"));
154 Side_position_interface::add_support (me,rh);
156 Pointer_group_interface::add_grob (me, ly_symbol2scm ("dots"), d);
157 d->add_offset_callback (Dot_column::force_shift_callback_proc , Y_AXIS);
158 Axis_group_interface::add_element (me, d);
165 ADD_INTERFACE (Dot_column, "dot-column-interface",
166 "Interface that groups dots so they form a column",