(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
-/*
- too big. Should split.
- */
+#include "outputter.hh"
#include "p-score.hh"
#include "paper-def.hh"
#include "lookup.hh"
#include "item.hh"
#include "p-col.hh"
-Score_elem*
-Score_elem::dependency(int i)const
-{
- return (Score_elem*) get_out_edge_arr()[i];
-}
-
-int
-Score_elem::dependency_size() const
-{
- return get_out_edge_arr().size();
-}
-
-Score_elem*
-Score_elem::dependent(int i) const
-{
- return (Score_elem*) get_in_edge_arr()[i];
-}
-
-int
-Score_elem::dependent_size() const
-{
- return get_in_edge_arr().size();
-}
-
-
-
-String
-Score_elem::TeX_string_without_offset(Offset o)const
-{
- if (transparent_b_ )
- return "";
- String s( "\\placebox{%}{%}{%}");
- Array<String> a;
- a.push( print_dimen(o.y() ));
- a.push( print_dimen(o.x() ));
- String t = output->TeX_string();
- if (t == "")
- return t;
-
- a.push( t);
- String r;
- if (check_debug)
- r = String("\n%start: ") + name() + "\n";
- r += substitute_args(s, a);;
- return r;
-}
-
-String
-Score_elem::TeX_string() const
-{
- assert( status_ > POSTCALCED);
- return TeX_string_without_offset(offset_);
-}
-
-void
-Score_elem::copy_dependencies(Score_elem const &s)
+Score_elem::Score_elem()
{
- /* called from derived ctor, so most info points to the same deps
- as (Directed_graph_node&)s. Nobody points to us, so don't copy
- dependents.
- */
- copy_edges_out(s);
+ transparent_b_ = false;
+ pscore_l_=0;
+ status_i_ = 0;
}
-Score_elem::Score_elem(Score_elem const&s)
+Score_elem::Score_elem (Score_elem const&s)
+ : Directed_graph_node (s), Graphical_element (s)
{
- transparent_b_ = s.transparent_b_;
- empty_b_ = s.empty_b_;
- axis_group_l_a_[0] = axis_group_l_a_[1] =0;
- status_ = s.status_;
- assert(!s.output);
- output = 0;
- pscore_l_ = s.pscore_l_;
- offset_ = Offset(0,0);
+ /* called from derived ctor, so most info points to the same deps
+ as (Directed_graph_node&)s. Nobody points to us, so don't copy
+ dependents.
+ */
+ copy_edges_out (s);
+ transparent_b_ = s.transparent_b_;
+ status_i_ = s.status_i_;
+ pscore_l_ = s.pscore_l_;
}
Score_elem::~Score_elem()
{
- // some paranoia to prevent weird segv's
- assert(status_ < DELETED);
- delete output;
- status_ = DELETED;
- output = 0;
-
-}
-
-/*
- GEOMETRY
- */
-Real
-Score_elem::absolute_coordinate(Axis a)const
-{
- Real r = offset_[a];
- for ( Axis_group_element * axis_group_l = axis_group_l_a_[a];
- axis_group_l; axis_group_l = axis_group_l->axis_group_l_a_[a])
-
- r += axis_group_l->offset_[a];
- return r;
+ assert (status_i_ >=0);
+ status_i_ = -1;
}
-
-Offset
-Score_elem::absolute_offset() const
+Score_elem*
+Score_elem::dependency (int i) const
{
- return Offset(absolute_coordinate(X_AXIS), absolute_coordinate(Y_AXIS));
+ return (Score_elem*) get_out_edge_arr ()[i];
}
- void
-Score_elem::translate(Real y, Axis a)
+int
+Score_elem::dependency_size () const
{
- offset_[a] += y;
+ return get_out_edge_arr ().size ();
}
-Real
-Score_elem::relative_coordinate(Axis_group_element*e, Axis a)const
+Score_elem*
+Score_elem::dependent (int i) const
{
- Real r =0.0;
- for ( Axis_group_element * axis_group_l = axis_group_l_a_[a];
- axis_group_l != e;
- axis_group_l = axis_group_l->axis_group_l_a_[a])
- r += axis_group_l->offset_[a];
-
- return r;
+ return (Score_elem*) get_in_edge_arr()[i];
}
-Axis_group_element*
-Score_elem::common_group(Score_elem const* s, Axis a)const
+int
+Score_elem::dependent_size() const
{
- Link_array<Axis_group_element> my_groups;
- for ( Axis_group_element * axis_group_l = axis_group_l_a_[a];
- axis_group_l;
- axis_group_l = axis_group_l->axis_group_l_a_[a])
- my_groups.push( axis_group_l );
-
- Axis_group_element* common_l=0;
- for ( Axis_group_element * axis_group_l = s->axis_group_l_a_[a];
- !common_l && axis_group_l;
- axis_group_l = axis_group_l->axis_group_l_a_[a])
- common_l = my_groups.find_l( axis_group_l );
-
- return common_l;
+ return get_in_edge_arr().size ();
}
-void
-Score_elem::translate(Offset O)
-{
- offset_ += O;
-}
-
Interval
Score_elem::do_width() const
{
- Interval r;
-
- if (!output){
- Molecule*m = brew_molecule_p();
- r = m->extent().x();
- delete m;
- } else
- r = output->extent().x();
- return r;
-}
-
-Interval
-Score_elem::width() const
-{
- return extent( X_AXIS);
-}
+ Interval r;
-Interval
-Score_elem::extent(Axis a)const
-{
- Interval r;
- if ( !empty_b_ ) {
-
- r = (a == X_AXIS)? do_width(): do_height();
- }
-
- if (!r.empty_b()) // float exception on DEC Alpha
- r+=offset_[a];
-
- return r;
+ Molecule*m = brew_molecule_p();
+ r = m->extent().x ();
+ delete m;
+
+ return r;
}
Interval
Score_elem::do_height() const
{
- Interval r;
- if (!output){
- Molecule*m = brew_molecule_p();
- r = m->extent().y();
- delete m;
- } else
- r = output->extent().y();
- return r;
+ Interval r;
+ Molecule*m = brew_molecule_p();
+ r = m->extent().y ();
+ delete m;
+ return r;
}
-Interval
-Score_elem::height() const
-{
- return extent(Y_AXIS);
-}
/*
STANDARD METHS
*/
void
-Score_elem::print()const
+Score_elem::print() const
{
#ifndef NPRINT
- mtor << name() << "{\n";
- mtor << "dets: " << dependent_size() << "dependencies: " <<
- dependency_size();
- if (offset_.x() || offset_.y())
- mtor << "offset (" << offset_.x() << ", " << offset_.y() <<")";
- mtor << "\n";
-
- do_print();
- if (output)
- output->print();
-
- mtor << "}\n";
+ DOUT << name() << "{\n";
+ DOUT << "dets: " << dependent_size() << "dependencies: " <<
+ dependency_size();
+
+ Graphical_element::print ();
+ do_print();
+
+ DOUT << "}\n";
#endif
}
-Score_elem::Score_elem()
-{
- transparent_b_ = empty_b_ = false;
- axis_group_l_a_[0] = axis_group_l_a_[1] =0;
- pscore_l_=0;
- offset_ = Offset(0,0);
- output = 0;
- status_ = ORPHAN;
-}
-
Paper_def*
Score_elem::paper() const
{
- assert(pscore_l_);
- return pscore_l_->paper_l_;
+ assert (pscore_l_);
+ return pscore_l_->paper_l_;
}
+
void
Score_elem::add_processing()
{
- if (status_ >= VIRGIN)
- return;
- status_ = VIRGIN;
- do_add_processing();
+ if (status_i_)
+ return;
+ status_i_ ++;
+ do_add_processing();
}
-void
-Score_elem::pre_processing()
-{
- if (status_ >= PRECALCED )
- return;
-
- assert(status_ != PRECALCING); // cyclic dependency
- status_ = PRECALCING;
-
- for (int i=0; i < dependency_size(); i++)
- dependency(i)->pre_processing();
-
- Link_array<Score_elem> extra(get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- extra[i]->pre_processing();
-
- do_pre_processing();
- status_ = PRECALCED;
-}
void
-Score_elem::breakable_col_processing()
+Score_elem::calcalute_dependencies (int final, int busy,
+ Score_elem_method_pointer funcptr)
{
- if (status_ >= PREBROKEN )
- return;
+ if (status_i_ >= final)
+ return;
- if(status_== PREBREAKING) {
- status_ = PREBROKEN;
- return ;
- }
- status_ = PREBREAKING;
+ assert (status_i_!= busy);
+ status_i_= busy;
- for (int i=0; i < dependency_size(); i++)
- dependency(i)->breakable_col_processing();
+ for (int i=0; i < dependency_size(); i++)
+ dependency (i)->calcalute_dependencies (final, busy, funcptr);
- Link_array<Score_elem> extra(get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- extra[i]->breakable_col_processing();
-
+ Link_array<Score_elem> extra (get_extra_dependencies());
+ for (int i=0; i < extra.size(); i++)
+ extra[i]->calcalute_dependencies (final, busy, funcptr);
- do_breakable_col_processing();
- status_ = PREBROKEN;
-}
-
-void
-Score_elem::break_processing()
-{
- if (status_ >= BROKEN )
- return;
-
- if (status_ == BREAKING) {
- status_ = BROKEN;
- return;
- }
- status_ = BREAKING;
-
- for (int i=0; i < dependency_size(); i++)
- dependency(i)->break_processing();
-
- Link_array<Score_elem> extra(get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- extra[i]->break_processing();
-
-
-
- do_break_processing();
- status_ = BROKEN;
-
+ invalidate_cache (X_AXIS);
+ invalidate_cache (Y_AXIS);
+ (this->*funcptr)();
+ status_i_= final;
}
void
-Score_elem::do_break_processing()
+Score_elem::do_brew_molecule ()
{
- handle_broken_dependencies();
+ if (transparent_b_)
+ return ;
+ Molecule *output= brew_molecule_p ();
+ pscore_l_->outputter_l_->output_molecule (output, absolute_offset ());
}
-
-void
-Score_elem::post_processing()
-{
- if (status_ >= POSTCALCED)
- return;
- assert(status_ != POSTCALCING);// cyclic dependency
- status_=POSTCALCING;
-
+/*
- for (int i=0; i < dependency_size(); i++)
- dependency(i)->post_processing();
-
- Link_array<Score_elem> extra(get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- extra[i]->post_processing();
-
-
- do_post_processing();
- status_=POSTCALCED;
-}
+ VIRTUAL STUBS
-Score_elem::Status
-Score_elem::status()const
-{
- return status_;
-}
+ */
-void
-Score_elem::molecule_processing()
+void
+Score_elem::do_break_processing()
{
- if (status_ >= OUTPUT)
- return;
- status_ = OUTPUT; // do it only once.
-
- for (int i=0; i < dependency_size(); i++)
- dependency(i)->molecule_processing();
-
- Link_array<Score_elem> extra(get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- extra[i]->molecule_processing();
-
-
- if (transparent_b_)
- return ;
- output= brew_molecule_p();
+ handle_broken_dependencies();
}
-/*
-
- VIRTUAL STUBS
-
- */
void
Score_elem::do_post_processing()
{
void
Score_elem::do_breakable_col_processing()
{
- handle_prebroken_dependencies();
+ handle_prebroken_dependencies();
}
void
}
void
-Score_elem::do_substitute_dependency(Score_elem*,Score_elem*)
+Score_elem::do_substitute_dependency (Score_elem*,Score_elem*)
{
}
void
-Score_elem::do_substitute_dependent(Score_elem*,Score_elem*)
+Score_elem::do_substitute_dependent (Score_elem*,Score_elem*)
{
}
void
Score_elem::do_unlink()
-{}
+{
+}
+
+void
+Score_elem::do_junk_links()
+{
+}
-IMPLEMENT_IS_TYPE_B(Score_elem);
+IMPLEMENT_IS_TYPE_B1(Score_elem, Graphical_element);
Molecule*
-Score_elem::brew_molecule_p()const
+Score_elem::brew_molecule_p() const
{
- Atom a(paper()->lookup_l()->fill(Box(Interval(0,0), Interval(0,0))));
- return new Molecule (a);
+ Atom a (paper()->lookup_l ()->fill (Box (Interval (0,0), Interval (0,0))));
+ return new Molecule (a);
}
Line_of_score *
-Score_elem::line_l()const
+Score_elem::line_l() const
{
- return 0;
+ return 0;
}
/*
*/
void
-Score_elem::remove_dependency(Score_elem*e)
+Score_elem::remove_dependency (Score_elem*e)
{
- remove_edge_out(e);
- substitute_dependency(e, 0);
+ remove_edge_out (e);
+ substitute_dependency (e, 0);
}
void
-Score_elem::add_dependency(Score_elem*e)
-{
- Directed_graph_node::add(e);
-}
-void
-Score_elem::substitute_dependency(Score_elem* old, Score_elem* new_l)
+Score_elem::add_dependency (Score_elem*e)
{
- do_substitute_dependency(old,new_l);
- old->do_substitute_dependent(this, 0);
+ Directed_graph_node::add (e);
}
-
void
-Score_elem::junk_dependencies()
+Score_elem::substitute_dependency (Score_elem* old, Score_elem* new_l)
{
- while ( dependency_size() ) {
- remove_edge_out( dependency( 0 ));
- }
+ do_substitute_dependency (old,new_l);
+ old->do_substitute_dependent (this, 0);
}
void
Score_elem::handle_broken_dependencies()
{
- Line_of_score *line = line_l();
- if (!line)
- return;
-
- Link_array<Score_elem> remove_us_arr;
- for (int i=0; i < dependency_size(); i++) {
- Score_elem * elt = dependency(i);
- if (elt->line_l() != line){
- if (elt->spanner()) {
- Spanner * sp = elt->spanner();
- Spanner * broken = sp->find_broken_piece(line);
- substitute_dependency(sp, broken);
-
- add_dependency(broken);
- } else if (elt->item() && elt->item()->pcol_l_->breakpoint_b()
- && elt->item()->break_status_i() == 0) {
- Item * my_item = elt->item()->find_prebroken_piece(line);
- substitute_dependency( elt, my_item);
- if (my_item)
- add_dependency( my_item);
+ Line_of_score *line = line_l();
+ if (!line)
+ return;
+
+ Link_array<Score_elem> remove_us_arr;
+ for (int i=0; i < dependency_size(); i++)
+ {
+ Score_elem * elt = dependency (i);
+ if (elt->line_l() != line)
+ {
+ if (elt->spanner())
+ {
+ Spanner * sp = elt->spanner();
+ Spanner * broken = sp->find_broken_piece (line);
+ substitute_dependency (sp, broken);
+
+ add_dependency (broken);
+ }
+ else if (elt->item())
+ {
+ Item * my_item = elt->item()->find_prebroken_piece (line);
+
+ substitute_dependency (elt, my_item);
+ if (my_item)
+ add_dependency (my_item);
}
- remove_us_arr.push(elt);
- }
+ remove_us_arr.push (elt);
+ }
}
- remove_us_arr.default_sort();
- remove_us_arr.uniq();
- for (int i=0; i <remove_us_arr.size(); i++)
- remove_dependency(remove_us_arr[i]);
-
- status_ = BROKEN;
+ remove_us_arr.default_sort();
+ remove_us_arr.uniq();
+ for (int i=0; i <remove_us_arr.size(); i++)
+ remove_dependency (remove_us_arr[i]);
}
/*
void
Score_elem::handle_prebroken_dependencies()
{
- Link_array<Score_elem> old_arr, new_arr;
-
- for (int i=0; i < dependency_size(); i++) {
- Score_elem * elt = dependency(i);
- Item *it_l = elt->item();
- if (it_l && it_l->breakable_b_)
- if (item()) {
- Score_elem *new_l = it_l->find_prebroken_piece(item()->pcol_l_);
- if (new_l != elt ) {
- new_arr.push (new_l);
- old_arr.push(elt);
- }
- }else {
- new_arr.push(it_l->broken_to_a_[0]);
- old_arr.push(0);
- old_arr.push(0);
- new_arr.push(it_l->broken_to_a_[1]);
- }
+ Link_array<Score_elem> old_arr, new_arr;
+
+ for (int i=0; i < dependency_size(); i++)
+ {
+ Score_elem * elt = dependency (i);
+ Item *it_l = elt->item();
+ if (it_l && it_l->breakable_b_)
+ if (item())
+ {
+ Score_elem *new_l = it_l->find_prebroken_piece (item()->break_status_i_);
+ if (new_l != elt)
+ {
+ new_arr.push (new_l);
+ old_arr.push (elt);
+ }
+ }
+ else
+ {
+ new_arr.push (it_l->broken_to_drul_[LEFT]);
+ old_arr.push (0);
+ old_arr.push (0);
+ new_arr.push (it_l->broken_to_drul_[RIGHT]);
+ }
}
-
- for (int i=0; i < old_arr.size(); i++)
- if (old_arr[i])
- substitute_dependency( old_arr[i], new_arr[i] );
-
-
- status_ = PREBROKEN;
+
+ for (int i=0; i < old_arr.size(); i++)
+ if (old_arr[i])
+ substitute_dependency (old_arr[i], new_arr[i]);
}
-
void
-Score_elem::unlink_all()
+Score_elem::junk_links ()
{
- for (int i=0; i < dependency_size(); i++)
- dependency(i)->unlink_all();
- Link_array<Score_elem> extra(get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- extra[i]->unlink_all();
-
- junk_links();
- axis_group_l_a_[0] = axis_group_l_a_[1] =0;
+ Directed_graph_node::junk_links();
+ Graphical_element::junk_links ();
+ do_junk_links();
}
void
Score_elem::unlink()
{
- do_unlink();
- while ( dependency_size()) {
- do_substitute_dependency(dependency(0),0);
- remove_edge_out_idx(0);
+ do_unlink();
+ while (dependency_size())
+ {
+ do_substitute_dependency (dependency (0),0);
+ remove_edge_out_idx (0);
}
- while ( dependent_size() ) {
- dependent(0)->remove_dependency(this);
+ while (dependent_size())
+ {
+ dependent (0)->remove_dependency (this);
}
- for (int j=0; j < 2; j++)
- if ( axis_group_l_a_[j])
- axis_group_l_a_[j]->remove_element(this);
-
+ for (int j=0; j < 2; j++)
+ if (axis_group_l_a_[j])
+ axis_group_l_a_[j]->remove_element (this);
}
-void
-Score_elem::OK()const
+
+Link_array<Score_elem>
+Score_elem::get_extra_dependencies() const
{
-#ifndef NDEBUG
- for (int i=0; i < dependency_size(); i++) {
- dependency(i)->OK();
- }
-#endif
+ Link_array<Score_elem> empty;
+ return empty;
}
-Link_array<Score_elem>
-Score_elem::get_extra_dependencies()const
+bool
+Score_elem::linked_b() const
{
- Link_array<Score_elem> empty;
- return empty;
+ return get_extra_dependencies().size() ||
+ dependency_size();
}
+
+