2 horizontal-align-item.cc -- implement Horizontal_align_item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "horizontal-align-item.hh"
12 IMPLEMENT_IS_TYPE_B1(Horizontal_align_item,Item);
14 Horizontal_align_item::OK() const
16 for (int i =0; i < item_l_arr_.size(); i++)
17 assert ( pcol_l_ == item_l_arr_[i]->pcol_l_);
20 Horizontal_align_item::contains_b (Item *i)const
22 return item_l_arr_.find_l (i);
26 Horizontal_align_item::add (Item *i,int p)
28 assert (! contains_b (i));
29 priority_i_arr_.push (p);
35 Horizontal_align_item::do_substitute_dependency (Score_elem*o,Score_elem*n)
38 while ((i = item_l_arr_.find_i (o->item())) >=0)
41 item_l_arr_[i] = n->item();
47 struct Horizontal_align_item_content {
50 static int compare (Horizontal_align_item_content const &h1,
51 Horizontal_align_item_content const &h2)
53 return h1.priority_i_ - h2.priority_i_;
55 Horizontal_align_item_content (Item*i, int p)
60 Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
65 Horizontal_align_item::do_pre_processing()
69 Array<Horizontal_align_item_content> content;
70 for (int i =0; i < item_l_arr_.size(); i++)
72 Horizontal_align_item_content (
73 item_l_arr_[i], priority_i_arr_[i]));
74 content.sort (Horizontal_align_item_content::compare);
76 priority_i_arr_.clear();
77 for (int i =0; i < content.size(); i++)
79 item_l_arr_.push (content[i].item_l_);
80 priority_i_arr_.push (content[i].priority_i_);
86 for (int i =0; i < item_l_arr_.size(); i++)
89 Interval item_width= item_l_arr_[i]->width();
90 if (item_width.empty_b())
92 item_width = Interval (0,0);
94 dims.push (item_width);
95 total += item_width.length();
98 Real where_f= total * (align_i_-1.0)/2.0;
100 for ( int i=0 ; i < item_l_arr_.size(); i++)
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();
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);
115 Horizontal_align_item::do_width() const
117 return Interval (0,0);
121 Horizontal_align_item::do_print()const
125 Horizontal_align_item::Horizontal_align_item()
130 transparent_b_ = true;