X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdot-column.cc;h=1aa0b728c0657618f6839be6818691cee898848a;hb=c20bed72fb602fabf67087649df283f1978a9d94;hp=fff2359cc0376f774e46ab531798213e0dd62e40;hpb=4bb29573149a0ffa1f881c5e38a0fe68e9e76b67;p=lilypond.git diff --git a/lily/dot-column.cc b/lily/dot-column.cc index fff2359cc0..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); @@ -132,21 +133,25 @@ Dot_column::calc_positioning_done (SCM smob) i != stems.end (); i++) { Grob *stem = (*i); - Stencil flag = Stem::flag (stem); - if (!flag.is_empty ()) + Grob *flag = Stem::flag (stem); + if (flag) { - Interval y = flag.extent (Y_AXIS) - * (2 / ss) - + Stem::stem_end_position (stem); - - Interval x = stem->relative_coordinate (commonx, X_AXIS) - + flag.extent (X_AXIS); + Grob *commony = stem->common_refpoint (flag, Y_AXIS); + Interval y = flag->extent (commony, Y_AXIS) * (2 / ss); + Interval x = flag->extent (commonx, X_AXIS); boxes.push_back (Box (x, y)); } } - 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 ()) @@ -167,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; @@ -197,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), @@ -236,5 +238,6 @@ ADD_INTERFACE (Dot_column, "dots " "positioning-done " "direction " + "note-collision " );