]> git.donarmstrong.com Git - lilypond.git/commitdiff
Forbids slur and tie extrema points from getting to close.
authorMike Solomon <mike@apollinemike.com>
Fri, 15 Jun 2012 06:37:47 +0000 (08:37 +0200)
committerMike Solomon <mike@apollinemike.com>
Fri, 15 Jun 2012 06:37:47 +0000 (08:37 +0200)
input/regression/slur-tie-control-points.ly [new file with mode: 0644]
lily/include/slur-score-parameters.hh
lily/slur-configuration.cc
lily/slur-score-parameters.cc
scm/layout-slur.scm

diff --git a/input/regression/slur-tie-control-points.ly b/input/regression/slur-tie-control-points.ly
new file mode 100644 (file)
index 0000000..a682a98
--- /dev/null
@@ -0,0 +1,11 @@
+\version "2.15.41"
+
+\header {
+  texidoc = "Slurs and ties should never share extremal control points.
+"
+}
+\paper { ragged-right = ##f }
+
+\relative c'' {
+  c1~( c2 g)
+}
index 47993885428946d6640aed388d16d82e008d676d..75b1ae8e4623cd75c45917e968a5a24f472cae30 100644 (file)
@@ -46,6 +46,8 @@ struct Slur_score_parameters
   Real head_slur_distance_max_ratio_;
   Real head_slur_distance_factor_;
   Real encompass_object_range_overshoot_;
+  Real slur_tie_extrema_min_distance_;
+  Real slur_tie_extrema_min_distance_penalty_;
 
   void fill (Grob *him);
 };
index c446ca1a12cbf59d9c9a1ef0d621253dfdf59dab..6095cdf35bc61f1c0d743cdee61eb7ef891ed6bd 100644 (file)
@@ -28,6 +28,7 @@
 #include "spanner.hh"
 #include "staff-symbol-referencer.hh"
 #include "stem.hh"
+#include "tie.hh"
 #include "warn.hh"
 
 Bezier
@@ -316,6 +317,39 @@ Slur_configuration::score_encompass (Slur_score_state const &state)
 void
 Slur_configuration::score_extra_encompass (Slur_score_state const &state)
 {
+  // we find forbidden attachments
+  vector<Offset> forbidden_attachments;
+  for (vsize i = 0; i < state.extra_encompass_infos_.size (); i++)
+    if (Tie::has_interface (state.extra_encompass_infos_[i].grob_))
+      {
+        Grob *t = state.extra_encompass_infos_[i].grob_;
+        Grob *common_x = Grob::get_vertical_axis_group (t);
+        Real rp = t->relative_coordinate (common_x, X_AXIS);
+        SCM cp = t->get_property ("control-points");
+
+        Bezier b;
+        int j = 0;
+        for (SCM s = cp; scm_is_pair (s); s = scm_cdr (s))
+          {
+            b.control_[j] = ly_scm2offset (scm_car (s));
+            j++;
+          }
+        forbidden_attachments.push_back (Offset (b.control_[0]) + Offset (rp, 0));
+        forbidden_attachments.push_back (Offset (b.control_[3]) + Offset (rp, 0));
+      }
+
+  bool too_close = false;
+  for (vsize k = 0; k < forbidden_attachments.size (); k++)
+    for (LEFT_and_RIGHT (side))
+      if ((forbidden_attachments[k] - attachment_[side]).length () < state.parameters_.slur_tie_extrema_min_distance_)
+        {
+          too_close = true;
+          break;
+        }
+
+  if (too_close)
+    add_score (state.parameters_.slur_tie_extrema_min_distance_penalty_, "extra");
+
   for (vsize j = 0; j < state.extra_encompass_infos_.size (); j++)
     {
       Drul_array<Offset> attachment = attachment_;
index 6a0768e73029b107e2ddbed5ca662bd886213594..a8cbe4b7f90b7d610ad240633f6153de0e0cdc95 100644 (file)
@@ -78,4 +78,8 @@ Slur_score_parameters::fill (Grob *me)
     = get_detail (details, ly_symbol2scm ("close-to-edge-length"));
   encompass_object_range_overshoot_
     = get_detail (details, ly_symbol2scm ("encompass-object-range-overshoot"));
+  slur_tie_extrema_min_distance_
+    = get_detail (details, ly_symbol2scm ("slur-tie-extrema-min-distance"));
+  slur_tie_extrema_min_distance_penalty_
+    = get_detail (details, ly_symbol2scm ("slur-tie-extrema-min-distance-penalty"));
 }
index 59b4e2a078331f396648c187a3ace2497e656025..ff47dbb93826c263854d668dadea12be773f204d 100644 (file)
@@ -38,4 +38,6 @@
     (edge-slope-exponent . 1.7)
     (close-to-edge-length . 2.5)
     (encompass-object-range-overshoot . 0.5)
+    (slur-tie-extrema-min-distance . 0.2)
+    (slur-tie-extrema-min-distance-penalty . 2)
     ))