(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::make_TeX_string (Offset o)const
-{
- 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::do_TeX_output_str () const
+Score_elem::Score_elem()
{
- return make_TeX_string(absolute_offset());
+ transparent_b_ = false;
+ pscore_l_=0;
+ status_i_ = 0;
}
Score_elem::Score_elem (Score_elem const&s)
+ : Directed_graph_node (s), Graphical_element (s)
{
/* 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
*/
copy_edges_out (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;
+ status_i_ = s.status_i_;
pscore_l_ = s.pscore_l_;
- offset_ = Offset (0,0);
}
Score_elem::~Score_elem()
{
- // some paranoia to prevent weird segv's
- assert (status_ < DELETED);
- delete output;
- status_ = DELETED;
- output = 0;
+ assert (status_i_ >=0);
+ status_i_ = -1;
}
-/*
- 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;
-}
-
-
-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
-Score_elem::extent (Axis a) const
-{
- Interval r;
- if (!empty_b_)
- {
-
- r = (a == X_AXIS)? do_width(): do_height ();
- }
+ Molecule*m = brew_molecule_p();
+ r = m->extent().x ();
+ delete m;
- if (!r.empty_b()) // float exception on DEC Alpha
- r+=offset_[a];
-
return r;
}
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 ();
+ Molecule*m = brew_molecule_p();
+ r = m->extent().y ();
+ delete m;
return r;
}
-Interval
-Score_elem::height() const
-{
- return extent (Y_AXIS);
-}
/*
STANDARD METHS
DOUT << name() << "{\n";
DOUT << "dets: " << dependent_size() << "dependencies: " <<
dependency_size();
- if (offset_.x() || offset_.y ())
- DOUT << "offset (" << offset_.x() << ", " << offset_.y () <<")";
- DOUT << "\n";
-
+
+ Graphical_element::print ();
do_print();
- if (output)
- output->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
return pscore_l_->paper_l_;
}
+
void
Score_elem::add_processing()
{
- if (status_ >= VIRGIN)
+ if (status_i_)
return;
- status_ = VIRGIN;
+ 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)
+ 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();
+ 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();
+ extra[i]->calcalute_dependencies (final, busy, funcptr);
-
- do_breakable_col_processing();
- status_ = PREBROKEN;
+ invalidate_cache (X_AXIS);
+ invalidate_cache (Y_AXIS);
+ (this->*funcptr)();
+ status_i_= final;
}
void
-Score_elem::break_processing()
+Score_elem::do_brew_molecule ()
{
- 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();
-
+ if (transparent_b_)
+ return ;
+ Molecule *output= brew_molecule_p ();
+ pscore_l_->outputter_l_->output_molecule (output, absolute_offset ());
+}
+/*
- do_break_processing();
- status_ = BROKEN;
+ VIRTUAL STUBS
-}
+ */
void
Score_elem::do_break_processing()
handle_broken_dependencies();
}
-
-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;
-}
-
-Score_elem::Status
-Score_elem::status() const
-{
- return status_;
-}
-
-void
-Score_elem::molecule_processing()
-{
- if (status_ >= BREWED)
- return;
- status_ = BREWED; // 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();
-}
-
-String
-Score_elem::TeX_output_str() const
-{
- String s;
- if (status_ >= TEXOUTPUT)
- return "";
-
- ((Score_elem*)this)->status_ = TEXOUTPUT;
-
- for (int i=0; i < dependency_size(); i++)
- s += dependency (i)->TeX_output_str();
-
- Link_array<Score_elem> extra (get_extra_dependencies());
- for (int i=0; i < extra.size(); i++)
- s += extra[i]->TeX_output_str ();
-
- if (!transparent_b_)
- s+= do_TeX_output_str();
-
- return s;
-}
-
-/*
-
- VIRTUAL STUBS
-
- */
void
Score_elem::do_post_processing()
{
{
}
-IMPLEMENT_IS_TYPE_B(Score_elem);
+IMPLEMENT_IS_TYPE_B1(Score_elem, Graphical_element);
Molecule*
Score_elem::brew_molecule_p() const
remove_us_arr.uniq();
for (int i=0; i <remove_us_arr.size(); i++)
remove_dependency (remove_us_arr[i]);
-
- status_ = BROKEN;
}
/*
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]);
+ 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;
}
-
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_[X_AXIS] = axis_group_l_a_[Y_AXIS] =0;
- do_unlink();
+ Directed_graph_node::junk_links();
+ Graphical_element::junk_links ();
+ do_junk_links();
}
void
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
-{
-#ifndef NDEBUG
- for (int i=0; i < dependency_size(); i++)
- {
- dependency (i)->OK();
- }
-#endif
-}
Link_array<Score_elem>
Score_elem::get_extra_dependencies() const
return get_extra_dependencies().size() ||
dependency_size();
}
+
+