[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)