X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fscript-column.cc;h=cc8cfcacb0b5d0d22ce005a1e644ef83c96322ee;hb=fdfd147f1233eef6ea8b176290221b5a4ec38868;hp=9d9231e549d107b193e3fa5097f90fce897a51f4;hpb=1a66290a98e7de8d6d41485b5b71a9f7e1fe35c7;p=lilypond.git diff --git a/lily/script-column.cc b/lily/script-column.cc index 9d9231e549..cc8cfcacb0 100644 --- a/lily/script-column.cc +++ b/lily/script-column.cc @@ -1,104 +1,82 @@ -/* - script-column.cc -- implement Script_column - +/* + g-script-column.cc -- implement Script_column + source file of the GNU LilyPond music typesetter - - (c) 1997 Han-Wen Nienhuys -*/ - + + (c) 1999--2000 Han-Wen Nienhuys + + */ #include "script-column.hh" -#include "debug.hh" -#include "script.hh" -#include "note-head.hh" -#include "stem.hh" - - -IMPLEMENT_IS_TYPE_B1(Script_column,Horizontal_vertical_group_item); - +#include "side-position-interface.hh" +#include "dimension-cache.hh" +#include "group-interface.hh" void -Script_column::add (Script*s_l) +Script_column::add_staff_sided (Item *i) { - script_l_arr_.push (s_l); - add_dependency (s_l); - add_element (s_l); + SCM p = i->get_elt_property ("script-priority"); + if (!gh_number_p (p)) + return; + + + Pointer_group_interface gi (this, "scripts"); + gi.add_element (i); + + add_dependency (i); } - -void -Script_column::do_print()const +Script_column::Script_column (SCM s) + : Item (s) { -#ifndef NPRINT - DOUT << "scripts: " << script_l_arr_.size() << '\n'; -#endif + set_elt_pointer ("scripts", SCM_EOL); } static int -idx (bool inside, int dir) +staff_side_compare (Item * const &i1, + Item * const &i2) { - int j = (dir+1); - if ( !inside) - j ++; - return j; + SCM p1 = i1->get_elt_property ("script-priority"); + SCM p2 = i2->get_elt_property ("script-priority"); + + return gh_scm2int (p1) - gh_scm2int (p2); } -void -Script_column::do_pre_processing() +GLUE_SCORE_ELEMENT(Script_column,before_line_breaking); +SCM +Script_column::member_before_line_breaking () { - if (!script_l_arr_.size()) - return; - - /* up+inside, up+outside, down+inside, down+outside */ - Array placed_l_arr_a[4]; - for (int i=0; i < script_l_arr_.size(); i++) { - Script*s_l = script_l_arr_[i]; - placed_l_arr_a[idx (s_l->inside_staff_b_ , s_l->dir_i_) ].push (s_l); - } - - for (int j =0; j <4; j++) { - placed_l_arr_a[j].sort (Script::compare); + Drul_array > arrs; + Link_array staff_sided + = Pointer_group_interface__extract_elements (this, (Item*)0, "scripts"); + + + for (int i=0; i < staff_sided.size (); i++) + { + Side_position_interface st (staff_sided[i]); + arrs[st.get_direction ()].push (staff_sided[i]); } - - for (int j =0; j < 4; j++) { - if (placed_l_arr_a[j].size()) - for (int i=0; i < support_l_arr_.size(); i++) - placed_l_arr_a[j][0]->add_support (support_l_arr_[i]); - } + Direction d = DOWN; + do { + Link_array &arr(arrs[d]); - Item * support_l=0; - int j = 0; - for (; j < 2; j++) { - for (int i=0; i < placed_l_arr_a[j].size(); i++) { - if (support_l) - placed_l_arr_a[j][i]->add_support (support_l); - support_l = placed_l_arr_a[j][i]; - } - } - support_l = 0; - for (; j < 4; j++) { - for (int i=0; i < placed_l_arr_a[j].size(); i++) { - if (support_l) - placed_l_arr_a[j][i]->add_support (support_l); - support_l = placed_l_arr_a[j][i]; - } - } -} - + arr.sort (staff_side_compare); + + Item * last = 0; + for (int i=0; i < arr.size (); i++) + { + Side_position_interface s (arr[i]); + if (last) + { + s.add_support (last); + } + + arr[i]->remove_elt_property ("script-priority"); + last = arr[i]; + } + + } while (flip (&d) != DOWN); -void -Script_column::add_support (Item*i_l) -{ - support_l_arr_.push (i_l); - add_dependency (i_l); - add_element (i_l); + return SCM_UNDEFINED; } -void -Script_column::do_substitute_dependency (Score_elem*o,Score_elem*n) -{ - if (o->item()) { - script_l_arr_.substitute ((Script*)o->item(),(Script*) (n?n->item ():0)); - support_l_arr_.substitute (o->item(), (n?n->item ():0)); - } -}