]> git.donarmstrong.com Git - lilypond.git/commitdiff
Correctly calculates stem-begin-position for merged stems.
authorMike Solomon <mike@apollinemike.com>
Wed, 4 Apr 2012 07:36:28 +0000 (09:36 +0200)
committerMike Solomon <mike@apollinemike.com>
Wed, 4 Apr 2012 07:36:28 +0000 (09:36 +0200)
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 [new file with mode: 0644]
lily/flag.cc
lily/stem-tremolo.cc
lily/stem.cc
scm/define-grobs.scm

diff --git a/input/regression/flag-stem-begin-position.ly b/input/regression/flag-stem-begin-position.ly
new file mode 100644 (file)
index 0000000..05c755b
--- /dev/null
@@ -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
index 39859088979696d4c42b08bc249eadbd5b902dbd..f997d6fe457f44626cddc7bec2579788b4046a69 100644 (file)
@@ -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);
 }
index c1508066783b1f26cb468aa4915f842a602c60de..d48091537aca3d55cc033389ef47dab9d126d43b 100644 (file)
@@ -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);
 
index 5195b6cfab814887acd0ed079f930cfe4130e89f..47e679712519e198cbc295763c3009cd17706d88 100644 (file)
@@ -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"),
index 666abc54cf7f59fce1b0838aa7d09ca7f458d78e..32f68f5a509a8e4343b53d42d61a39fc3b3ff6e8 100644 (file)
     (,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)
   (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))