2 score-elem.cc -- implement Score_elem
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
10 #include "paper-def.hh"
12 #include "molecule.hh"
13 #include "score-elem.hh"
18 #include "scoreline.hh"
23 Score_elem::dependency(int i)const
25 return (Score_elem*) get_out_edge_arr()[i];
29 Score_elem::dependency_size() const
31 return get_out_edge_arr().size();
35 Score_elem::dependent(int i) const
37 return (Score_elem*) get_in_edge_arr()[i];
41 Score_elem::dependent_size() const
43 return get_in_edge_arr().size();
48 Score_elem::TeX_string() const
50 assert( status_ > POSTCALCED);
53 String s( "\\placebox{%}{%}{%}");
55 a.push(print_dimen(offset_.y));
56 a.push(print_dimen(offset_.x));
57 String t = output->TeX_string();
64 r = String("\n%start: ") + name() + "\n";
65 r += substitute_args(s, a);;
71 Score_elem::copy_dependencies(Score_elem const &s)
73 /* called from derived ctor, so most info points to the same deps
74 as (Directed_graph_node&)s. Nobody points to us, so don't copy
80 Score_elem::Score_elem(Score_elem const&s)
82 transparent_b_ = s.transparent_b_;
83 empty_b_ = s.empty_b_;
89 pscore_l_ = s.pscore_l_;
90 offset_ = Offset(0,0);
93 Score_elem::~Score_elem()
95 // some paranoia to prevent weird segv's
96 assert(status_ < DELETED);
104 Score_elem::translate_x(Real x)
112 Score_elem::translate_y(Real y)
119 Score_elem::translate(Offset O)
126 Score_elem::do_width() const
131 Molecule*m = brew_molecule_p();
135 r = output->extent().x;
140 Score_elem::width() const
142 Interval r=(empty_b_)?Interval(0,0):do_width();
144 if (!r.empty_b()) // float exception on DEC Alpha
151 Score_elem::do_height() const
155 Molecule*m = brew_molecule_p();
159 r = output->extent().y;
164 Score_elem::height() const
166 Interval r=(empty_b_)?Interval(0,0): do_height();
176 Score_elem::print()const
179 mtor << name() << "{\n";
180 mtor << "dets: " << dependent_size() << "dependencies: " <<
182 if (offset_.x || offset_.y)
183 mtor << "offset (" << offset_.x << ", " << offset_.y <<")";
196 Score_elem::Score_elem()
198 transparent_b_ = empty_b_ = false;
202 offset_ = Offset(0,0);
209 Score_elem::paper() const
212 return pscore_l_->paper_l_;
216 Score_elem::add_processing()
218 if (status_ >= VIRGIN)
225 Score_elem::pre_processing()
227 if (status_ >= PRECALCED )
230 assert(status_ != PRECALCING); // cyclic dependency
231 status_ = PRECALCING;
233 for (int i=0; i < dependency_size(); i++)
234 dependency(i)->pre_processing();
242 Score_elem::breakable_col_processing()
244 if (status_ >= PREBROKEN )
247 if(status_== PREBREAKING) {
251 status_ = PREBREAKING;
253 for (int i=0; i < dependency_size(); i++)
254 dependency(i)->breakable_col_processing();
257 do_breakable_col_processing();
262 Score_elem::break_processing()
264 if (status_ >= BROKEN )
267 if (status_ == BREAKING) {
273 for (int i=0; i < dependency_size(); i++)
274 dependency(i)->break_processing();
277 do_break_processing();
283 Score_elem::do_break_processing()
285 handle_broken_dependencies();
290 Score_elem::post_processing()
292 if (status_ >= POSTCALCED)
294 assert(status_ != POSTCALCING);// cyclic dependency
298 for (int i=0; i < dependency_size(); i++)
299 dependency(i)->post_processing();
300 do_post_processing();
305 Score_elem::status()const
311 Score_elem::molecule_processing()
313 if (status_ >= OUTPUT)
315 status_ = OUTPUT; // do it only once.
317 for (int i=0; i < dependency_size(); i++)
318 dependency(i)->molecule_processing();
322 output= brew_molecule_p();
326 Score_elem::do_post_processing()
331 Score_elem::do_breakable_col_processing()
333 handle_prebroken_dependencies();
337 Score_elem::do_pre_processing()
342 Score_elem::do_add_processing()
348 Score_elem::do_substitute_dependency(Score_elem*,Score_elem*)
352 Score_elem::do_substitute_dependent(Score_elem*o,Score_elem*n)
354 if ( o== y_group_l_ ) {
355 y_group_l_ = n ? n->vertical_group() : 0;
356 } else if (o == x_group_l_ ) {
357 x_group_l_ = n ? n->horizontal_group() : 0;
363 IMPLEMENT_IS_TYPE_B(Score_elem);
366 Score_elem::brew_molecule_p()const
368 Atom a(paper()->lookup_l()->fill(Box(Interval(0,0), Interval(0,0))));
369 return new Molecule (a);
372 Score_elem::offset() const
378 Score_elem::line_l()const
388 Score_elem::remove_dependency(Score_elem*e)
391 substitute_dependency(e, 0);
395 Score_elem::add_dependency(Score_elem*e)
397 Directed_graph_node::add(e);
400 Score_elem::substitute_dependency(Score_elem* old, Score_elem* new_l)
402 do_substitute_dependency(old,new_l);
403 old->do_substitute_dependent(this, 0);
407 Score_elem::junk_dependencies()
409 while ( dependency_size() ) {
410 remove_edge_out( dependency( 0 ));
415 Score_elem::handle_broken_dependencies()
417 Line_of_score *line = line_l();
421 Link_array<Score_elem> remove_us_arr;
422 for (int i=0; i < dependency_size(); i++) {
423 Score_elem * elt = dependency(i);
424 if (elt->line_l() != line){
425 if (elt->spanner()) {
426 Spanner * sp = elt->spanner();
427 Spanner * broken = sp->find_broken_piece(line);
428 substitute_dependency(sp, broken);
430 add_dependency(broken);
431 } else if (elt->item() && elt->item()->pcol_l_->breakpoint_b()
432 && elt->item()->break_status_i() == 0) {
433 Item * my_item = elt->item()->find_prebroken_piece(line);
434 substitute_dependency( elt, my_item);
436 add_dependency( my_item);
438 remove_us_arr.push(elt);
443 remove_us_arr.default_sort();
444 remove_us_arr.uniq();
445 for (int i=0; i <remove_us_arr.size(); i++)
446 remove_dependency(remove_us_arr[i]);
453 unlike with spanners, the number of items can increase
459 span: item1 item2 item3
461 How to let span (a derived class) know that this happened?
464 Score_elem::handle_prebroken_dependencies()
466 Link_array<Score_elem> remove_us_arr;
467 for (int i=0; i < dependency_size(); i++) {
468 Score_elem * elt = dependency(i);
469 Item *it_l = elt->item();
470 if (it_l && it_l->pcol_l_->breakable_b())
472 Score_elem *new_l = it_l->find_prebroken_piece(item()->pcol_l_);
474 do_substitute_dependency( elt, new_l);
475 remove_us_arr.push(elt);
477 add_dependency(new_l);
480 add_dependency(it_l->broken_to_a_[0]);
481 add_dependency(it_l->broken_to_a_[1]);
486 remove_us_arr.default_sort();
487 remove_us_arr.uniq();
488 for (int i=0; i <remove_us_arr.size(); i++)
489 remove_dependency(remove_us_arr[i]);
496 Score_elem::unlink_all()
498 for (int i=0; i < dependency_size(); i++)
499 dependency(i)->unlink_all();
508 while ( dependency_size()) {
509 do_substitute_dependency(dependency(0),0);
510 remove_edge_out_idx(0);
512 while ( dependent_size() ) {
513 dependent(0)->remove_dependency(this);
520 Score_elem::OK()const
523 for (int i=0; i < dependency_size(); i++) {