source file of the GNU LilyPond music typesetter
- (c) 1996--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1996--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
TODO: This is way too hairy
return SCM_BOOL_T;
}
-
-
MAKE_SCHEME_CALLBACK(Stem, calc_direction, 1);
SCM
Stem::calc_direction (SCM smob)
dir = get_grob_direction (me);
}
else
- dir = get_default_dir (me);
+ {
+ SCM dd = me->get_property ("default-direction");
+ dir = to_dir (dd);
+ if (!dir)
+ return me->get_property ("neutral-direction");
+ }
return scm_from_int (dir);
}
-/* A separate function, since this is used elsewhere too. */
-Direction
-Stem::get_default_dir (Grob *me)
+MAKE_SCHEME_CALLBACK(Stem, calc_default_direction, 1);
+SCM
+Stem::calc_default_direction (SCM smob)
{
+ Grob *me = unsmob_grob (smob);
+
Direction dir = CENTER;
int staff_center = 0;
Interval hp = head_positions (me);
if (!hp.is_empty ())
{
- int udistance = (int) (UP *hp[UP] - staff_center);
- int ddistance = (int) (DOWN *hp[DOWN] - staff_center);
+ int udistance = (int) (UP * hp[UP] - staff_center);
+ int ddistance = (int) (DOWN * hp[DOWN] - staff_center);
- if (sign (ddistance - udistance))
- dir = Direction (sign (ddistance - udistance));
- else
- dir = to_dir (me->get_property ("neutral-direction"));
+ dir = Direction (sign (ddistance - udistance));
}
- return dir;
+
+ return scm_from_int (dir);
}
-
MAKE_SCHEME_CALLBACK (Stem, height, 1);
SCM
Stem::height (SCM smob)
Real staff_space = Staff_symbol_referencer::staff_space (me);
Grob *beam = get_beam (me);
+
+ if (beam)
+ {
+ (void) beam->get_property ("beaming");
+ }
+
Real beam_translation = Beam::get_beam_translation (beam);
Real beam_thickness = Beam::get_thickness (beam);
int beam_count = Beam::get_direction_beam_count (beam, my_dir);
+ Real length_fraction
+ = robust_scm2double (me->get_property ("length-fraction"), 1.0);
/* Simple standard stem length */
SCM details = me->get_property ("details");
SCM lengths = scm_cdr (scm_assq (ly_symbol2scm ("beamed-lengths"), details));
-
Real ideal_length
= scm_to_double (robust_list_ref (beam_count - 1, lengths))
-
* staff_space
+ * length_fraction
+
/* stem only extends to center of beam
*/
- 0.5 * beam_thickness;
/* Condition: sane minimum free stem length (chord to beams) */
lengths = scm_cdr (scm_assq (ly_symbol2scm ("beamed-minimum-free-lengths"), details));
- Real length_fraction
- = robust_scm2double (me->get_property ("length-fraction"), 1.0);
Real ideal_minimum_free
= scm_to_double (robust_list_ref (beam_count - 1, lengths))
- * staff_space * length_fraction;
+ * staff_space
+ * length_fraction;
/* UGH
It seems that also for ideal minimum length, we must use
Real minimum_free
= scm_to_double (robust_list_ref (beam_count - 1, bemfl))
- * staff_space;
+ * staff_space
+ * length_fraction;
Real minimum_length = minimum_free
+ height_of_my_beams
"avoid-note-head "
"beam "
"beaming "
+ "default-direction "
"details "
"direction "
"duration-log "