]> git.donarmstrong.com Git - lilypond.git/blob - lily/horizontal-align-item.cc
163a1bf61c12df191437e150ce98f7c0d607aeaa
[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     {
40         if (n)
41             item_l_arr_[i] = n->item();
42         else
43             item_l_arr_.del (i);
44     }
45 }
46
47 struct Horizontal_align_item_content {
48   Item * item_l_;
49   int priority_i_;
50   static int compare (Horizontal_align_item_content const &h1, 
51                         Horizontal_align_item_content const &h2) 
52                           {
53         return h1.priority_i_ - h2.priority_i_;
54     }
55   Horizontal_align_item_content (Item*i, int p) 
56     {
57         priority_i_ = p;
58         item_l_ = i;
59     }
60   Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
61 };
62
63
64 void
65 Horizontal_align_item::do_pre_processing()
66 {
67   OK();
68   {  
69         Array<Horizontal_align_item_content> content;
70         for  (int i =0; i < item_l_arr_.size(); i++) 
71             content.push (
72                 Horizontal_align_item_content (
73                     item_l_arr_[i], priority_i_arr_[i]));
74         content.sort (Horizontal_align_item_content::compare);
75         item_l_arr_.clear();
76         priority_i_arr_.clear();
77         for  (int i =0; i < content.size(); i++) 
78           {
79             item_l_arr_.push (content[i].item_l_);
80             priority_i_arr_.push (content[i].priority_i_);
81           }
82     }
83   
84   Array<Interval> dims;
85   Real total =0;
86   for  (int i =0; i < item_l_arr_.size(); i++) 
87     {
88         
89         Interval item_width= item_l_arr_[i]->width();
90         if (item_width.empty_b()) 
91           {
92             item_width = Interval (0,0);
93           }
94         dims.push (item_width);
95         total += item_width.length();
96     }
97
98   Real where_f= total * (align_i_-1.0)/2.0;
99   Real center_dx_f = 0;
100   for ( int i=0 ;  i < item_l_arr_.size(); i++) 
101     {
102         Real dx = where_f -dims[i][-1];
103         item_l_arr_[i]->translate (dx , X_AXIS);
104         if (item_l_arr_[i] == center_l_)
105             center_dx_f = where_f;
106         where_f += dims[i].length();
107     }
108   if (center_dx_f && !align_i_)
109         for ( int i=0 ;  i < item_l_arr_.size(); i++) 
110             item_l_arr_[i]->translate (- center_dx_f , X_AXIS);
111   
112 }
113
114 Interval
115 Horizontal_align_item::do_width() const
116 {
117   return Interval (0,0);
118 }
119
120 void
121 Horizontal_align_item::do_print()const
122 {
123 }
124
125 Horizontal_align_item::Horizontal_align_item()
126 {
127   center_l_ = 0;
128   align_i_ = 0;
129   empty_b_ = true;
130   transparent_b_ = true;
131 }