/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2001--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2001--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "stem.hh"
#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.
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
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;
}
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;
&& !acc_right)
correction = same_direction_correction (me, head_posns);
- *fixed += correction;
*space += correction;
/* there used to be a correction for bar_xextent () here, but