if (!is_normal_stem (me))
return ly_interval2scm (iv);
- /* if we are part of a cross-staff beam, return empty */
- if (get_beam (me) && Beam::is_cross_staff (get_beam (me)))
- return ly_interval2scm (iv);
-
Real ss = Staff_symbol_referencer::staff_space (me);
- Real len = scm_to_double (calc_length (smob)) * ss / 2;
- Direction dir = get_grob_direction (me);
+ Real rad = Staff_symbol_referencer::staff_radius (me);
- Interval hp = head_positions (me);
- if (dir == UP)
- iv = Interval (0, len);
- else
- iv = Interval (-len, 0);
+ if (!to_boolean (me->get_property ("cross-staff")))
+ {
+ Real len = scm_to_double (calc_length (smob)) * ss / 2;
+ Direction dir = get_grob_direction (me);
- if (!hp.is_empty ())
- iv.translate (hp[dir] * ss / 2);
+ Interval hp = head_positions (me);
+ if (dir == UP)
+ iv = Interval (0, len);
+ else
+ iv = Interval (-len, 0);
+
+ if (!hp.is_empty ())
+ iv.translate (hp[dir] * ss / 2);
+
+ /* extend the stem (away from the head) to cover the staff */
+ if (dir == UP)
+ iv[UP] = max (iv[UP], rad * ss);
+ else
+ iv[DOWN] = min (iv[DOWN], -rad * ss);
+ }
+ else
+ iv = Interval (-rad * ss, rad * ss);
return ly_interval2scm (iv);
}
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 * stem_end < 0)
+ bool no_extend = to_boolean (me->get_property ("no-stem-extend"));
+ if (!no_extend && dir * stem_end < 0)
stem_end = 0.0;
return scm_from_double (stem_end);
if (!lh && stemlet && !beam)
return SCM_EOL;
+ if (lh && robust_scm2int (lh->get_property ("duration-log"), 0) < 1)
+ return SCM_EOL;
+
if (is_invisible (me))
return SCM_EOL;
Obviously not for grace beams.
Also, not for knees. Seems to be a good thing. */
- bool no_extend_b = to_boolean (me->get_property ("no-stem-extend"));
+ bool no_extend = to_boolean (me->get_property ("no-stem-extend"));
bool is_knee = to_boolean (beam->get_property ("knee"));
- if (!no_extend_b && !is_knee)
+ if (!no_extend && !is_knee)
{
/* Highest beam of (UP) beam must never be lower than middle
staffline */
/* FIXME: Too many properties */
ADD_INTERFACE (Stem,
- "The stem represent the graphical stem. "
- "In addition, it internally connects note heads, beams and"
- "tremolos. "
- "Rests and whole notes have invisible stems."
-
- "\n\nThe following properties may be set in the details list."
+ "The stem represents the graphical stem. In addition, it"
+ " internally connects note heads, beams, and tremolos. Rests"
+ " and whole notes have invisible stems.\n"
+ "\n"
+ "The following properties may be set in the @code{details}"
+ " list.\n"
+ "\n"
"@table @code\n"
- "@item beamed-lengths \n"
- "list of stem lengths given beam multiplicity. \n"
- "@item beamed-minimum-free-lengths \n"
- "list of normal minimum free stem lengths (chord to beams) given beam multiplicity.\n"
+ "@item beamed-lengths\n"
+ "List of stem lengths given beam multiplicity.\n"
+ "@item beamed-minimum-free-lengths\n"
+ "List of normal minimum free stem lengths (chord to beams)"
+ " given beam multiplicity.\n"
"@item beamed-extreme-minimum-free-lengths\n"
- "list of extreme minimum free stem lengths (chord to beams) given beam multiplicity.\n"
+ "List of extreme minimum free stem lengths (chord to beams)"
+ " given beam multiplicity.\n"
"@item lengths\n"
- "Default stem lengths. The list gives a length for each flag-count.\n"
+ "Default stem lengths. The list gives a length for each"
+ " flag count.\n"
"@item stem-shorten\n"
- "How much a stem in a forced direction "
- "should be shortened. The list gives an amount depending on the number "
- "of flags/beams."
- "@end table\n"
- ,
+ "How much a stem in a forced direction should be shortened."
+ " The list gives an amount depending on the number of flags"
+ " and beams.\n"
+ "@end table\n",
/* properties */
"avoid-note-head "