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) {
40 item_l_arr_[i] = n->item();
46 struct Horizontal_align_item_content {
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_;
53 Horizontal_align_item_content(Item*i, int p) {
57 Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
62 Horizontal_align_item::do_pre_processing()
66 Array<Horizontal_align_item_content> content;
67 for (int i =0; i < item_l_arr_.size(); i++)
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_.set_size(0);
73 priority_i_arr_.set_size(0);
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_);
82 for (int i =0; i < item_l_arr_.size(); i++) {
84 Interval item_width= item_l_arr_[i]->width();
85 if (item_width.empty_b()) {
86 item_width = Interval(0,0);
88 dims.push( item_width);
89 total += item_width.length();
92 Real where_f= total * (align_i_-1.0)/2.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_x( dx );
97 if (item_l_arr_[i] == center_l_)
98 center_dx_f = where_f;
99 where_f += dims[i].length();
101 if (center_dx_f && !align_i_ )
102 for ( int i=0 ; i < item_l_arr_.size(); i++)
103 item_l_arr_[i]->translate_x( - center_dx_f );
108 Horizontal_align_item::do_width() const
110 return Interval(0,0);
114 Horizontal_align_item::do_print()const
118 Horizontal_align_item::Horizontal_align_item()
123 transparent_b_ = true;