X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdot-column.cc;h=1aa0b728c0657618f6839be6818691cee898848a;hb=bed2a69b131afe27801ac467fea9f7f402949705;hp=46b13811be3c9c20c70826c9b13b195ee60064e0;hpb=f875ef39c544bd3499dae5360e9e24f69933575f;p=lilypond.git diff --git a/lily/dot-column.cc b/lily/dot-column.cc index 46b13811be..1aa0b728c0 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2012 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 @@ -109,16 +109,17 @@ Dot_column::calc_positioning_done (SCM smob) y.add_point (y1); y.add_point (y2); + + stems.insert (s); } else if (Note_head::has_interface (s)) - y = Interval (-1, 1); + y = Interval (-1.1, 1.1); else { programming_error ("unknown grob in dot col support"); continue; } - y *= 2 / ss; y += Staff_symbol_referencer::get_position (s); Box b (s->extent (commonx, X_AXIS), y); @@ -143,7 +144,14 @@ Dot_column::calc_positioning_done (SCM smob) } } - vector_sort (dots, position_less); + /* + The use of pure_position_less and pure_get_rounded_position below + are due to the fact that this callback is called before line breaking + occurs. Because dots' actual Y posiitons may be linked to that of + beams (dots are attached to rests, which are shifted to avoid beams), + we instead must use their pure Y positions. + */ + vector_sort (dots, pure_position_less); for (vsize i = dots.size (); i--;) { if (!dots[i]->is_live ()) @@ -164,21 +172,18 @@ Dot_column::calc_positioning_done (SCM smob) Grob *note = dots[i]->get_parent (Y_AXIS); if (note) { - Grob *stem = unsmob_grob (note->get_object ("stem")); - if (stem) - dp.extremal_head_ = Stem::first_head (stem) == note; + if (Note_head::has_interface (note)) + dp.dir_ = to_dir (dp.dot_->get_property ("direction")); dp.x_extent_ = note->extent (commonx, X_AXIS); } - int p = Staff_symbol_referencer::get_rounded_position (dp.dot_); + int p = Staff_symbol_referencer::pure_get_rounded_position (dp.dot_); /* icky, since this should go via a Staff_symbol_referencer offset callback but adding a dot overwrites Y-offset. */ p += (int) robust_scm2double (dp.dot_->get_property ("staff-position"), 0.0); dp.pos_ = p; - if (dp.extremal_head_) - dp.dir_ = to_dir (dp.dot_->get_property ("direction")); cfg.remove_collision (p); cfg[p] = dp; @@ -194,7 +199,7 @@ Dot_column::calc_positioning_done (SCM smob) /* Junkme? */ - Staff_symbol_referencer::set_position (i->second.dot_, i->first); + Staff_symbol_referencer::pure_set_position (i->second.dot_, i->first); } me->translate_axis (cfg.x_offset () - me->relative_coordinate (commonx, X_AXIS), @@ -233,5 +238,6 @@ ADD_INTERFACE (Dot_column, "dots " "positioning-done " "direction " + "note-collision " );