From: Mike Solomon Date: Tue, 19 Jul 2011 13:59:37 +0000 (+0200) Subject: Adds stem-begin-position callback. X-Git-Tag: release/2.15.6-1~3^2~4 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=3e8b3eb5e3e2054fdaf5b8bc71b1222c7db5ebe5;p=lilypond.git Adds stem-begin-position callback. --- diff --git a/lily/include/stem.hh b/lily/include/stem.hh index 27fe988b61..3388e34b59 100644 --- a/lily/include/stem.hh +++ b/lily/include/stem.hh @@ -61,6 +61,7 @@ public: 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)); diff --git a/lily/stem.cc b/lily/stem.cc index 04bc410592..5b1a3d5041 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -733,6 +733,32 @@ Stem::thickness (Grob *me) * 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) @@ -771,7 +797,7 @@ 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); @@ -786,18 +812,6 @@ Stem::print (SCM smob) 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 @@ -1110,6 +1124,7 @@ ADD_INTERFACE (Stem, "note-heads " "positioning-done " "rests " + "stem-begin-position " "stem-end-position " "stem-info " "stemlet-length " diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 5c2114338e..40732d0e9d 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -841,6 +841,8 @@ the @code{staff-staff-spacing} property of the staff's 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] diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 177ebafc84..393bc7c187 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1916,6 +1916,7 @@ (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)