X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdot-column.cc;h=736588a0e05282ba687abe2a9ba14682d8bce838;hb=8d0267eb80a7cb026751db0a9eabeb61d958776e;hp=cfd51975ac96abfd809569cd8bb1a7422f655204;hpb=94189ec2b8da6d7e89dc619c646a927adead9b19;p=lilypond.git diff --git a/lily/dot-column.cc b/lily/dot-column.cc index cfd51975ac..736588a0e0 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--2001 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys */ #include "dots.hh" @@ -14,21 +14,51 @@ #include "directional-element-interface.hh" #include "side-position-interface.hh" #include "axis-group-interface.hh" +#include "stem.hh" +/* + TODO: let Dot_column communicate with stem via Note_column. + */ +MAKE_SCHEME_CALLBACK (Dot_column,force_shift_callback,2); +SCM +Dot_column::force_shift_callback (SCM element_smob, SCM axis) +{ + Grob *me = unsmob_grob (element_smob); + Axis a = (Axis) gh_scm2int (axis); + assert (a == Y_AXIS); + me = me->get_parent (X_AXIS); + SCM l = me->get_grob_property ("dots"); + do_shifts (l); + return gh_double2scm (0.0); +} - - -void -Dot_column::set_interface (Grob* me) +MAKE_SCHEME_CALLBACK(Dot_column,side_position, 2); +SCM +Dot_column::side_position (SCM element_smob, SCM axis) { + Grob *me = unsmob_grob (element_smob); + Axis a = (Axis) gh_scm2int (axis); + assert (a == X_AXIS); + + Grob * stem = unsmob_grob (me->get_grob_property ("stem")); + if (stem + && !Stem::get_beam (stem) + && Stem::duration_log (stem) > 2 + && !Stem::invisible_b (stem) + ) + { + /* + trigger stem end & direction calculation. - Directional_element_interface::set (me, RIGHT); - - Axis_group_interface::set_interface (me); - Axis_group_interface::set_axes (me, X_AXIS,X_AXIS); + This will add the stem to the support if a flag collision happens. + */ + Stem::stem_end_position (stem); + } + return Side_position_interface::aligned_side (element_smob, axis); } + /* Will fuck up in this case. @@ -44,29 +74,14 @@ Dot_column::set_interface (Grob* me) Should be smarter. */ - - -MAKE_SCHEME_CALLBACK(Dot_column,force_shift_callback,2); -SCM -Dot_column::force_shift_callback (SCM element_smob, SCM axis) -{ - Grob *me = unsmob_grob (element_smob); - Axis a = (Axis) gh_scm2int (axis); - assert (a == Y_AXIS); - me = me->parent_l (X_AXIS); - SCM dots = me->get_grob_property ("dots"); - do_shifts (dots); - return gh_double2scm (0.0); -} - SCM Dot_column::do_shifts (SCM l) { Link_array dots; while (gh_pair_p (l)) { - dots.push (unsmob_grob (gh_car (l))); - l = gh_cdr (l); + dots.push (unsmob_grob (ly_car (l))); + l = ly_cdr (l); } dots.sort (compare_position); @@ -80,7 +95,7 @@ Dot_column::do_shifts (SCM l) int conflicts = 0; for (int i=0; i < dots.size (); i++) { - Real p = Staff_symbol_referencer::position_f (dots[i]); + Real p = Staff_symbol_referencer::get_position (dots[i]); for (int j=0; j < taken_posns.size (); j++) { if (taken_posns[j] == (int) p) @@ -88,7 +103,7 @@ Dot_column::do_shifts (SCM l) } taken_posns.push ((int)p); s.unite (Slice ((int)p, - (int)p)); + (int)p)); } if (!conflicts) @@ -99,7 +114,7 @@ Dot_column::do_shifts (SCM l) +1 -> off by one */ int pos = middle - dots.size () + 1; - if (!(pos % 2)) + if (! (pos % 2)) pos ++; // center () rounds down. for (int i=0; i < dots.size (); pos += 2, i++) @@ -111,11 +126,6 @@ Dot_column::do_shifts (SCM l) return SCM_UNSPECIFIED; } -bool -Dot_column::has_interface (Grob*m) -{ - return m && m->has_interface (ly_symbol2scm ("dot-column-interface")); -} void @@ -124,11 +134,18 @@ Dot_column::add_head (Grob * me, Grob *rh) Grob * d = unsmob_grob (rh->get_grob_property ("dot")); if (d) { - Side_position::add_support (me,rh); + Side_position_interface::add_support (me,rh); - Pointer_group_interface ::add_element (me, "dots",d); + Pointer_group_interface::add_grob (me, ly_symbol2scm ("dots"), d); d->add_offset_callback (Dot_column::force_shift_callback_proc , Y_AXIS); Axis_group_interface::add_element (me, d); } } + + + +ADD_INTERFACE (Dot_column, "dot-column-interface", + "Interface that groups dots so they form a column", + "direction stem"); +