2 score-elem.cc -- implement Score_element
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
13 #include "paper-def.hh"
15 #include "molecule.hh"
16 #include "score-element.hh"
19 #include "line-of-score.hh"
22 #include "molecule.hh"
24 #include "paper-outputter.hh"
26 Score_element::Score_element()
29 break_helper_only_b_ = false;
30 transparent_b_ = false;
33 element_property_alist_ = SCM_EOL;
36 Score_element::Score_element (Score_element const&s)
37 : Graphical_element (s)
39 /* called from derived ctor, so most info points to the same deps
40 as (Directed_graph_node&)s. Nobody points to us, so don't copy
46 element_property_alist_ = s.element_property_alist_;
47 dependency_arr_ = s.dependency_arr_;
49 break_helper_only_b_ = s.break_helper_only_b_;
50 transparent_b_ = s.transparent_b_;
51 status_i_ = s.status_i_;
52 pscore_l_ = s.pscore_l_;
55 Score_element::~Score_element()
58 assert (status_i_ >=0);
63 Score_element::dependency (int i) const
65 return dependency_arr_ [i];
69 Score_element::dependency_size () const
71 return dependency_arr_.size ();
77 Score_element::get_elt_property (SCM s)
79 return scm_assq(s, element_property_alist_);
82 Score_element::set_elt_property (SCM s, SCM v)
84 element_property_alist_ =
85 scm_assoc_set_x (element_property_alist_, s, v);
89 Score_element::do_width() const
93 Molecule*m = output_p_ ? output_p_ : do_brew_molecule_p();
103 Score_element::do_height() const
106 Molecule*m = output_p_ ? output_p_ : do_brew_molecule_p();
107 r = m->extent().y ();
119 Score_element::print() const
122 DOUT << classname(this) << "{\n";
123 DOUT << "dependencies: " << dependency_size();
125 Graphical_element::do_print ();
134 Score_element::paper() const
136 return pscore_l_->paper_l_;
141 Score_element::lookup_l () const
143 SCM sz = scm_assq (ly_symbol ("fontsize"), element_property_alist_);
144 if (sz != SCM_BOOL_F)
145 return pscore_l_->paper_l_->lookup_l (gh_scm2int (SCM_CDR (sz)));
147 return pscore_l_->paper_l_->lookup_l (0);
151 Score_element::add_processing()
153 assert (status_i_ >=0);
162 Score_element::calculate_dependencies (int final, int busy,
163 Score_element_method_pointer funcptr)
165 assert (status_i_ >=0);
167 if (status_i_ >= final)
170 assert (status_i_!= busy);
173 for (int i=0; i < dependency_size(); i++)
174 dependency (i)->calculate_dependencies (final, busy, funcptr);
176 Link_array<Score_element> extra (get_extra_dependencies());
177 for (int i=0; i < extra.size(); i++)
178 extra[i]->calculate_dependencies (final, busy, funcptr);
180 invalidate_cache (X_AXIS);
181 invalidate_cache (Y_AXIS);
187 Score_element::output_processing ()
194 output_p_ = do_brew_molecule_p ();
195 pscore_l_->outputter_l_->output_molecule (output_p_,
207 Score_element::do_break_processing()
209 handle_broken_dependencies();
213 Score_element::do_post_processing()
218 Score_element::do_breakable_col_processing()
220 handle_prebroken_dependencies();
224 Score_element::do_pre_processing()
229 Score_element::do_space_processing ()
234 Score_element::do_add_processing()
239 Score_element::do_substitute_element_pointer (Score_element*,Score_element*)
245 Score_element::do_brew_molecule_p() const
247 Molecule a (lookup_l ()->fill (Box (Interval (0,0), Interval (0,0))));
248 return new Molecule (a);
253 Score_element::line_l() const
265 Score_element::remove_dependency (Score_element*e)
268 while ((i = dependency_arr_.find_i (e)) >=0 )
269 dependency_arr_.unordered_del (i);
271 substitute_dependency (e, 0);
275 Score_element::add_dependency (Score_element*e)
278 dependency_arr_.push (e);
280 warning("Null dependency added");
284 Score_element::substitute_dependency (Score_element* old, Score_element* new_l)
286 do_substitute_element_pointer (old,new_l);
287 old->do_substitute_element_pointer (this, 0);
291 Score_element::handle_broken_dependencies()
293 Line_of_score *line = line_l();
297 Link_array<Score_element> remove_us_arr;
298 for (int i=0; i < dependency_size(); i++)
300 Score_element * elt = dependency (i);
301 if (elt->line_l() != line)
303 if (Spanner *sp = dynamic_cast<Spanner *> (elt))
305 Spanner * broken = sp->find_broken_piece (line);
306 substitute_dependency (sp, broken);
308 add_dependency (broken);
310 else if (Item *original = dynamic_cast <Item *> (elt))
312 Item * my_item = original->find_prebroken_piece (line);
314 substitute_dependency (elt, my_item);
316 add_dependency (my_item);
318 remove_us_arr.push (elt);
322 remove_us_arr.default_sort();
323 remove_us_arr.uniq();
324 for (int i=0; i <remove_us_arr.size(); i++)
325 remove_dependency (remove_us_arr[i]);
331 unlike with spanners, the number of items can increase
337 span: item1 item2 item3
339 How to let span (a derived class) know that this happened?
342 Score_element::handle_prebroken_dependencies()
344 Link_array<Score_element> old_arr, new_arr;
346 for (int i=0; i < dependency_size(); i++)
348 Score_element * elt = dependency (i);
349 Item *it_l = dynamic_cast <Item *> (elt);
350 if (it_l && it_l->breakable_b_)
351 if (Item *me = dynamic_cast<Item*> (this) )
353 Score_element *new_l = it_l->find_prebroken_piece (me->break_status_dir_);
356 new_arr.push (new_l);
362 new_arr.push (it_l->broken_to_drul_[LEFT]);
365 new_arr.push (it_l->broken_to_drul_[RIGHT]);
369 for (int i=0; i < old_arr.size(); i++)
371 substitute_dependency (old_arr[i], new_arr[i]);
375 Score_element::handle_prebroken_dependents()
381 Link_array<Score_element>
382 Score_element::get_extra_dependencies() const
384 Link_array<Score_element> empty;
389 Score_element::linked_b() const
391 return get_extra_dependencies().size() ||
395 Score_element::do_print () const