From: Mike Solomon <mike@apollinemike.com>
Date: Wed, 28 Dec 2011 08:15:41 +0000 (+0100)
Subject: Adds vertical skylines to slurs.
X-Git-Tag: release/2.15.24-1~36
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=19520fd5bbd221ca1d35011d7710e233c92a44b0;p=lilypond.git

Adds vertical skylines to slurs.

This assures that objects with an outside staff priority higher than
that of slurs are placed directly above the slur at their horizontal
position instead of above the slur's extrema in a given direction.

This is done by giving slurs vertical skylines that are the integral of
their curve.  Because the axis-group-interface automatically uses
vertical-skylines, no extra check for this property has to be added.
---

diff --git a/input/regression/slur-vertical-skylines.ly b/input/regression/slur-vertical-skylines.ly
new file mode 100644
index 0000000000..3fd51838fb
--- /dev/null
+++ b/input/regression/slur-vertical-skylines.ly
@@ -0,0 +1,16 @@
+\version "2.15.22"
+
+\header {
+  texidoc = "Slurs do not force grobs with outside-staff-priority
+too high.
+"
+}
+
+\relative c' {
+  f8^"rit"( c' f c' f) r8 r4 |
+  c2( c,2 |
+  g1)~\startTrillSpan
+  g1\stopTrillSpan
+  g1(\f
+  g,1)
+}
\ No newline at end of file
diff --git a/lily/general-scheme.cc b/lily/general-scheme.cc
index 8a84062bb6..e73ab0b927 100644
--- a/lily/general-scheme.cc
+++ b/lily/general-scheme.cc
@@ -114,6 +114,18 @@ LY_DEFINE (ly_dir_p, "ly:dir?",
   return SCM_BOOL_F;
 }
 
+LY_DEFINE (ly_vsize_p, "ly:vsize?",
+           1, 0, 0, (SCM s),
+           "Is @var{s} a vsize?")
+{
+  if (scm_is_integer (s))
+    {
+      int i = scm_to_int (s);
+      return i >= 0 ? SCM_BOOL_T : SCM_BOOL_F;
+    }
+  return SCM_BOOL_F;
+}
+
 LY_DEFINE (ly_assoc_get, "ly:assoc-get",
            2, 2, 0,
            (SCM key, SCM alist, SCM default_value, SCM strict_checking),
diff --git a/lily/include/lily-guile.hh b/lily/include/lily-guile.hh
index 8e6999ca1a..0690b073dc 100644
--- a/lily/include/lily-guile.hh
+++ b/lily/include/lily-guile.hh
@@ -72,6 +72,7 @@ char *ly_scm2str0 (SCM str);
 
 Real robust_scm2double (SCM, double);
 int robust_scm2int (SCM, int);
+vsize robust_scm2vsize (SCM, vsize);
 Direction robust_scm2dir (SCM, Direction);
 Drul_array<Real> robust_scm2drul (SCM, Drul_array<Real>);
 Drul_array<bool> robust_scm2booldrul (SCM, Drul_array<bool>);
diff --git a/lily/include/slur.hh b/lily/include/slur.hh
index 78659c9317..70b6821315 100644
--- a/lily/include/slur.hh
+++ b/lily/include/slur.hh
@@ -36,6 +36,7 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
   DECLARE_SCHEME_CALLBACK (pure_height, (SCM, SCM, SCM));
   DECLARE_SCHEME_CALLBACK (height, (SCM));
+  DECLARE_SCHEME_CALLBACK (vertical_skylines, (SCM));
   DECLARE_SCHEME_CALLBACK (outside_slur_callback, (SCM, SCM));
   DECLARE_SCHEME_CALLBACK (pure_outside_slur_callback, (SCM, SCM, SCM, SCM));
   DECLARE_SCHEME_CALLBACK (outside_slur_cross_staff, (SCM, SCM));
diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc
index 6aa40f7804..6035a91983 100644
--- a/lily/lily-guile.cc
+++ b/lily/lily-guile.cc
@@ -565,6 +565,18 @@ robust_scm2int (SCM k, int o)
   return o;
 }
 
