]> git.donarmstrong.com Git - lilypond.git/blob - lily/script-column.cc
release: 0.0.70pre
[lilypond.git] / lily / script-column.cc
1 /*
2   script-column.cc -- implement Script_column
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "script-column.hh"
10 #include "debug.hh"
11 #include "script.hh"
12 #include "note-head.hh"
13 #include "stem.hh"
14
15 IMPLEMENT_STATIC_NAME(Script_column);
16 IMPLEMENT_IS_TYPE_B1(Script_column,Horizontal_vertical_group_item);
17
18
19 void
20 Script_column::add(Script*s_l)
21 {
22     script_l_arr_.push(s_l);
23     add_element(s_l);
24 }
25
26
27 void
28 Script_column::do_print()const
29 {
30     mtor << "scripts: " << script_l_arr_.size() << '\n'; 
31 }
32 static int
33 idx(bool inside, int dir)
34 {
35     int j = (dir+1);
36     if ( !inside )
37         j ++;
38     return j;
39 }
40
41 void
42 Script_column::do_pre_processing()
43 {
44     if (!script_l_arr_.size()) 
45         return;
46     
47     /* up+inside, up+outside, down+inside, down+outside */
48     Array<Script*> placed_l_arr_a[4];
49     for (int i=0; i < script_l_arr_.size(); i++) {
50         Script*s_l = script_l_arr_[i];
51         placed_l_arr_a[idx( s_l->inside_staff_b_ , s_l->dir_i_) ].push(s_l);
52     }
53     
54     for (int j =0; j <4; j++) {
55         placed_l_arr_a[j].sort( Script::compare);
56     }
57
58
59     for (int j =0; j < 4; j++) {
60         if (placed_l_arr_a[j].size())
61             for (int i=0; i  < support_l_arr_.size(); i++)
62                 placed_l_arr_a[j][0]->add_support( support_l_arr_[i]);
63     }
64     
65     Item * support_l=0;
66     int j = 0;
67     for (; j < 2; j++ ) {
68         for (int i=0; i < placed_l_arr_a[j].size(); i++) {
69             if (support_l)
70                 placed_l_arr_a[j][i]->add_support(support_l);
71             support_l = placed_l_arr_a[j][i];
72         }
73     }
74     support_l = 0;
75     for (; j < 4; j++ ) {
76         for (int i=0; i < placed_l_arr_a[j].size(); i++) {
77             if (support_l)
78                 placed_l_arr_a[j][i]->add_support(support_l);
79             support_l = placed_l_arr_a[j][i];
80         }
81     }
82 }
83
84
85 void
86 Script_column::add_support(Item*i_l)
87 {
88     support_l_arr_.push(i_l);
89     add_element(i_l);
90 }
91
92 void
93 Script_column::do_substitute_dependency(Score_elem*o,Score_elem*n)
94 {
95     Horizontal_vertical_group::do_substitute_dependency(o,n);
96     if (o->item()) {
97         script_l_arr_.substitute((Script*)o->item(),(Script*) (n?n->item():0));
98         support_l_arr_.substitute(o->item(), (n?n->item():0));
99     }
100 }