X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdot-column.cc;h=2d49465eb9b4df0cd9cad142fded8fd6cc1b1dff;hb=6b93aa32e32d736202d803c68f5156cc253a5f7c;hp=cd95dfc0396acf5333d661cb764cb98c8af9a47a;hpb=50f63a8534024c9588078efb732a1ae8b94103e8;p=lilypond.git diff --git a/lily/dot-column.cc b/lily/dot-column.cc index cd95dfc039..2d49465eb9 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -3,10 +3,11 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2003 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys */ -#include +#include +#include #include #include "dots.hh" @@ -19,8 +20,6 @@ #include "axis-group-interface.hh" #include "stem.hh" -using std::set; - /* TODO: let Dot_column communicate with stem via Note_column. */ @@ -34,16 +33,16 @@ Dot_column::force_shift_callback (SCM element_smob, SCM axis) assert (a == Y_AXIS); me = me->get_parent (X_AXIS); - if (!to_boolean (me->get_grob_property ("collision-done"))) + if (!to_boolean (me->get_property ("positioning-done"))) { - me->set_grob_property ("collision-done", SCM_BOOL_T); + me->set_property ("positioning-done", SCM_BOOL_T); do_shifts (me); } return gh_double2scm (0.0); } -MAKE_SCHEME_CALLBACK(Dot_column,side_position, 2); +MAKE_SCHEME_CALLBACK (Dot_column,side_position, 2); SCM Dot_column::side_position (SCM element_smob, SCM axis) { @@ -51,11 +50,11 @@ Dot_column::side_position (SCM element_smob, SCM axis) Axis a = (Axis) gh_scm2int (axis); assert (a == X_AXIS); - Grob * stem = unsmob_grob (me->get_grob_property ("stem")); + Grob * stem = unsmob_grob (me->get_property ("stem")); if (stem && !Stem::get_beam (stem) && Stem::duration_log (stem) > 2 - && !Stem::invisible_b (stem) + && !Stem::is_invisible (stem) ) { /* @@ -233,6 +232,26 @@ Dot_column::do_shifts (Grob*me) { Link_array dots = Pointer_group_interface__extract_grobs (me, (Grob*)0, "dots"); + + { /* + Trigger note collision resolution first, since that may kill off + dots when merging. + */ + Grob * c = 0; + for (int i = dots.size (); i-- ; ) + { + Grob * n = dots[i]->get_parent (Y_AXIS); + if (c) + c = n->common_refpoint (c, X_AXIS); + else + c = n; + } + for (int i = dots.size (); i-- ; ) + { + Grob * n = dots[i]->get_parent (Y_AXIS); + n->relative_coordinate (c , X_AXIS); + } + } dots.sort (compare_position); for (int i = dots.size (); i--;) @@ -248,16 +267,16 @@ Dot_column::do_shifts (Grob*me) Grob * note = dots[i]->get_parent (Y_AXIS); if (note) { - Grob *stem = unsmob_grob (note->get_grob_property ("stem")); + Grob *stem = unsmob_grob (note->get_property ("stem")); if (stem) dp.extremal_head_ = Stem::first_head (stem) == note; } - int p = int (Staff_symbol_referencer::get_position (dp.dot_)); + int p = Staff_symbol_referencer::get_rounded_position (dp.dot_); dp.pos_= p; if (dp.extremal_head_) - dp.dir_ = to_dir (dp.dot_->get_grob_property ("direction")); + dp.dir_ = to_dir (dp.dot_->get_property ("direction")); remove_collision (cfg, p); cfg[p] = dp; @@ -277,7 +296,7 @@ Dot_column::do_shifts (Grob*me) void Dot_column::add_head (Grob * me, Grob *rh) { - Grob * d = unsmob_grob (rh->get_grob_property ("dot")); + Grob * d = unsmob_grob (rh->get_property ("dot")); if (d) { Side_position_interface::add_support (me,rh); @@ -292,6 +311,8 @@ Dot_column::add_head (Grob * me, Grob *rh) ADD_INTERFACE (Dot_column, "dot-column-interface", - "Interface that groups dots so they form a column", - "direction stem"); + "Groups dot objects so they form a column, and position dots so they do not " + "clash with staff lines " + , + "positioning-done direction stem");