diff options
author | Keith OHara <k-ohara5a5a@oco.net> | 2013-12-17 17:20:22 -0800 |
---|---|---|
committer | Keith OHara <k-ohara5a5a@oco.net> | 2014-01-03 20:20:36 -0800 |
commit | 50e45591ccb79a49a738af09e692df64d343c951 (patch) | |
tree | 7aa7807e496fdeda42af425813d1ff01f64d4a41 | |
parent | f8416b959b1eb78740a329681d4d58ac6c090854 (diff) |
note-spacing: let compressibility be uniform; issue 3304
Comments implied that half the width of accidentals, etc., was added
to the ideal spacing between notes, but in fact only compressibility
was affected. The non-uniform compressibility caused note-spacing
to become non-uniform when the lines were compressed. For example
A sequence {\stemUp a a d a] would have the head of the D tuck under
the preceding A.
This commit keeps spacing uniform on compressed lines until objects
come within padding of each other.
-rw-r--r-- | input/regression/baerenreiter-sarabande.ly | 7 | ||||
-rw-r--r-- | input/regression/spanner-alignment.ly | 2 | ||||
-rw-r--r-- | lily/include/note-spacing.hh | 2 | ||||
-rw-r--r-- | lily/note-spacing.cc | 28 |
4 files changed, 14 insertions, 25 deletions
diff --git a/input/regression/baerenreiter-sarabande.ly b/input/regression/baerenreiter-sarabande.ly index 426bbf4b18..892359dfc2 100644 --- a/input/regression/baerenreiter-sarabande.ly +++ b/input/regression/baerenreiter-sarabande.ly @@ -1,6 +1,6 @@ \version "2.17.6" -forcedLastBreak = { \break } +forcedLastBreak = {} %% { \break } if needed to match original breaks %% We want this to perfectly match the Bärenreiter spacing. %% If we're not using 6 systems, there's definitely a problem. @@ -171,10 +171,9 @@ smallerPaper = \layout { ragged-bottom = ##t indent = 7. \mm line-width =183.5 \mm - obsolete-between-system-space = 25\mm - system-system-spacing #'basic-distance = #(/ obsolete-between-system-space staff-space) + system-system-spacing #'basic-distance = 14.22 % 25mm, in staff-spaces system-system-spacing #'padding = #0 - score-system-spacing #'basic-distance = #(/ obsolete-between-system-space staff-space) + score-system-spacing #'basic-distance = #0 score-system-spacing #'padding = #0 system-count = 6 diff --git a/input/regression/spanner-alignment.ly b/input/regression/spanner-alignment.ly index 02e04ece7d..2b4210841d 100644 --- a/input/regression/spanner-alignment.ly +++ b/input/regression/spanner-alignment.ly @@ -16,7 +16,7 @@ ignoring things like pedal marks. } \new Dynamics = "dynamics" { \repeat unfold 2 { - s1\cresc s1\f s1\dim s1\p + s1\cresc s1\f s1\dim s1\p \break } } \new Staff = "down" { diff --git a/lily/include/note-spacing.hh b/lily/include/note-spacing.hh index 945362ab06..b8788f92ff 100644 --- a/lily/include/note-spacing.hh +++ b/lily/include/note-spacing.hh @@ -31,7 +31,7 @@ public: static Spring get_spacing (Grob *me, Item *, Spring, Real); static void stem_dir_correction (Grob *me, Item *next_col, Real incr, - Real *, Real *); + Real *space); }; #endif /* NOTE_SPACING_HH */ diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index e59aa6ec84..4f5713c14a 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -36,10 +36,6 @@ #include "warn.hh" /* - TODO: detect hshifts due to collisions, and account for them in - spacing? -*/ -/* Adjust the ideal and minimum distance between note columns, based on the notehead size, skylines, and optical illusions. */ @@ -76,16 +72,11 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, The main factor that determines the amount of space is the width of the note head (or the rest). For example, a quarter rest gets almost 0.5 ss less horizontal space than a note. - - The other parts of a note column (eg. flags, accidentals, etc.) don't get - the full amount of space. We give them half the amount of space, but then - adjust things so there are no collisions. */ Real ideal = base.distance () - increment + left_head_end; Drul_array<Skyline> skys = Spacing_interface::skylines (me, right_col); Real distance = skys[LEFT].distance (skys[RIGHT], robust_scm2double (right_col->get_property ("skyline-vertical-padding"), 0.0)); Real min_dist = max (0.0, distance); - Real min_desired_space = (ideal + min_dist) / 2; base.set_min_distance (min_dist); /* If we have a NonMusical column on the right, we measure the ideal distance @@ -99,20 +90,20 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, Bar_line::non_empty_barline); if (bar) + ideal -= bar->extent (right_col, X_AXIS)[LEFT]; + else { - Real shift = bar->extent (right_col, X_AXIS)[LEFT]; - ideal -= shift; - min_desired_space -= max (shift, 0.0); + /* Measure ideal distance to the right side of the NonMusical column + but keep at least half the gap we would have had to a note */ + Real min_desired_space = (ideal + min_dist) / 2.0; + ideal -= right_col->extent (right_col, X_AXIS)[RIGHT]; + ideal = max (ideal, min_desired_space); } - else - ideal -= right_col->extent (right_col, X_AXIS)[RIGHT]; } - ideal = max (ideal, min_desired_space); - stem_dir_correction (me, right_col, increment, &ideal, &min_desired_space); + stem_dir_correction (me, right_col, increment, &ideal); base.set_distance (max (0.0, ideal)); - base.set_inverse_compress_strength (max (0.0, ideal - min_desired_space)); return base; } @@ -207,7 +198,7 @@ same_direction_correction (Grob *note_spacing, Drul_array<Interval> head_posns) void Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Real increment, - Real *space, Real *fixed) + Real *space) { Drul_array<Direction> stem_dirs (CENTER, CENTER); Drul_array<Interval> stem_posns; @@ -311,7 +302,6 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, && !acc_right) correction = same_direction_correction (me, head_posns); - *fixed += correction; *space += correction; /* there used to be a correction for bar_xextent () here, but |