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);
- 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);
+ }
+
+ /* at a minimum, make the pure-height cover the staff symbol */
+ Real rad = Staff_symbol_referencer::staff_radius (me);
+ iv.add_point (-rad * ss);
+ iv.add_point (rad * ss);
return ly_interval2scm (iv);
}
return me->get_property ("stem-end-position");
}
- Real ss = Staff_symbol_referencer::staff_space (me);
- int durlog = duration_log (me);
vector<Real> a;
/* WARNING: IN HALF SPACES */
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. */
- if (!get_beam (me) && dir == UP
- && durlog > 2)
- {
- Grob *closest_to_flag = extremal_heads (me)[dir];
- Grob *dots = closest_to_flag
- ? Rhythmic_head::get_dots (closest_to_flag) : 0;
-
- if (dots)
- {
- Real dp = Staff_symbol_referencer::get_position (dots);
- Interval flag_yext = flag (me).extent (Y_AXIS) * (2 / ss) + stem_end;
-
- /* Very gory: add myself to the X-support of the parent,
- which should be a dot-column. */
-
- if (flag_yext.distance (dp) < 0.5)
- {
- Grob *par = dots->get_parent (X_AXIS);
-
- if (Dot_column::has_interface (par))
- {
- Side_position_interface::add_support (par, me);
-
- /* TODO: apply some better logic here. The flag is
- curved inwards, so this will typically be too
- much. */
- }
- }
- }
- }
-
return scm_from_double (stem_end);
}
return (scm_is_number (s)) ? scm_to_int (s) : 2;
}
-MAKE_SCHEME_CALLBACK(Stem, calc_positioning_done, 1);
+MAKE_SCHEME_CALLBACK (Stem, calc_positioning_done, 1);
SCM
Stem::calc_positioning_done (SCM smob)
{
if (!head_count (me))
return SCM_BOOL_T;
+ me->set_property ("positioning-done", SCM_BOOL_T);
+
extract_grob_set (me, "note-heads", ro_heads);
vector<Grob*> heads (ro_heads);
vector_sort (heads, position_less);
return SCM_BOOL_T;
}
-MAKE_SCHEME_CALLBACK(Stem, calc_direction, 1);
+MAKE_SCHEME_CALLBACK (Stem, calc_direction, 1);
SCM
Stem::calc_direction (SCM smob)
{
return scm_from_int (dir);
}
-MAKE_SCHEME_CALLBACK(Stem, calc_default_direction, 1);
+MAKE_SCHEME_CALLBACK (Stem, calc_default_direction, 1);
SCM
Stem::calc_default_direction (SCM smob)
{
Stem::height (SCM smob)
{
Grob *me = unsmob_grob (smob);
-
+ if (!is_normal_stem (me))
+ return ly_interval2scm (Interval ());
+
Direction dir = get_grob_direction (me);
- /* Trigger callback.
-
- UGH. Should be automatic
- */
Grob *beam = get_beam (me);
if (beam)
{
}
/*
- Can't get_stencil(), since that would cache stencils too early.
+ 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();
+ Interval iv = stencil ? stencil->extent (Y_AXIS) : Interval ();
if (beam)
{
if (dir == CENTER)
|| unsmob_grob (me->get_object ("beam")))
return Stencil ();
+ if (!is_normal_stem (me))
+ return Stencil ();
+
/*
TODO: maybe property stroke-style should take different values,
e.g. "" (i.e. no stroke), "single" and "double" (currently, it's
return si;
}
-MAKE_SCHEME_CALLBACK(Stem, calc_stem_info, 1);
+MAKE_SCHEME_CALLBACK (Stem, calc_stem_info, 1);
SCM
Stem::calc_stem_info (SCM smob)
{
Real height_of_my_trem = 0.0;
Grob *trem = unsmob_grob (me->get_object ("tremolo-flag"));
if (trem)
- height_of_my_trem = trem->extent (trem, Y_AXIS).length ()
+ {
+ height_of_my_trem
+ = Stem_tremolo::vertical_length (trem)
/* hack a bit of space around the trem. */
+ beam_translation;
+ }
+
/* UGH
It seems that also for ideal minimum length, we must use
the maximum beam count (for this direction):
return beam && Beam::is_cross_staff (beam);
}
-MAKE_SCHEME_CALLBACK (Stem, cross_staff, 1)
+MAKE_SCHEME_CALLBACK (Stem, calc_cross_staff, 1)
SCM
-Stem::cross_staff (SCM smob)
+Stem::calc_cross_staff (SCM smob)
{
return scm_from_bool (is_cross_staff (unsmob_grob (smob)));
}