2 axis-group-interface.cc -- implement Axis_group_interface
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "hara-kiri-group-spanner.hh"
10 #include "axis-group-interface.hh"
14 Axis_group_interface::add_element (Grob
*me
,Grob
*e
)
16 for (SCM ax
= me
->get_grob_property ("axes"); ax
!= SCM_EOL
; ax
= gh_cdr (ax
))
18 Axis a
= (Axis
) gh_scm2int (gh_car (ax
));
21 e
->set_parent (me
, a
);
24 Pointer_group_interface::add_element (me
, "elements", e
);
25 me
->add_dependency (e
);
29 Axis_group_interface::axis_b (Grob
*me
,Axis a
)
32 urg. FIXME, check for Hara_kiri_group_spanner shouldn't be necessary?
36 return me
->has_extent_callback_b (group_extent_callback_proc
, a
) ||
37 (me
->has_extent_callback_b (Hara_kiri_group_spanner::y_extent_proc
, a
));
41 Axis_group_interface::relative_group_extent (Axis a
, Grob
*common
, SCM elts
)
44 for (SCM s
= elts
; gh_pair_p (s
); s
= gh_cdr (s
))
46 Grob
* se
= unsmob_grob (gh_car (s
));
47 Interval dims
= se
->extent (common
, a
);
54 MAKE_SCHEME_CALLBACK (Axis_group_interface
,group_extent_callback
,2);
56 Axis_group_interface::group_extent_callback (SCM element_smob
, SCM scm_axis
)
58 Grob
*me
= unsmob_grob (element_smob
);
59 Axis a
= (Axis
) gh_scm2int (scm_axis
);
61 Grob
* common
= (Grob
*) me
;
63 for (SCM s
= me
->get_grob_property ("elements"); gh_pair_p (s
); s
= gh_cdr (s
))
65 Grob
* se
= unsmob_grob (gh_car (s
));
66 common
= se
->common_refpoint (common
, a
);
69 Real my_coord
= me
->relative_coordinate (common
, a
);
70 Interval
r (relative_group_extent (a
, common
, me
->get_grob_property ("elements")));
72 return ly_interval2scm (r
- my_coord
);
76 Axis_group_interface::set_axes (Grob
*me
,Axis a1
, Axis a2
)
79 SCM sa1
= gh_int2scm (a1
);
80 SCM sa2
= gh_int2scm (a2
);
82 SCM axes
= me
->get_grob_property ("axes");
85 || scm_memq (sa1
, axes
) == SCM_BOOL_F
86 || scm_memq (sa2
, axes
) == SCM_BOOL_F
)
88 SCM ax
= gh_cons (sa1
, SCM_EOL
);
90 ax
= gh_cons (sa2
, ax
);
91 me
->set_grob_property ("axes", ax
);
94 if (a1
!= X_AXIS
&& a2
!= X_AXIS
)
95 me
->set_extent_callback (SCM_EOL
, X_AXIS
);
96 if (a1
!= Y_AXIS
&& a2
!= Y_AXIS
)
97 me
->set_extent_callback (SCM_EOL
, Y_AXIS
);
100 why so convoluted ? (fixme/documentme?)
102 if (me
->has_extent_callback_b (Grob::molecule_extent_proc
, a1
))
103 me
->set_extent_callback (Axis_group_interface::group_extent_callback_proc
,a1
);
104 if (me
->has_extent_callback_b (Grob::molecule_extent_proc
, a2
))
105 me
->set_extent_callback (Axis_group_interface::group_extent_callback_proc
,a2
);
109 Axis_group_interface::get_children (Grob
*me
)
111 Link_array
<Grob
> childs
;
114 if (!has_interface (me
))
117 for (SCM ep
= me
->get_grob_property ("elements"); gh_pair_p (ep
); ep
= gh_cdr (ep
))
119 Grob
* e
= unsmob_grob (gh_car (ep
));
121 childs
.concat (Axis_group_interface::get_children (e
));
128 Axis_group_interface::has_interface (Grob
*me
)
130 return me
&& me
->has_interface (ly_symbol2scm ("axis-group-interface"));
134 Axis_group_interface::set_interface (Grob
*me
)
136 if (!has_interface (me
))
138 me
->set_interface (ly_symbol2scm ("axis-group-interface"));