]> git.donarmstrong.com Git - lilypond.git/blob - lily/horizontal-align-item.cc
release: 0.1.11
[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 bool
15 Horizontal_align_item::contains_b (Item *i) const
16 {
17   return item_l_arr_.find_l (i);
18 }
19
20 void
21 Horizontal_align_item::add (Item *i,int p)
22 {
23   assert (! contains_b (i));
24   priority_i_arr_.push (p);
25   item_l_arr_.push (i);
26   add_dependency (i);
27 }
28
29 void
30 Horizontal_align_item::do_substitute_dependency (Score_elem*o,Score_elem*n)
31 {
32   int i;
33   while ((i = item_l_arr_.find_i (o->item())) >=0) 
34     {
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   {
48     return h1.priority_i_ - h2.priority_i_;
49   }
50   Horizontal_align_item_content (Item*i, int p) 
51   {
52     priority_i_ = p;
53     item_l_ = i;
54   }
55   Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
56 };
57
58
59 void
60 Horizontal_align_item::do_pre_processing()
61 {
62   {  
63     Array<Horizontal_align_item_content> content;
64     for  (int i =0; i < item_l_arr_.size(); i++) 
65       content.push (
66                     Horizontal_align_item_content (
67                                                    item_l_arr_[i], priority_i_arr_[i]));
68     content.sort (Horizontal_align_item_content::compare);
69     item_l_arr_.clear();
70     priority_i_arr_.clear();
71     for  (int i =0; i < content.size(); i++) 
72       {
73         item_l_arr_.push (content[i].item_l_);
74         priority_i_arr_.push (content[i].priority_i_);
75       }
76   }
77   
78   Array<Interval> dims;
79   Real total =0;
80   for  (int i =0; i < item_l_arr_.size(); i++) 
81     {
82         
83       Interval item_width= item_l_arr_[i]->width();
84       if (item_width.empty_b()) 
85         {
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     {
96       Real dx = where_f -dims[i][-1];
97       item_l_arr_[i]->translate (dx , X_AXIS);
98       if (item_l_arr_[i] == center_l_)
99         center_dx_f = where_f;
100       where_f += dims[i].length();
101     }
102   if (center_dx_f && !align_i_)
103     for (int i=0 ;  i < item_l_arr_.size(); i++) 
104       item_l_arr_[i]->translate (- center_dx_f , X_AXIS);
105   
106 }
107
108 Interval
109 Horizontal_align_item::do_width() const
110 {
111   return Interval (0,0);
112 }
113
114 void
115 Horizontal_align_item::do_print() const
116 {
117 }
118
119 Horizontal_align_item::Horizontal_align_item()
120 {
121   center_l_ = 0;
122   align_i_ = 0;
123   empty_b_ = true;
124   transparent_b_ = true;
125 }