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,
_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-devel