]> git.donarmstrong.com Git - lilypond.git/commitdiff
Remove dots that overflow chords; issue 3179
authorKeith OHara <k-ohara5a5a@oco.net>
Sun, 7 Apr 2013 05:31:45 +0000 (22:31 -0700)
committerKeith OHara <k-ohara5a5a@oco.net>
Thu, 7 Nov 2013 05:40:03 +0000 (21:40 -0800)
input/regression/chord-dots.ly [new file with mode: 0644]
lily/dot-column.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

diff --git a/input/regression/chord-dots.ly b/input/regression/chord-dots.ly
new file mode 100644 (file)
index 0000000..957788d
--- /dev/null
@@ -0,0 +1,17 @@
+\version "2.17.16"
+
+\header {
+  texidoc =
+"The column of dots on a chord is limited to the height
+of the chord plus @code{chord-dots-limit} staff-positions."
+}
+
+\layout{ ragged-right = ##t }
+
+\new Staff \transpose c c' {
+  \override Staff.DotColumn.chord-dots-limit = #1
+  <<
+    { <g a b c' d' e'>4. r8 <c' d' e' f' g' a' b'>4. r8 } \\
+    { f4.. r16 <c d e f g a b>4.. r16}
+  >>
+}
index 6cba432639deb7f8fd899a53a577987253787762..9b4a3831b0199b46d98ed4e0436175b88d38fd10 100644 (file)
@@ -59,7 +59,7 @@ Dot_column::calc_positioning_done (SCM smob)
   vector<Grob *> dots
     = extract_grob_array (me, "dots");
 
-  vector<Grob *> main_heads;
+  vector<Grob *> parent_stems;
   Real ss = 0;
 
   Grob *commonx = me;
@@ -73,7 +73,7 @@ Dot_column::calc_positioning_done (SCM smob)
           commonx = stem->common_refpoint (commonx, X_AXIS);
 
           if (Stem::first_head (stem) == n)
-            main_heads.push_back (n);
+            parent_stems.push_back (stem);
         }
     }
 
@@ -83,8 +83,8 @@ Dot_column::calc_positioning_done (SCM smob)
   extract_grob_set (me, "side-support-elements", support);
 
   Interval base_x;
-  for (vsize i = 0; i < main_heads.size (); i++)
-    base_x.unite (main_heads[i]->extent (commonx, X_AXIS));
+  for (vsize i = 0; i < parent_stems.size (); i++)
+    base_x.unite (Stem::first_head (parent_stems[i])->extent (commonx, X_AXIS));
 
   for (vsize i = 0; i < support.size (); i++)
     {
@@ -152,6 +152,36 @@ Dot_column::calc_positioning_done (SCM smob)
     we instead must use their pure Y positions.
   */
   vector_sort (dots, pure_position_less);
+
+  SCM chord_dots_limit = me->get_property ("chord-dots-limit");
+  if (scm_is_number (chord_dots_limit))
+    {
+      // Sort dots by stem, then check for dots above the limit for each stem
+      vector <vector <Grob *> > dots_each_stem (parent_stems.size ());
+      for (vsize i = 0; i < dots.size (); i++)
+        if (Grob *stem = unsmob_grob (dots[i]->get_parent (Y_AXIS)
+                                      -> get_object ("stem")))
+          for (vsize j = 0; j < parent_stems.size (); j++)
+            if (stem == parent_stems[j])
+              {
+                dots_each_stem[j].push_back (dots[i]);
+                break;
+              }
+      for (vsize j = 0; j < parent_stems.size (); j++)
+        {
+          Interval chord = Stem::head_positions (parent_stems[j]);
+          int total_room = ((int) chord.length () + 2
+                            + scm_to_int (chord_dots_limit)) / 2;
+          int total_dots = dots_each_stem[j].size ();
+          // remove excessive dots from the ends of the stem
+          for (int first_dot = 0; total_dots > total_room; total_dots--)
+            if (0 == (total_dots - total_room) % 2)
+              dots_each_stem[j][first_dot++]->suicide ();
+            else
+              dots_each_stem[j][first_dot + total_dots - 1]->suicide ();
+        }
+    }
+
   for (vsize i = dots.size (); i--;)
     {
       if (!dots[i]->is_live ())
@@ -236,6 +266,7 @@ ADD_INTERFACE (Dot_column,
                " dots so they do not clash with staff lines.",
 
                /* properties */
+               "chord-dots-limit "
                "dots "
                "positioning-done "
                "direction "
index a5b0895c9bbfea3ccc2e23d9bfa26204d6c82e54..8fae43bcd121026770270c4b411ce3e2ffc289a4 100644 (file)
@@ -170,6 +170,9 @@ when a spanner is broken at a line break.")
 ;;;
 ;;; c
 ;;;
+     (chord-dots-limit ,integer? "Limits the column of dots
+on each chord to the height of the chord plus
+@code{chord-dots-limit} staff-positions.")
      (circled-tip ,boolean? "Put a circle at start/@/end of
 hairpins (al/@/del niente).")
      (clip-edges ,boolean? "Allow outward pointing beamlets at the
index a4e0d52a760b45a237b12438cae84932586fbd1f..de27efca1e2ab013add0735a7dd2afb2b13b479f 100644 (file)
     (DotColumn
      . (
         (axes . (,X))
+        (chord-dots-limit . 3)
         (direction . ,RIGHT)
         (positioning-done . ,ly:dot-column::calc-positioning-done)
         (X-extent . ,ly:axis-group-interface::width)