]> git.donarmstrong.com Git - lilypond.git/blob - lily/script-column.cc
release: 0.0.56
[lilypond.git] / lily / script-column.cc
1 /*
2   script-column.cc -- implement Script_column
3
4   source file of the 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 "notehead.hh"
13 #include "stem.hh"
14
15 IMPLEMENT_STATIC_NAME(Script_column);
16
17
18 void
19 Script_column::add(Script*s_l)
20 {
21     script_l_arr_.push(s_l);
22     add_dependency(s_l);
23 }
24
25 void
26 Script_column::translate(Offset o)
27 {
28     for (int i=0; i < script_l_arr_.size(); i++) 
29         script_l_arr_[i]->translate(o);
30 }
31
32
33 void
34 Script_column::do_print()const
35 {
36     mtor << "scripts: " << script_l_arr_.size() << '\n'; 
37 }
38
39 Interval
40 Script_column::do_height()const return r
41 {
42     for (int i=0; i < script_l_arr_.size(); i++) 
43         r.unite(script_l_arr_[i]->height());
44 }
45
46 Interval
47 Script_column::do_width()const 
48 {
49     Interval r;
50     for (int i=0; i < script_l_arr_.size(); i++) 
51         r.unite(script_l_arr_[i]->width());
52     return r;
53 }
54
55 void
56 Script_column::do_pre_processing()
57 {
58     if (!script_l_arr_.size()) 
59         return;
60     /* up+outside, up+inside, down+outside, down+inside */
61     Array<Script*> placed_l_arr_a[4];
62     for (int i=0; i < script_l_arr_.size(); i++) {
63         Script*s_l = script_l_arr_[i];
64         int j = (s_l->dir_i_ >0) ? 0 : 2;
65         if (!s_l->inside_staff_b_) 
66             j ++;
67         
68         placed_l_arr_a[j].push(s_l);
69     }
70     
71     for (int j =0; j <4; j++) {
72         placed_l_arr_a[j].sort( Script::compare);
73     }
74
75
76     for (int j =0; j < 4; j++) {
77         if (placed_l_arr_a[j].size())
78             for (int i=0; i  < support_l_arr_.size(); i++)
79                 placed_l_arr_a[j][0]->add_support( support_l_arr_[i]);
80     }
81     Item * support_l=0;
82     int j = 0;
83     for (; j < 2; j++ ) {
84         for (int i=1; i < placed_l_arr_a[j].size(); i++) {
85             if (support_l)
86                 placed_l_arr_a[j][i]->add_support(support_l);
87             support_l = placed_l_arr_a[j][i];
88         }
89     }
90     support_l = 0;
91     for (; j < 4; j++ ) {
92         for (int i=1; i < placed_l_arr_a[j].size(); i++) {
93             if (support_l)
94                 placed_l_arr_a[j][i]->add_support(support_l);
95             support_l = placed_l_arr_a[j][i];
96         }
97     }
98 }
99
100
101 void
102 Script_column::add_support(Item*i_l)
103 {
104     support_l_arr_.push(i_l);
105     add_dependency(i_l);
106 }