]> git.donarmstrong.com Git - lilypond.git/blob - lily/horizontal-align-item.cc
972b52f8e0812f0472f6b5a177d6e37bbcdf2501
[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
14
15 bool
16 Horizontal_align_item::contains_b(Item *i)const
17 {
18     return item_l_arr_.find_l(i);
19 }
20
21 void
22 Horizontal_align_item::add(Item *i,int p)
23 {
24     assert(! contains_b(i));
25     priority_i_arr_.push(p);
26     item_l_arr_.push(i);
27     add_dependency(i);
28 }
29
30 void
31 Horizontal_align_item::do_substitute_dependency(Score_elem*o,Score_elem*n)
32 {
33     int i;
34     while ((i = item_l_arr_.find_i(o->item())) >=0) {
35         if (n)
36             item_l_arr_[i] = n->item();
37         else
38             item_l_arr_.del(i);
39     }
40 }
41
42 struct Horizontal_align_item_content {
43     Item * item_l_;
44     int priority_i_;
45     static int compare (Horizontal_align_item_content const &h1, 
46                         Horizontal_align_item_content const &h2) {
47         return h1.priority_i_ - h2.priority_i_;
48     }
49     Horizontal_align_item_content(Item*i, int p) {
50         priority_i_ = p;
51         item_l_ = i;
52     }
53     Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
54 };
55
56
57 void
58 Horizontal_align_item::do_pre_processing()
59 {
60     {  
61         Array<Horizontal_align_item_content> content;
62         for  (int i =0; i < item_l_arr_.size(); i++) 
63             content.push(
64                 Horizontal_align_item_content(
65                     item_l_arr_[i], priority_i_arr_[i]));
66         content.sort(Horizontal_align_item_content::compare);
67         item_l_arr_.set_size(0);
68         priority_i_arr_.set_size(0);
69         for  (int i =0; i < content.size(); i++) {
70             item_l_arr_.push( content[i].item_l_ );
71             priority_i_arr_.push( content[i].priority_i_);
72         }
73     }
74     
75     Array<Interval> dims;
76     Real total =0;
77     for  (int i =0; i < item_l_arr_.size(); i++) {
78         
79         Interval item_width= item_l_arr_[i]->width();
80         if (item_width.empty_b()) {
81             item_width = Interval(0,0);
82         }
83         dims.push( item_width);
84         total += item_width.length();
85     }
86
87     Real where_f= total * (align_i_-1.0)/2.0;
88     Real center_dx_f = 0;
89     for ( int i=0 ;  i < item_l_arr_.size(); i++) {
90         Real dx = where_f -dims[i][-1];
91         item_l_arr_[i]->translate_x( dx );
92         if (item_l_arr_[i] == center_l_)
93             center_dx_f = where_f;
94         where_f += dims[i].length();
95     }
96     if (center_dx_f && !align_i_ )
97         for ( int i=0 ;  i < item_l_arr_.size(); i++) 
98             item_l_arr_[i]->translate_x( - center_dx_f );
99     
100 }
101
102 Interval
103 Horizontal_align_item::do_width() const
104 {
105     return Interval(0,0);
106 }
107
108 void
109 Horizontal_align_item::do_print()const
110 {
111 }
112
113 Horizontal_align_item::Horizontal_align_item()
114 {
115     center_l_ = 0;
116     align_i_ = 0;
117     empty_b_ = true;
118     transparent_b_ = true;
119 }