/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2001--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2001--2015 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.
for (vsize i = 0; i < note_columns.size (); i++)
{
SCM r = note_columns[i]->get_object ("rest");
- Grob *g = unsmob_grob (r);
+ Grob *g = unsmob<Grob> (r);
Grob *col = note_columns[i]->get_column ();
if (!g)
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;
for (vsize i = 0; i < items.size (); i++)
{
Item *it = dynamic_cast<Item *> (items[i]);
- if (!Note_column::has_interface (it))
+ if (!has_interface<Note_column> (it))
continue;
if (d == RIGHT && it->get_column () != rcolumn)
continue;
if (!hp.is_empty ())
{
Real ss = Staff_symbol_referencer::staff_space (stem);
- stem_posns[d] = stem->pure_height (stem, 0, INT_MAX) * (2 / ss);
+ stem_posns[d] = stem->pure_y_extent (stem, 0, INT_MAX) * (2 / ss);
head_posns[d].unite (hp);
}
}
&& !acc_right)
correction = same_direction_correction (me, head_posns);
- *fixed += correction;
*space += correction;
/* there used to be a correction for bar_xextent () here, but