2 g-staff-side.cc -- implement Staff_side_element
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "staff-side.hh"
11 #include "staff-symbol.hh"
14 #include "dimensions.hh"
15 #include "dimension-cache.hh"
17 Staff_side_element::Staff_side_element ()
21 set_elt_property (transparent_scm_sym
, SCM_BOOL_T
);
28 Staff_side_element::do_pre_processing ()
31 dir_
= get_default_direction ();
38 Staff_side_element::get_default_direction () const
45 Staff_side_element::set_victim (Score_element
*e
)
49 to_position_l_
->dim_cache_
[axis_
]->parent_l_
= dim_cache_
[axis_
];
53 Staff_side_element::add_support (Score_element
*e
)
56 support_l_arr_
.push (e
);
61 Staff_side_element::do_substitute_element_pointer (Score_element
*o
, Score_element
*n
)
63 Staff_symbol_referencer::do_substitute_element_pointer (o
,n
);
64 if (o
== to_position_l_
)
67 support_l_arr_
.unordered_substitute (o
,n
);
71 Staff_side_element::position_self ()
74 to_position_l_
->get_elt_property (transparent_scm_sym
) != SCM_BOOL_F
)
78 Dimension_cache
*common
= 0;
79 if (support_l_arr_
.size ())
81 common
= common_group (typecast_array (support_l_arr_
, (Graphical_element
*)0),
84 for (int i
=0; i
< support_l_arr_
.size (); i
++)
86 Score_element
* e
= support_l_arr_
[i
];
87 Real coord
= e
->relative_coordinate (common
, axis_
);
89 dim
.unite (coord
+ e
->extent (axis_
));
93 common
= dim_cache_
[axis_
]->parent_l_
;
103 ? to_position_l_
->extent (axis_
)
106 Real off
= dim_cache_
[axis_
]->relative_coordinate (common
);
110 SCM pad
= remove_elt_property (padding_scm_sym
);
111 if (pad
!= SCM_BOOL_F
)
113 off
+= gh_scm2double (SCM_CDR(pad
)) * dir_
;
115 Real total_off
= dim
[dir_
] + off
;
118 no_staff_support_scm_sym is ugh bugfix to get staccato dots right.
120 if (to_position_l_
&& to_position_l_
->get_elt_property (no_staff_support_scm_sym
) == SCM_BOOL_F
)
121 total_off
+= - sym_dim
[-dir_
];
123 dim_cache_
[axis_
]->set_offset (total_off
);
124 if (fabs (total_off
) > 100 CM
)
125 programming_error ("Huh ? Improbable staff side dim.");
129 Staff_side_element::do_post_processing ()
137 Staff_side_element::do_add_processing ()
139 if (get_elt_property (no_staff_support_scm_sym
) == SCM_BOOL_F
140 && axis_
== Y_AXIS
&& staff_symbol_l ())
142 add_support (staff_symbol_l ());
147 Staff_side_element::do_height () const
151 return to_position_l_
->extent (Y_AXIS
);
156 Staff_side_element::do_print () const
160 DOUT
<< "positioning " << to_position_l_
->name();
162 DOUT
<< "axis == " << axis_name_str (axis_
)
163 << ", dir == " << to_str (dir_
);
169 Staff_side_item::do_width () const
173 return to_position_l_
->extent (X_AXIS
);
178 Staff_side_item::do_print () const
180 Staff_side_element::do_print ();
184 Staff_side_spanner::do_print () const
186 Staff_side_element::do_print ();