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
);
78 Axis_group_interface::set_axes (Grob
*me
,Axis a1
, Axis a2
)
81 SCM sa1
= gh_int2scm (a1
);
82 SCM sa2
= gh_int2scm (a2
);
84 SCM axes
= me
->get_grob_property ("axes");
87 || scm_memq (sa1
, axes
) == SCM_BOOL_F
88 || scm_memq (sa2
, axes
) == SCM_BOOL_F
)
90 SCM ax
= gh_cons (sa1
, SCM_EOL
);
92 ax
= gh_cons (sa2
, ax
);
93 me
->set_grob_property ("axes", ax
);
96 if (a1
!= X_AXIS
&& a2
!= X_AXIS
)
97 me
->set_extent_callback (SCM_EOL
, X_AXIS
);
98 if (a1
!= Y_AXIS
&& a2
!= Y_AXIS
)
99 me
->set_extent_callback (SCM_EOL
, Y_AXIS
);
102 why so convoluted ? (fixme/documentme?)
104 if (me
->has_extent_callback_b (Grob::molecule_extent_proc
, a1
))
105 me
->set_extent_callback (Axis_group_interface::group_extent_callback_proc
,a1
);
106 if (me
->has_extent_callback_b (Grob::molecule_extent_proc
, a2
))
107 me
->set_extent_callback (Axis_group_interface::group_extent_callback_proc
,a2
);
111 Axis_group_interface::get_children (Grob
*me
)
113 Link_array
<Grob
> childs
;
116 if (!has_interface (me
))
119 for (SCM ep
= me
->get_grob_property ("elements"); gh_pair_p (ep
); ep
= gh_cdr (ep
))
121 Grob
* e
= unsmob_grob (gh_car (ep
));
123 childs
.concat (Axis_group_interface::get_children (e
));
130 Axis_group_interface::has_interface (Grob
*me
)
132 return me
&& me
->has_interface (ly_symbol2scm ("axis-group-interface"));
138 Axis_group_interface::set_interface (Grob
*me
)
140 if (!has_interface (me
))
142 me
->set_interface (ly_symbol2scm ("axis-group-interface"));