source file of the GNU LilyPond music typesetter
- (c) 1996--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1996--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
TODO: This is way too hairy
if (!head_count (me))
return scm_from_double (0.0);
-
+
Real ss = Staff_symbol_referencer::staff_space (me);
int durlog = duration_log (me);
Array<Real> a;
Direction dir = get_grob_direction (me);
Interval hp = head_positions (me);
- Real st = dir ? hp[dir] + dir * length : 0;
+ Real stem_end = dir ? hp[dir] + dir * length : 0;
/* TODO: change name to extend-stems to staff/center/'() */
bool no_extend_b = to_boolean (me->get_property ("no-stem-extend"));
- if (!no_extend_b && dir * st < 0)
- st = 0.0;
+ if (!no_extend_b && dir * stem_end < 0)
+ stem_end = 0.0;
+
/* Make a little room if we have a upflag and there is a dot.
previous approach was to lengthen the stem. This is not
good typesetting practice. */
/* Very gory: add myself to the X-support of the parent,
which should be a dot-column. */
- if (dir * (st + flagy - dp) < 0.5)
+ if (dir * (stem_end + flagy - dp) < 0.5)
{
Grob *par = dots->get_parent (X_AXIS);
}
}
- return scm_from_double (st);
+ return scm_from_double (stem_end);
}
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)
beam->get_property ("positions");
}
- /* FIXME uncached? */
- Interval iv = me->get_stencil () ? me->get_stencil ()->extent (Y_AXIS) : Interval();
+ /*
+ Can't get_stencil(), since that would cache stencils too early.
+ This causes problems with beams.
+ */
+ Stencil *stencil = unsmob_stencil (print (smob));
+ Interval iv = stencil ? stencil->extent (Y_AXIS) : Interval();
if (beam)
{
if (dir == CENTER)
{
int p = (int) (rint (stem_end_position (me)));
staffline_offs
- = Staff_symbol_referencer::on_staffline (me, p) ? "0" : "1";
+ = Staff_symbol_referencer::on_line (me, p) ? "0" : "1";
}
else
staffline_offs = "2";
if (scm_is_string (stroke_style_scm))
{
String stroke_style = ly_scm2string (stroke_style_scm);
- if (!stroke_style.is_empty ())
+ if (!stroke_style.empty ())
{
String font_char = to_string (dir) + stroke_style;
Stencil stroke = fm->find_by_name ("flags." + font_char);
Interval stem_y (min (y1, y2), max (y2, y1));
- if (Grob *hed = support_head (me))
+ if (Grob *head = support_head (me))
{
/*
must not take ledgers into account.
*/
- Interval head_height = hed->extent (hed, Y_AXIS);
- Real y_attach = Note_head::stem_attachment_coordinate (hed, Y_AXIS);
+ Interval head_height = head->extent (head, Y_AXIS);
+ Real y_attach = Note_head::stem_attachment_coordinate (head, Y_AXIS);
y_attach = head_height.linear_combination (y_attach);
stem_y[Direction (-d)] += d * y_attach / half_space;
// URG
Real stem_width = thickness (me);
Real blot
- = me->get_layout ()->get_dimension (ly_symbol2scm ("blotdiameter"));
+ = me->layout ()->get_dimension (ly_symbol2scm ("blotdiameter"));
Box b = Box (Interval (-stem_width / 2, stem_width / 2),
Interval (stem_y[DOWN] * half_space, stem_y[UP] * half_space));
{
Direction d = get_grob_direction (me);
Real blot
- = me->get_layout ()->get_dimension (ly_symbol2scm ("blotdiameter"));
+ = me->layout ()->get_dimension (ly_symbol2scm ("blotdiameter"));
Real stem_width = thickness (me);
Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
Real y2 = robust_scm2double (me->get_property ("stem-end-position"), 0.0);
/*
move the stem to right of the notehead if it is up.
*/
-MAKE_SCHEME_CALLBACK (Stem, offset_callback, 2);
+MAKE_SCHEME_CALLBACK (Stem, offset_callback, 1);
SCM
-Stem::offset_callback (SCM element_smob, SCM)
+Stem::offset_callback (SCM smob)
{
- Grob *me = unsmob_grob (element_smob);
+ Grob *me = unsmob_grob (smob);
Real r = 0.0;
if (Grob *f = first_head (me))
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
"should be shortened. The list gives an amount depending on the number "
"of flags/beams."
"@end table\n"
-
,
/* properties */
-
"avoid-note-head "
"beam "
"beaming "
+ "default-direction "
"details "
"direction "
"duration-log "