X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdot-column.cc;h=b2ff0308fac19b82bd251167a4255d2698e9bcb0;hb=ade39b0e10fdf852db6254afac36473a1c66a4d3;hp=6a1cc7ef029ea4398baacf1460b981e0411d075d;hpb=889dc430ee110fc9f7b66d9f8768fb746bb2b12a;p=lilypond.git diff --git a/lily/dot-column.cc b/lily/dot-column.cc index 6a1cc7ef02..b2ff0308fa 100644 --- a/lily/dot-column.cc +++ b/lily/dot-column.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2005 Han-Wen Nienhuys + (c) 1997--2007 Han-Wen Nienhuys */ #include "dot-column.hh" @@ -14,41 +14,46 @@ using namespace std; #include "dots.hh" +#include "dot-column.hh" #include "rhythmic-head.hh" #include "staff-symbol-referencer.hh" #include "directional-element-interface.hh" #include "side-position-interface.hh" #include "axis-group-interface.hh" #include "stem.hh" +#include "grob.hh" #include "pointer-group-interface.hh" /* TODO: let Dot_column communicate with stem via Note_column. */ -MAKE_SCHEME_CALLBACK (Dot_column, side_position, 2); +MAKE_SCHEME_CALLBACK (Dot_column, side_position, 1); SCM -Dot_column::side_position (SCM element_smob, SCM axis) +Dot_column::side_position (SCM smob) { - Grob *me = unsmob_grob (element_smob); - (void) axis; - assert (scm_to_int (axis) == X_AXIS); - - Grob *stem = unsmob_grob (me->get_object ("stem")); - if (stem - && !Stem::get_beam (stem) - && Stem::duration_log (stem) > 2 - && !Stem::is_invisible (stem)) + Grob *me = unsmob_grob (smob); + extract_grob_set (me, "dots", dots); + + for (vsize i = 0; i < dots.size (); i++) { - /* - trigger stem end & direction calculation. - - This will add the stem to the support if a flag collision happens. - */ - stem->get_property ("stem-end-position"); + Grob *head = dots[i]->get_parent (Y_AXIS); + Grob *stem = head ? unsmob_grob (head->get_object ("stem")) : 0; + if (stem + && !Stem::get_beam (stem) + && Stem::duration_log (stem) > 2 + && !Stem::is_invisible (stem)) + { + /* + trigger stem end & direction calculation. + + This will add the stem to the support if a flag collision happens. + */ + stem->get_property ("stem-end-position"); + } } - - return Side_position_interface::aligned_side (element_smob, axis); + + return Side_position_interface::x_aligned_side (smob, SCM_EOL); } struct Dot_position @@ -63,6 +68,7 @@ struct Dot_position dot_ = 0; pos_ = 0; dir_ = CENTER; + extremal_head_ = false; } }; @@ -131,7 +137,7 @@ shift_one (Dot_configuration const &cfg, int p = i->first; if (p == k) { - if (Staff_symbol_referencer::on_staffline (i->second.dot_, p)) + if (Staff_symbol_referencer::on_line (i->second.dot_, p)) p += d; else p += 2* d; @@ -158,7 +164,7 @@ shift_one (Dot_configuration const &cfg, int p = i->first; if (p == k) { - if (Staff_symbol_referencer::on_staffline (i->second.dot_, p)) + if (Staff_symbol_referencer::on_line (i->second.dot_, p)) p += d; else p += 2* d; @@ -207,7 +213,10 @@ SCM Dot_column::calc_positioning_done (SCM smob) { Grob *me = unsmob_grob (smob); - Link_array dots + + me->set_property ("positioning-done", SCM_BOOL_T); + + vector dots = extract_grob_array (me, "dots"); { /* @@ -215,7 +224,7 @@ Dot_column::calc_positioning_done (SCM smob) dots when merging. */ Grob *c = 0; - for (int i = dots.size (); i--;) + for (vsize i = dots.size (); i--;) { Grob *n = dots[i]->get_parent (Y_AXIS); if (c) @@ -223,20 +232,20 @@ Dot_column::calc_positioning_done (SCM smob) else c = n; } - for (int i = dots.size (); i--;) + for (vsize 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--;) + vector_sort (dots, position_less); + for (vsize i = dots.size (); i--;) if (!dots[i]->is_live ()) - dots.del (i); + dots.erase (dots.begin () + i); Dot_configuration cfg; - for (int i = 0;i < dots.size (); i++) + for (vsize i = 0;i < dots.size (); i++) { Dot_position dp; dp.dot_ = dots[i]; @@ -250,6 +259,10 @@ Dot_column::calc_positioning_done (SCM smob) } int p = Staff_symbol_referencer::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_) @@ -257,14 +270,18 @@ Dot_column::calc_positioning_done (SCM smob) remove_collision (cfg, p); cfg[p] = dp; - if (Staff_symbol_referencer::on_staffline (dp.dot_, p)) + if (Staff_symbol_referencer::on_line (dp.dot_, p)) remove_collision (cfg, p); } for (Dot_configuration::const_iterator i (cfg.begin ()); i != cfg.end (); i++) - Staff_symbol_referencer::set_position (i->second.dot_, i->first); - + { + /* + Junkme? + */ + Staff_symbol_referencer::set_position (i->second.dot_, i->first); + } return SCM_BOOL_T; } @@ -277,19 +294,19 @@ Dot_column::add_head (Grob *me, Grob *rh) Side_position_interface::add_support (me, rh); Pointer_group_interface::add_grob (me, ly_symbol2scm ("dots"), d); - d->add_offset_callback (Grob::other_axis_parent_positioning_proc, Y_AXIS); + d->set_property ("Y-offset", Grob::x_parent_positioning_proc); Axis_group_interface::add_element (me, d); } } ADD_INTERFACE (Dot_column, - "dot-column-interface", "Groups dot objects so they form a column, and position dots so they do not " "clash with staff lines ", /* properties */ + "dots " "positioning-done " "direction " - "stem"); + );