From 9dfb621e27269b6757389d8ce6a33a4ca353030b Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sun, 7 Jan 2007 17:00:07 +0100 Subject: [PATCH] Fix #10. Reinstate bar-line to next-note spacing tweaks, and add to regression test. --- input/regression/spacing-bar-accidental.ly | 23 ++++ input/regression/spacing-bar-arpeggio.ly | 16 +++ input/regression/spacing-bar-stem.ly | 29 ++--- lily/include/staff-spacing.hh | 4 +- lily/spacing-spanner.cc | 4 +- lily/staff-spacing.cc | 132 +++++++++++++-------- scm/define-grobs.scm | 4 +- 7 files changed, 142 insertions(+), 70 deletions(-) create mode 100644 input/regression/spacing-bar-accidental.ly create mode 100644 input/regression/spacing-bar-arpeggio.ly diff --git a/input/regression/spacing-bar-accidental.ly b/input/regression/spacing-bar-accidental.ly new file mode 100644 index 0000000000..5a34a107d7 --- /dev/null +++ b/input/regression/spacing-bar-accidental.ly @@ -0,0 +1,23 @@ + +\header { + texidoc = "An accidental following a bar gets space so + the left edge of the acc is at 0.3 - 0.6 staff space of the bar line" +} + + +\version "2.11.10" +\layout{ + ragged-right = ##t +} + + +\relative c'' { + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #2 + + \time 1/4 + \stemUp + s4 + c4 + cis4 +} diff --git a/input/regression/spacing-bar-arpeggio.ly b/input/regression/spacing-bar-arpeggio.ly new file mode 100644 index 0000000000..fd84be5a9b --- /dev/null +++ b/input/regression/spacing-bar-arpeggio.ly @@ -0,0 +1,16 @@ +\header{ + texidoc = "An arpeggio following a bar gets space" + +} + +\version "2.10.10" + +\layout{ragged-right=##t} +\new Staff { + + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #1 + + s1 + 1\arpeggio +} diff --git a/input/regression/spacing-bar-stem.ly b/input/regression/spacing-bar-stem.ly index d580160507..3bcba2caca 100644 --- a/input/regression/spacing-bar-stem.ly +++ b/input/regression/spacing-bar-stem.ly @@ -1,26 +1,27 @@ -\version "2.10.0" \header { texidoc = "Downstem notes following a barline are printed with some extra space. This is an optical correction similar to juxtaposed stems. -Accidentals after the barline get some space as well. -" +The bar upstem should be approx 1.1 staff space, the bar downstem 1.3 +to 1.5 staff space." } -\layout { ragged-right = ##t} -\relative c'' -{ - - %%\override Staff.StaffSpacing #'stem-spacing-correction = #10 - %%\override Staff.NoteSpacing #'stem-spacing-correction = #10 - - \time 1/4 \stemDown c4 \stemUp c4 - \stemDown c4 \stemUp c4 - \stemDown f c,4 c'4 cis4 \stemUp c4 +\version "2.11.10" +\layout{ + ragged-right = ##t } - +\relative c'' { + \override Score.NonMusicalPaperColumn #'stencil = #ly:paper-column::print + \override Score.NonMusicalPaperColumn #'layer = #2 + + \time 1/4 + \stemDown + s4 + e4 + e,4 +} diff --git a/lily/include/staff-spacing.hh b/lily/include/staff-spacing.hh index af6d394ead..75cb644eed 100644 --- a/lily/include/staff-spacing.hh +++ b/lily/include/staff-spacing.hh @@ -15,8 +15,8 @@ class Staff_spacing { public: - static void next_notes_correction (Grob *, Grob *, Real *, Real *); - static void next_note_correction (Grob *, Grob *, Interval, Real*, Real *); + static void next_notes_correction (Grob *, Grob *, Real, Real, Real *, Real *); + static void next_note_correction (Grob *, Grob *, Interval, Real, Real, Real*, Real *, int *); DECLARE_GROB_INTERFACE(); static void get_spacing_params (Grob *, Real *, Real *); diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index a196c3990f..497474d7d1 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -421,8 +421,8 @@ Spacing_spanner::breakable_column_spacing (Grob *me, Item *l, Item *r, if (!spacing_grob || !Staff_spacing::has_interface (spacing_grob)) continue; - Real space; - Real fixed_space; + Real space = 0.; + Real fixed_space = 0.; /* column for the left one settings should be ok due automatic diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index 0f1ec15de1..c7023db3aa 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -30,65 +30,90 @@ void Staff_spacing::next_note_correction (Grob *me, Grob *g, Interval bar_size, + Real current_space, Real current_fixed, Real *space, - Real *fix) + Real *fix, + int *wish_count) { - (void)space; - + (void) current_fixed; if (!g || !Note_column::has_interface (g)) return ; Item *col = dynamic_cast (g)->get_column (); - Real max_corr = max (0., (- g->extent (col, X_AXIS)[LEFT])); + Real left_stickout_correction = max (0., (- g->extent (col, X_AXIS)[LEFT])); /* Duh. If this gets out of hand, we should invent something more generic. */ - if (Grob *a = Note_column::accidentals (g)) + Grob *accs = Note_column::accidentals (g); + if (accs) { Interval v; - if (Accidental_placement::has_interface (a)) - v = Accidental_placement::get_relevant_accidental_extent (a, col, me); + if (Accidental_placement::has_interface (accs)) + v = Accidental_placement::get_relevant_accidental_extent (accs, col, me); else - v = a->extent (col, X_AXIS); - - max_corr = max (max_corr, (- v[LEFT])); + v = accs->extent (col, X_AXIS); + + left_stickout_correction = max (left_stickout_correction, (- v[LEFT])); } - if (Grob *a = unsmob_grob (g->get_object ("arpeggio"))) - max_corr = max (max_corr, - a->extent (col, X_AXIS)[LEFT]); + Grob *arpeggio = unsmob_grob (g->get_object ("arpeggio")); + if (arpeggio) + left_stickout_correction = max (left_stickout_correction, - arpeggio->extent (col, X_AXIS)[LEFT]); + /* Let's decrease the space a little if the problem is not located after a barline. */ if (bar_size.is_empty ()) - max_corr *= 0.75; - - if (!bar_size.is_empty ()) - if (Grob *stem = Note_column::get_stem (g)) - { - Direction d = get_grob_direction (stem); - if (d == DOWN) - { - Real stem_start = Stem::head_positions (stem) [DOWN]; - Real stem_end = Stem::stem_end_position (stem); - Interval stem_posns (min (stem_start, stem_end), - max (stem_end, stem_start)); - - stem_posns.intersect (bar_size); - - Real corr = min (abs (stem_posns.length () / 7.0), 1.0); - corr *= robust_scm2double (me->get_property ("stem-spacing-correction"), 1); - - if (d != DOWN) - corr = 0.0; - max_corr = max (max_corr, corr); - } - } - - *fix += max_corr; -} + left_stickout_correction *= 0.75; + + /* + We want 0.3 ss before the sticking-out object. + + current_fixed/2 is our guess at (right side of left object + 0.3) + */ + left_stickout_correction += current_fixed/2 - current_space; + left_stickout_correction = max (left_stickout_correction, 0.0); + + + Real optical_corr = 0.0; + Grob *stem = Note_column::get_stem (g); + if (!bar_size.is_empty () + && !arpeggio + && !accs + && stem) + { + Direction d = get_grob_direction (stem); + if (Stem::is_normal_stem (stem) && d == DOWN) + { + Real stem_start = Stem::head_positions (stem) [DOWN]; + Real stem_end = Stem::stem_end_position (stem); + Interval stem_posns (min (stem_start, stem_end), + max (stem_end, stem_start)); + + stem_posns.intersect (bar_size); + + optical_corr = min (abs (stem_posns.length () / 7.0), 1.0); + optical_corr *= robust_scm2double (me->get_property ("stem-spacing-correction"), 1); + } + } + + Real correction = optical_corr + left_stickout_correction; + if (correction) + { + wish_count ++; + + /* + This minute adjustments don't make sense for widely spaced scores. + Hence, we need to keep the stretchable (that is, space - fix) + distance equal. + */ + *space += correction; + *fix += correction; + } +} /* Y-positions that are covered by BAR_GROB, in the case that it is a barline. */ @@ -121,8 +146,10 @@ Staff_spacing::bar_y_positions (Grob *bar_grob) pointers to the separation-items, not the note-columns or note-spacings. */ + void Staff_spacing::next_notes_correction (Grob *me, Grob *last_grob, + Real current_space, Real current_fixed, Real *compound_space, Real *compound_fixed ) { @@ -133,22 +160,23 @@ Staff_spacing::next_notes_correction (Grob *me, Grob *last_grob, *compound_fixed = 0.0; *compound_space = 0.0; int wish_count = 0; - + for (vsize i = right_items.size (); i--;) { Grob *g = right_items[i]; - - - if (Note_column::has_interface (g)) + if (Note_column::has_interface (right_items[i])) { + Grob *g = right_items[i]; + Real space = 0.0; Real fixed = 0.0; - next_note_correction (me, g, bar_size, &space, &fixed); - + next_note_correction (me, g, bar_size, + current_space, current_fixed, + &space, &fixed, &wish_count); + *compound_space += space; *compound_fixed += fixed; - wish_count ++; } else { @@ -157,13 +185,16 @@ Staff_spacing::next_notes_correction (Grob *me, Grob *last_grob, { Real space = 0.0; Real fixed = 0.0; - next_note_correction (me, elts[j], bar_size, &space, &fixed); + next_note_correction (me, elts[j], bar_size, + current_space, current_fixed, + &space, &fixed, + &wish_count); *compound_fixed += fixed; *compound_space += space; - wish_count ++; } } } + if (wish_count > 1) { *compound_space /= wish_count; @@ -260,8 +291,11 @@ Staff_spacing::get_spacing_params (Grob *me, Real *space, Real *fixed) *fixed = *space; } - Real correction_fixed, correction_space; - next_notes_correction (me, last_grob, &correction_space, &correction_fixed ); + Real correction_fixed = 0.0; + Real correction_space = 0.0; + next_notes_correction (me, last_grob, + *space, *fixed, + &correction_space, &correction_fixed ); *space += correction_space; *fixed += correction_fixed; } diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 35ed147712..0c76b85e5c 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -176,8 +176,6 @@ (layer . 0) (break-visibility . ,all-visible) (non-musical . #t) - (extra-spacing-width . (-0.3 . 0.3)) - (stencil . ,ly:bar-line::print) (glyph-name . ,bar-line::calc-glyph-name) (bar-size . ,ly:bar-line::calc-bar-size) @@ -189,7 +187,7 @@ (key-signature . (extra-space . 1.0)) (key-cancellation . (extra-space . 1.0)) (first-note . (fixed-space . 1.3)) - (next-note . (semi-fixed-space . 1.3)) + (next-note . (semi-fixed-space . 0.9)) (right-edge . (extra-space . 0.0)))) ;; -- 2.39.5