]> git.donarmstrong.com Git - lilypond.git/blob - lily/g-script-column.cc
release: 1.1.38
[lilypond.git] / lily / g-script-column.cc
1 /*   
2   g-script-column.cc --  implement G_script_column
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include "g-script-column.hh"
10 #include "g-staff-side.hh"
11
12 static G_staff_side_item *
13 get_g_staff_side (Item *i)
14 {
15   Graphical_element *e1 = i->dim_cache_[Y_AXIS].parent_l_->element_l ();
16
17   return dynamic_cast<G_staff_side_item*>(e1);
18 }
19
20 void
21 G_script_column::add_staff_sided (Item *i)
22 {
23   SCM p = get_g_staff_side (i)->get_elt_property (script_priority_scm_sym);
24   if (p == SCM_BOOL_F)
25     return;
26   
27   staff_sided_item_l_arr_.push (i);
28   add_dependency (i);
29 }
30
31 static int
32 staff_side_compare (Item * const &i1,
33                     Item * const &i2)
34 {
35   Score_element *e1 = get_g_staff_side (i1);
36   Score_element *e2 = get_g_staff_side (i2);
37
38   SCM p1 = e1->get_elt_property (script_priority_scm_sym);
39   SCM p2 = e2->get_elt_property (script_priority_scm_sym);
40
41   return gh_scm2int (SCM_CDR(p1)) - gh_scm2int (SCM_CDR(p2));
42 }
43
44 void
45 G_script_column::do_pre_processing ()
46 {
47   Drul_array<Link_array<Item> > arrs;
48
49   for (int i=0; i < staff_sided_item_l_arr_.size (); i++)
50     {
51       G_staff_side_item * ip = get_g_staff_side (staff_sided_item_l_arr_[i]);
52       arrs[ip->dir_].push (staff_sided_item_l_arr_[i]);
53     }
54
55   Direction d = DOWN;
56   do {
57     Link_array<Item> &arr(arrs[d]);
58     
59     arr.sort (staff_side_compare);
60
61     Item * last = 0;
62     for (int i=0; i < arr.size (); i++)
63       {
64         G_staff_side_item * gs = get_g_staff_side (arr[i]);
65         if (last)
66           {
67             gs->add_support (last);
68             gs->add_support (get_g_staff_side (last));
69           }
70             
71         gs->remove_elt_property (script_priority_scm_sym);
72         last = arr[i];
73       }
74     
75   } while (flip (&d) != DOWN);
76 }