lilypond-devel
[Top][All Lists]
Advanced

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

Re: Restore dots that overflow chords; issue 3179 (issue 8266047)


From: k-ohara5a5a
Subject: Re: Restore dots that overflow chords; issue 3179 (issue 8266047)
Date: Sat, 02 Nov 2013 21:43:00 +0000

Reviewers: Trevor Daniels, lemzwerg,

Message:
On 2013/11/02 06:40:52, lemzwerg wrote:


https://codereview.appspot.com/8266047/diff/60001/input/regression/chord-dots.ly#newcode12
input/regression/chord-dots.ly:12: \override
Staff.DotColumn.chord-dots-limit =
#1
What about adding the default case (chord-dots-limit = #3) for
comparison?

I did include comparisons for the earlier patch review, but for the
pushed regression test I want short output that looks good when the code
works, and looks odd if it ever fails.

Description:
Remove dots that overflow chords, working individually on each voice;
issue 3179


Please review this at https://codereview.appspot.com/8266047/

Affected files (+56, -4 lines):
  A input/regression/chord-dots.ly
  M lily/dot-column.cc
  M scm/define-grob-properties.scm
  M scm/define-grobs.scm


Index: input/regression/chord-dots.ly
diff --git a/input/regression/chord-dots.ly b/input/regression/chord-dots.ly
new file mode 100644
index 0000000000000000000000000000000000000000..957788d4bc61edf3df9ed7e3985ee7f6d607a449
--- /dev/null
+++ b/input/regression/chord-dots.ly
@@ -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: lily/dot-column.cc
diff --git a/lily/dot-column.cc b/lily/dot-column.cc
index 6cba432639deb7f8fd899a53a577987253787762..9b4a3831b0199b46d98ed4e0436175b88d38fd10 100644
--- a/lily/dot-column.cc
+++ b/lily/dot-column.cc
@@ -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: scm/define-grob-properties.scm
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index a5b0895c9bbfea3ccc2e23d9bfa26204d6c82e54..ef5b69da913d51561703037549b84cdb2460f9d9 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -170,6 +170,9 @@ when a spanner is broken at a line break.")
 ;;;
 ;;; c
 ;;;
+     (chord-dots-limit ,integer? "Limits the stack of dots
+on a chord to the height of the chord plus
address@hidden 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: scm/define-grobs.scm
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index a4e0d52a760b45a237b12438cae84932586fbd1f..de27efca1e2ab013add0735a7dd2afb2b13b479f 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -727,6 +727,7 @@
     (DotColumn
      . (
         (axes . (,X))
+        (chord-dots-limit . 3)
         (direction . ,RIGHT)
         (positioning-done . ,ly:dot-column::calc-positioning-done)
         (X-extent . ,ly:axis-group-interface::width)





reply via email to

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