X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-spacing.cc;h=a894be25394c9a41ba44a5db8870e79e686c574b;hb=5d84bfad4626892bcffd05adcced53c8a2329047;hp=e59aa6ec841f4660148a4e104759aeebae25afea;hpb=f8416b959b1eb78740a329681d4d58ac6c090854;p=lilypond.git diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index e59aa6ec84..a894be2539 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2001--2012 Han-Wen Nienhuys + Copyright (C) 2001--2015 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,10 +35,6 @@ #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. @@ -53,7 +49,7 @@ Note_spacing::get_spacing (Grob *me, Item *right_col, 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 (r); Grob *col = note_columns[i]->get_column (); if (!g) @@ -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 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 head_posns) void Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Real increment, - Real *space, Real *fixed) + Real *space) { Drul_array stem_dirs (CENTER, CENTER); Drul_array stem_posns; @@ -237,7 +228,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, for (vsize i = 0; i < items.size (); i++) { Item *it = dynamic_cast (items[i]); - if (!Note_column::has_interface (it)) + if (!has_interface (it)) continue; if (d == RIGHT && it->get_column () != rcolumn) continue; @@ -274,7 +265,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, 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); } } @@ -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