DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
DECLARE_SCHEME_CALLBACK (calc_beaming, (SCM));
DECLARE_SCHEME_CALLBACK (calc_length, (SCM));
+ DECLARE_SCHEME_CALLBACK (calc_stem_begin_position, (SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_end_position, (SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_info, (SCM));
DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
* Staff_symbol_referencer::line_thickness (me);
}
+MAKE_SCHEME_CALLBACK (Stem, calc_stem_begin_position, 1);
+SCM
+Stem::calc_stem_begin_position (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Direction d = get_grob_direction (me);
+ Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
+ Grob *lh
+ = to_boolean (me->get_property ("avoid-note-head"))
+ ? last_head (me)
+ : first_head (me);
+
+ Real pos = Staff_symbol_referencer::get_position (lh);
+
+ if (Grob *head = support_head (me))
+ {
+ 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);
+ pos += d * y_attach / half_space;
+ }
+
+ return scm_from_double (pos);
+}
+
MAKE_SCHEME_CALLBACK (Stem, print, 1);
SCM
Stem::print (SCM smob)
Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
if (lh)
- y2 = Staff_symbol_referencer::get_position (lh);
+ y2 = robust_scm2double (me->get_property ("stem-begin-position"), 0.0);
else if (stemlet)
{
Real beam_translation = Beam::get_beam_translation (beam);
Interval stem_y (min (y1, y2), max (y2, y1));
- if (Grob *head = support_head (me))
- {
- /*
- must not take ledgers into account.
- */
- 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
"note-heads "
"positioning-done "
"rests "
+ "stem-begin-position "
"stem-end-position "
"stem-info "
"stemlet-length "
structure.")
(stem-attachment ,number-pair? "An @code{(@var{x} . @var{y})}
pair where the stem attaches to the notehead.")
+ (stem-begin-position ,number? "Where does the stem begin (the
+position of the support-head)?")
(stem-end-position ,number? "Where does the stem end (the end is
opposite to the support-head)?")
;;[TODO: doco]
(length . ,ly:stem::calc-length)
(neutral-direction . ,DOWN)
(positioning-done . ,ly:stem::calc-positioning-done)
+ (stem-begin-position . ,ly:stem::calc-stem-begin-position)
(stem-end-position . ,ly:stem::calc-stem-end-position)
(stem-info . ,ly:stem::calc-stem-info)
(stencil . ,ly:stem::print)