2 dot-column.cc -- implement Dot_column
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "dot-column.hh"
11 #include "rhythmic-head.hh"
12 #include "group-interface.hh"
13 #include "staff-symbol-referencer.hh"
14 #include "directional-element-interface.hh"
15 #include "side-position-interface.hh"
16 #include "axis-group-interface.hh"
23 Dot_column::set_interface (Grob
* me
)
26 Directional_element_interface::set (me
, RIGHT
);
28 Axis_group_interface::set_interface (me
);
29 Axis_group_interface::set_axes (me
, X_AXIS
,X_AXIS
);
33 Will fuck up in this case.
49 MAKE_SCHEME_CALLBACK (Dot_column
,force_shift_callback
,2);
51 Dot_column::force_shift_callback (SCM element_smob
, SCM axis
)
53 Grob
*me
= unsmob_grob (element_smob
);
54 Axis a
= (Axis
) gh_scm2int (axis
);
56 me
= me
->parent_l (X_AXIS
);
57 SCM dots
= me
->get_grob_property ("dots");
59 return gh_double2scm (0.0);
63 Dot_column::do_shifts (SCM l
)
65 Link_array
<Grob
> dots
;
68 dots
.push (unsmob_grob (gh_car (l
)));
72 dots
.sort (compare_position
);
75 return SCM_UNSPECIFIED
;
79 Array
<int> taken_posns
;
81 for (int i
=0; i
< dots
.size (); i
++)
83 Real p
= Staff_symbol_referencer::position_f (dots
[i
]);
84 for (int j
=0; j
< taken_posns
.size (); j
++)
86 if (taken_posns
[j
] == (int) p
)
89 taken_posns
.push ((int)p
);
90 s
.unite (Slice ((int)p
,
95 return SCM_UNSPECIFIED
;
97 int middle
= s
.center ();
101 int pos
= middle
- dots
.size () + 1;
103 pos
++; // center () rounds down.
105 for (int i
=0; i
< dots
.size (); pos
+= 2, i
++)
108 Staff_symbol_referencer::set_position (d
,pos
);
111 return SCM_UNSPECIFIED
;
115 Dot_column::has_interface (Grob
*m
)
117 return m
&& m
->has_interface (ly_symbol2scm ("dot-column-interface"));
122 Dot_column::add_head (Grob
* me
, Grob
*rh
)
124 Grob
* d
= unsmob_grob (rh
->get_grob_property ("dot"));
127 Side_position_interface::add_support (me
,rh
);
129 Pointer_group_interface ::add_element (me
, "dots",d
);
130 d
->add_offset_callback (Dot_column::force_shift_callback_proc
, Y_AXIS
);
131 Axis_group_interface::add_element (me
, d
);