]> git.donarmstrong.com Git - lilypond.git/blob - lily/horizontal-align-item.cc
release: 0.1.7
[lilypond.git] / lily / horizontal-align-item.cc
1 /*
2   horizontal-align-item.cc -- implement Horizontal_align_item
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "horizontal-align-item.hh"
10
11
12 IMPLEMENT_IS_TYPE_B1(Horizontal_align_item,Item);
13 void
14 Horizontal_align_item::OK() const
15 {
16    for  (int i =0; i < item_l_arr_.size(); i++) 
17        assert ( pcol_l_ == item_l_arr_[i]->pcol_l_ );
18 }
19 bool
20 Horizontal_align_item::contains_b(Item *i)const
21 {
22     return item_l_arr_.find_l(i);
23 }
24
25 void
26 Horizontal_align_item::add(Item *i,int p)
27 {
28     assert(! contains_b(i));
29     priority_i_arr_.push(p);
30     item_l_arr_.push(i);
31     add_dependency(i);
32 }
33
34 void
35 Horizontal_align_item::do_substitute_dependency(Score_elem*o,Score_elem*n)
36 {
37     int i;
38     while ((i = item_l_arr_.find_i(o->item())) >=0) {
39         if (n)
40             item_l_arr_[i] = n->item();
41         else
42             item_l_arr_.del(i);
43     }
44 }
45
46 struct Horizontal_align_item_content {
47     Item * item_l_;
48     int priority_i_;
49     static int compare (Horizontal_align_item_content const &h1, 
50                         Horizontal_align_item_content const &h2) {
51         return h1.priority_i_ - h2.priority_i_;
52     }
53     Horizontal_align_item_content(Item*i, int p) {
54         priority_i_ = p;
55         item_l_ = i;
56     }
57     Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
58 };
59
60
61 void
62 Horizontal_align_item::do_pre_processing()
63 {
64     OK();
65     {  
66         Array<Horizontal_align_item_content> content;
67         for  (int i =0; i < item_l_arr_.size(); i++) 
68             content.push(
69                 Horizontal_align_item_content(
70                     item_l_arr_[i], priority_i_arr_[i]));
71         content.sort(Horizontal_align_item_content::compare);
72         item_l_arr_.clear();
73         priority_i_arr_.clear();
74         for  (int i =0; i < content.size(); i++) {
75             item_l_arr_.push( content[i].item_l_ );
76             priority_i_arr_.push( content[i].priority_i_);
77         }
78     }
79     
80     Array<Interval> dims;
81     Real total =0;
82     for  (int i =0; i < item_l_arr_.size(); i++) {
83         
84         Interval item_width= item_l_arr_[i]->width();
85         if (item_width.empty_b()) {
86             item_width = Interval(0,0);
87         }
88         dims.push( item_width);
89         total += item_width.length();
90     }
91
92     Real where_f= total * (align_i_-1.0)/2.0;
93     Real center_dx_f = 0;
94     for ( int i=0 ;  i < item_l_arr_.size(); i++) {
95         Real dx = where_f -dims[i][-1];
96         item_l_arr_[i]->translate( dx , X_AXIS);
97         if (item_l_arr_[i] == center_l_)
98             center_dx_f = where_f;
99         where_f += dims[i].length();
100     }
101     if (center_dx_f && !align_i_ )
102         for ( int i=0 ;  i < item_l_arr_.size(); i++) 
103             item_l_arr_[i]->translate( - center_dx_f , X_AXIS);
104     
105 }
106
107 Interval
108 Horizontal_align_item::do_width() const
109 {
110     return Interval(0,0);
111 }
112
113 void
114 Horizontal_align_item::do_print()const
115 {
116 }
117
118 Horizontal_align_item::Horizontal_align_item()
119 {
120     center_l_ = 0;
121     align_i_ = 0;
122     empty_b_ = true;
123     transparent_b_ = true;
124 }