+vsize
+robust_scm2vsize (SCM k, vsize o)
+{
+  if (scm_integer_p (k) == SCM_BOOL_T)
+    {
+      o = scm_to_int (k);
+      if (o >= 0)
+        return (vsize) o;
+    }
+  return o;
+}
+
 SCM
 ly_rational2scm (Rational r)
 {
diff --git a/lily/slur.cc b/lily/slur.cc
index 91b4e2bb2c..6fdbb41d1b 100644
--- a/lily/slur.cc
+++ b/lily/slur.cc
@@ -32,6 +32,7 @@
 #include "note-column.hh"
 #include "output-def.hh"
 #include "spanner.hh"
+#include "skyline-pair.hh"
 #include "staff-symbol-referencer.hh"
 #include "stem.hh"
 #include "text-interface.hh"
@@ -373,6 +374,29 @@ Slur::outside_slur_callback (SCM grob, SCM offset_scm)
   return scm_from_double (offset + avoidance_offset);
 }
 
+MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Slur, vertical_skylines, 1, 0, "");
+SCM
+Slur::vertical_skylines (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  vector<Box> boxes;
+
+  if (!me)
+    return Skyline_pair (boxes, 0.0, X_AXIS).smobbed_copy ();
+
+  Bezier curve = Slur::get_curve (me);
+  vsize box_count = robust_scm2vsize (me->get_property ("skyline-quantizing"), 10);
+  for (vsize i = 0; i < box_count; i++)
+    {
+      Box b;
+      b.add_point (curve.curve_point (i * 1.0 / box_count));
+      b.add_point (curve.curve_point ((i + 1) * 1.0 / box_count));
+      boxes.push_back (b);
+    }
+
+  return Skyline_pair (boxes, 0.0, X_AXIS).smobbed_copy ();
+}
+
 /*
  * Used by Slur_engraver:: and Phrasing_slur_engraver::
  */
@@ -546,8 +570,10 @@ ADD_INTERFACE (Slur,
                "inspect-index "
                "line-thickness "
                "note-columns "
+               "skyline-quantizing "
                "positions "
                "ratio "
                "thickness "
+               "vertical-skylines "
               );
 
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index b8c4ecc900..cef87c6254 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -1098,6 +1098,8 @@ relevant for finding the @code{pure-Y-extent}.")
 
      (side-support-elements ,ly:grob-array? "The side support, an array of
 grobs.")
+     (skyline-quantizing ,ly:vsize? "The number of boxes to break a
+slur into when calculating its skyline.")
      (slur ,ly:grob? "A pointer to a @code{Slur} object.")
      (spacing ,ly:grob? "The spacing spanner governing this section.")
      (spacing-wishes ,ly:grob-array? "An array of note spacing or staff spacing
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index 4c61c7c7fe..0a9a0e7385 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -1637,6 +1637,7 @@
 	(springs-and-rods . ,ly:spanner::set-spacing-rods)
 	(stencil . ,ly:slur::print)
 	(thickness . 1.1)
+	(vertical-skylines . ,ly:slur::vertical-skylines)
 	(Y-extent . ,ly:slur::height)
 	(meta . ((class . Spanner)
 		 (interfaces . (slur-interface))))))
@@ -1794,6 +1795,7 @@
 	(springs-and-rods . ,ly:spanner::set-spacing-rods)
 	(stencil . ,ly:slur::print)
 	(thickness . 1.2)
+	(vertical-skylines . ,ly:slur::vertical-skylines)
 	(Y-extent . ,ly:slur::height)
 	(meta . ((class . Spanner)
 		 (interfaces . (slur-interface))))))
diff --git a/scm/lily.scm b/scm/lily.scm
index e9f728f854..63582939c5 100644
--- a/scm/lily.scm
+++ b/scm/lily.scm
@@ -551,6 +551,7 @@ messages into errors.")
     (,ly:translator? . "translator")
     (,ly:translator-group? . "translator group")
     (,ly:unpure-pure-container? . "unpure/pure container")
+    (,ly:vsize? . "vsize")
     ))
 
 
diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm
index 269e99c270..0be4f8c558 100644
--- a/scm/safe-lily.scm
+++ b/scm/safe-lily.scm
@@ -144,6 +144,7 @@
    ly:unit
    ly:usage
    ly:version
+   ly:vsize?
    ly:warning
 
    ;; FIXME: cannot change staff size in --safe-mode