lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Better pure height approximations for beamed rests. (issue4860043)


From: mtsolo
Subject: Better pure height approximations for beamed rests. (issue4860043)
Date: Wed, 10 Aug 2011 15:53:21 +0000

Reviewers: ,

Description:
Better pure height approximations for beamed rests.

Please review this at http://codereview.appspot.com/4860043/

Affected files:
  A input/regression/beam-rest-extreme.ly
  M lily/rest.cc


Index: input/regression/beam-rest-extreme.ly
diff --git a/input/regression/beam-rest-extreme.ly b/input/regression/beam-rest-extreme.ly
new file mode 100644
index 0000000000000000000000000000000000000000..770bd78939efbfa3ff6fc6428addb46bf0e75254
--- /dev/null
+++ b/input/regression/beam-rest-extreme.ly
@@ -0,0 +1,14 @@
+\version "2.15.9"
+
+\header {
+  texidoc = "Beamed rests are given a pure height approximation
+that gets their spacing correct in the majority of circumstances.
+"
+}
+
+\relative c'' {
+  <f b c f>16[ r <f bes c f> <f b c f>]
+  <f b c f>16[ r <f'' bes c f> <f b c f>]
+  <f b c f>16[ r <f,, bes c f> <f b c f>]
+  <f'' b c f>16[ r <f bes c f> <f b c f>]
+}
Index: lily/rest.cc
diff --git a/lily/rest.cc b/lily/rest.cc
index 97deba3f8fc93b41cce9767f0a17b851bcafe301..ea0fdda77ace62736b95b799d43e4a3af2c126f7 100644
--- a/lily/rest.cc
+++ b/lily/rest.cc
@@ -19,13 +19,16 @@

 #include "rest.hh"

+#include "beam.hh"
 #include "directional-element-interface.hh"
 #include "dots.hh"
 #include "font-interface.hh"
 #include "international.hh"
 #include "output-def.hh"
 #include "paper-score.hh"
+#include "pointer-group-interface.hh"
 #include "staff-symbol-referencer.hh"
+#include "stem.hh"
 #include "stencil.hh"
 #include "grob.hh"

@@ -54,6 +57,7 @@ Rest::y_offset_callback (SCM smob)
   if (!position_override)
     amount += 2 * ss * get_grob_direction (me);;

+
   return scm_from_double (amount);
 }

@@ -226,7 +230,59 @@ Rest::pure_height (SCM smob,
 {
   Grob *me = unsmob_grob (smob);
   SCM m = brew_internal_stencil (me, false);
-  return ly_interval2scm (unsmob_stencil (m)->extent (Y_AXIS));
+  Interval ext = unsmob_stencil (m)->extent (Y_AXIS);
+
+  int line_count = Staff_symbol_referencer::line_count (me);
+  Real ss = Staff_symbol_referencer::staff_space (me);
+
+ // Wont play nicely with weird staves where individual line positions are set...
+  Interval y_ext (-line_count * ss / 2.0, line_count * ss / 2.0);
+
+  Real amount = 0.0;
+
+  Grob *st = unsmob_grob (me->get_object ("stem"));
+  Grob *stem = st;
+  if (!stem)
+    return ly_interval2scm (ext);
+  Grob *beam = unsmob_grob (stem->get_object ("beam"));
+  if (!beam
+      || !Beam::has_interface (beam)
+      || !Beam::normal_stem_count (beam))
+    return ly_interval2scm (ext);
+
+  extract_grob_set (beam, "stems", stems);
+  vector<Grob *> my_stems;
+
+  for (vsize i = 0; i < stems.size (); i++)
+    if (Stem::head_count (stems[i]) || stems[i] == stem)
+      my_stems.push_back (stems[i]);
+
+  vsize idx = -1;
+
+  for (vsize i = 0; i < my_stems.size (); i++)
+    if (my_stems[i] == stem)
+      {
+        idx = i;
+        break;
+      }
+  Grob *left;
+  Grob *right;
+
+  if (idx == -1 || my_stems.size () == 1)
+    return ly_interval2scm (ext);
+  else if (idx == 0)
+    left = right = my_stems[1];
+  else if (idx == my_stems.size () - 1)
+    left = right = my_stems[idx - 1];
+  else
+    {
+      left = my_stems[idx - 1];
+      right = my_stems[idx + 1];
+    }
+  Direction beamdir = get_grob_direction (beam);
+ amount = min (max (minmax (beamdir, Stem::head_positions (left)[beamdir], Stem::head_positions (right)[beamdir]) / 2.0, y_ext[DOWN]), y_ext[UP]);
+
+  return ly_interval2scm (ext + amount);
 }

 ADD_INTERFACE (Rest,





reply via email to

[Prev in Thread] Current Thread [Next in Thread]