2 align-elem.cc -- implement Align_elem
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "align-element.hh"
10 #include "interval.hh"
11 #include "direction.hh"
14 struct Align_element_content {
15 Score_element * elem_l_;
18 static int compare (Align_element_content const &h1,
19 Align_element_content const &h2)
21 return h1.priority_i_ - h2.priority_i_;
23 Align_element_content (Score_element *elem_l, int p)
28 Align_element_content () {
37 Align_element::add_element (Score_element*el_l)
39 int p = priority_i_arr_.size ();
40 add_element_priority (el_l, p);
44 Align_element::add_element_priority (Score_element *el, int p)
46 assert (! contains_b (el));
47 elem_l_arr_.push (el);
48 priority_i_arr_.push (p);
53 Align_element::do_substitute_element_pointer (Score_element*o,
57 while ((i = elem_l_arr_.find_i (o))>=0)
70 Align_element::do_post_processing()
73 do_side_processing ();
77 Align_element::do_pre_processing ()
80 do_side_processing ();
84 Align_element::do_side_processing ()
89 for (int i=0; i < elem_l_arr_.size(); i++)
91 Interval y = elem_l_arr_[i]->extent(axis_) ;
100 for (int i=0 ; i < elem_l_arr_.size(); i++)
102 Real dy = - stacking_dir_ * dims[i][-stacking_dir_];
104 dy += stacking_dir_ * dims[i-1][stacking_dir_];
108 dy = (dy >? threshold_interval_[SMALLER] )
109 <? threshold_interval_[BIGGER];
113 if (!i && align_dir_ == LEFT)
115 else if (align_dir_ == CENTER && elem_l_arr_[i] == center_l_)
118 where_f += stacking_dir_ * dy;
119 elem_l_arr_[i]->translate_axis (where_f, axis_);
122 if (align_dir_ == RIGHT)
126 for (int i=0 ; i < elem_l_arr_.size(); i++)
127 elem_l_arr_[i]->translate_axis (- center_f, axis_);
130 Align_element::Align_element()
132 threshold_interval_ = Interval (0, Interval::infinity ());
133 set_elt_property (transparent_scm_sym, SCM_BOOL_T);
135 stacking_dir_ = DOWN;
143 Align_element::contains_b (Score_element const *e) const
145 return elem_l_arr_.find_l (e);
149 Align_element::sort_elements ()
151 Array<Align_element_content> content;
152 for (int i =0; i < elem_l_arr_.size(); i++)
153 content.push (Align_element_content (elem_l_arr_[i], priority_i_arr_[i]));
154 content.sort (Align_element_content::compare);
157 priority_i_arr_.clear();
159 for (int i =0; i < content.size(); i++)
161 elem_l_arr_.push (content[i].elem_l_);
162 priority_i_arr_.push (content[i].priority_i_);
167 Align_element::do_print () const
170 DOUT << "contains: ";
171 for (int i=0 ; i < elem_l_arr_.size(); i++)
172 DOUT << classname (elem_l_arr_[i]) << ", ";
177 Align_element::get_elt_by_priority (int p) const
179 for (int i=0; i < priority_i_arr_.size (); i++)
181 if (priority_i_arr_[i] == p)
182 return elem_l_arr_[i];