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);
16 Horizontal_align_item::contains_b(Item *i)const
18 return item_l_arr_.find_l(i);
22 Horizontal_align_item::add(Item *i,int p)
24 assert(! contains_b(i));
25 priority_i_arr_.push(p);
31 Horizontal_align_item::do_substitute_dependency(Score_elem*o,Score_elem*n)
34 while ((i = item_l_arr_.find_i(o->item())) >=0) {
36 item_l_arr_[i] = n->item();
42 struct Horizontal_align_item_content {
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_;
49 Horizontal_align_item_content(Item*i, int p) {
53 Horizontal_align_item_content(){item_l_ =0; priority_i_ =0; }
58 Horizontal_align_item::do_pre_processing()
61 Array<Horizontal_align_item_content> content;
62 for (int i =0; i < item_l_arr_.size(); i++)
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_);
77 for (int i =0; i < item_l_arr_.size(); i++) {
79 Interval item_width= item_l_arr_[i]->width();
80 if (item_width.empty_b()) {
81 item_width = Interval(0,0);
83 dims.push( item_width);
84 total += item_width.length();
87 Real where_f= total * (align_i_-1.0)/2.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();
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 );
103 Horizontal_align_item::do_width() const
105 return Interval(0,0);
109 Horizontal_align_item::do_print()const
113 Horizontal_align_item::Horizontal_align_item()
118 transparent_b_ = true;