From 3c4b0bec5953774ee9e6e128bdf1edc44bbeae07 Mon Sep 17 00:00:00 2001 From: Mike Solomon Date: Wed, 4 Apr 2012 09:36:28 +0200 Subject: [PATCH] Correctly calculates stem-begin-position for merged stems. Previously, the lookup for stem-begin-position was potentailly triggered before note collision resolution occurred, which meant that it ignored Y_AXIS shifts from collision resolution. Now, through using pure property lookups, stem-begin-position is not set until after the collision resolution takes place. --- input/regression/flag-stem-begin-position.ly | 10 +++++++++ lily/flag.cc | 22 +++++++++++++++++++- lily/stem-tremolo.cc | 4 +++- lily/stem.cc | 5 ++++- scm/define-grobs.scm | 2 +- 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 input/regression/flag-stem-begin-position.ly diff --git a/input/regression/flag-stem-begin-position.ly b/input/regression/flag-stem-begin-position.ly new file mode 100644 index 0000000000..05c755bab9 --- /dev/null +++ b/input/regression/flag-stem-begin-position.ly @@ -0,0 +1,10 @@ +\version "2.15.36" + +\header { + texidoc = "Stems reach correct begin points of merged noteheads. +" +} + +<< { \aikenHeads f'8 } \\ { \aikenHeads f'8 } >> +<< { \aikenHeads f'4:32 } \\ { \aikenHeads f' } >> +<< { \aikenHeads e'8 f' s4 } \\ { \aikenHeads e'8 f' s4 } >> \ No newline at end of file diff --git a/lily/flag.cc b/lily/flag.cc index 3985908897..f997d6fe45 100644 --- a/lily/flag.cc +++ b/lily/flag.cc @@ -35,8 +35,11 @@ public: DECLARE_SCHEME_CALLBACK (print, (SCM)); DECLARE_SCHEME_CALLBACK (width, (SCM)); DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM)); + DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM)); DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM)); DECLARE_GROB_INTERFACE (); + + static SCM internal_calc_y_offset (SCM smob, bool pure); }; MAKE_SCHEME_CALLBACK (Flag, width, 1); @@ -136,9 +139,24 @@ Flag::print (SCM smob) return flag.smobbed_copy (); } +MAKE_SCHEME_CALLBACK (Flag, pure_calc_y_offset, 3); +SCM +Flag::pure_calc_y_offset (SCM smob, + SCM /* beg */, + SCM /* end */) +{ + return internal_calc_y_offset (smob, true); +} + MAKE_SCHEME_CALLBACK (Flag, calc_y_offset, 1); SCM Flag::calc_y_offset (SCM smob) +{ + return internal_calc_y_offset (smob, false); +} + +SCM +Flag::internal_calc_y_offset (SCM smob, bool pure) { Grob *me = unsmob_grob (smob); Grob *stem = me->get_parent (X_AXIS); @@ -147,7 +165,9 @@ Flag::calc_y_offset (SCM smob) Real blot = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); - Real y2 = stem->extent (stem, Y_AXIS)[d]; + Real y2 = pure + ? stem->pure_height (stem, 0, INT_MAX)[d] + : stem->extent (stem, Y_AXIS)[d]; return scm_from_double (y2 - d * blot / 2); } diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index c150806678..d48091537a 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -264,7 +264,9 @@ Stem_tremolo::y_offset (Grob *me, bool pure) } Real end_y - = stem->extent (stem, Y_AXIS)[stemdir] + = (pure + ? stem->pure_height (stem, 0, INT_MAX)[stemdir] + : stem->extent (stem, Y_AXIS)[stemdir]) - stemdir * max (beam_count, 1) * beam_translation - Stem::beam_end_corrective (stem); diff --git a/lily/stem.cc b/lily/stem.cc index 5195b6cfab..47e6797125 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -127,10 +127,13 @@ Stem::set_stem_positions (Grob *me, Real se) if (d && d * head_positions (me)[get_grob_direction (me)] >= se * d) me->warning (_ ("weird stem size, check for narrow beams")); - Interval height = me->pure_height (me, 0, INT_MAX); + // trigger note collision mechanisms + Real stem_beg = internal_calc_stem_begin_position (me, false); Real staff_space = Staff_symbol_referencer::staff_space (me); Real half_space = staff_space * 0.5; + Interval height; + height[-d] = stem_beg * half_space; height[d] = se * half_space + beam_end_corrective (me); Real stemlet_length = robust_scm2double (me->get_property ("stemlet-length"), diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 666abc54cf..32f68f5a50 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -2703,6 +2703,7 @@ (,ly:axis-group-interface::calc-staff-staff-spacing . ,ly:axis-group-interface::calc-pure-staff-staff-spacing) (,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height) (,ly:beam::rest-collision-callback . ,ly:beam::pure-rest-collision-callback) + (,ly:flag::calc-y-offset . ,ly:flag::pure-calc-y-offset) (,ly:grob::stencil-height . ,pure-stencil-height) (,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height) (,ly:rest-collision::force-shift-callback-rest . ,pure-chain-offset-callback) @@ -2722,7 +2723,6 @@ (list parenthesize-elements laissez-vibrer::print - ly:flag::calc-y-offset ly:rest::y-offset-callback ly:staff-symbol-referencer::callback ly:staff-symbol::height)) -- 2.39.2