#include "dimen.hh"
#include "spanner.hh"
#include "scoreline.hh"
+#include "item.hh"
+#include "p-col.hh"
Score_elem*
Score_elem::dependency(int i)const
Score_elem::TeX_string() const
{
assert( status > POSTCALCED);
+ if (transparent_b_ )
+ return "";
String s("\\placebox{%}{%}{%}");
Array<String> a;
a.push(print_dimen(offset_.y));
Score_elem::Score_elem(Score_elem const&s)
{
+ transparent_b_ = s.transparent_b_;
+ empty_b_ = s.empty_b_;
/* 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);
- group_element_i_ = 0;
+ x_group_element_i_ = 0;
+ y_group_element_i_ = 0;
status = s.status;
assert(!s.output);
output = 0;
delete output;
status = DELETED;
output = 0;
- assert(!group_element_i_ );
+ assert(!x_group_element_i_ && !y_group_element_i_);
}
+void
+Score_elem::translate_x(Real x)
+{
+ offset_.x += x;
+}
+
+
+
+void
+Score_elem::translate_y(Real y)
+{
+ offset_.y += y;
+}
+
+
void
Score_elem::translate(Offset O)
{
- offset_ += O;
+ translate_y(O.y);
+ translate_x(O.x);
}
Interval
Score_elem::do_width() const
{
Interval r;
-
+
if (!output){
Molecule*m = brew_molecule_p();
r = m->extent().x;
Interval
Score_elem::width() const
{
- Interval r=do_width();
+ Interval r=(empty_b_)?Interval(0,0):do_width();
if (!r.empty_b()) // float exception on DEC Alpha
r+=offset_.x;
Interval
Score_elem::height() const
{
- Interval r=do_height();
+ Interval r=(empty_b_)?Interval(0,0): do_height();
if (!r.empty_b())
r+=offset_.y;
{
#ifndef NPRINT
mtor << name() << "{\n";
- mtor << "deps: " << dependent_size() << "depts: \n" <<
+ mtor << "dets: " << dependent_size() << "dependencies: " <<
dependency_size() << "\n";
do_print();
if (output)
Score_elem::Score_elem()
{
- group_element_i_ = 0;
+ transparent_b_ = empty_b_ = false;
+ x_group_element_i_ = 0;
+ y_group_element_i_ =0;
pscore_l_=0;
offset_ = Offset(0,0);
output = 0;
status = PRECALCED;
}
+void
+Score_elem::breakable_col_processing()
+{
+ if (status >= PREBROKEN )
+ return;
+
+ assert(status != PREBREAKING); // cyclic dependency
+ status = PREBREAKING;
+
+ for (int i=0; i < dependency_size(); i++)
+ dependency(i)->breakable_col_processing();
+
+
+ do_breakable_col_processing();
+ status = PREBROKEN;
+}
+
void
Score_elem::break_processing()
{
for (int i=0; i < dependency_size(); i++)
dependency(i)->molecule_processing();
+ if (transparent_b_)
+ return ;
output= brew_molecule_p();
}
{
}
+void
+Score_elem::do_breakable_col_processing()
+{
+ handle_prebroken_dependencies();
+}
+
void
Score_elem::do_pre_processing()
{
IMPLEMENT_STATIC_NAME(Score_elem);
+IMPLEMENT_IS_TYPE_B(Score_elem);
Molecule*
Score_elem::brew_molecule_p()const
Directed_graph_node::add(e);
}
-bool
-Score_elem::is_type_b(char const *s)
-{
- return s == static_name();
-}
void
Score_elem::handle_broken_dependencies()
Spanner * broken = sp->find_broken_piece(line);
do_substitute_dependency(sp, broken);
add_dependency(broken);
- remove_us_arr.push(sp);
+ } 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);
+ do_substitute_dependency( elt, my_item);
+ if (my_item)
+ add_dependency( my_item);
}
remove_us_arr.push(elt);
}
for (int i=0; i <remove_us_arr.size(); i++)
remove_dependency(remove_us_arr[i]);
+ /* Reset this. If we are a (broken) copy of a spanner, then
+ break_processing() was not called on us (and we are not breaking). */
if (status < BROKEN)
status = BROKEN;
}
+/*
+ This sux.
+
+ unlike with spanners, the number of items can increase
+
+ span: item1
+
+ becomes
+
+ span: item1 item2 item3
+
+ How to let span (a derived class) know that this happened?
+ */
+void
+Score_elem::handle_prebroken_dependencies()
+{
+ Link_array<Score_elem> remove_us_arr;
+ for (int i=0; i < dependency_size(); i++) {
+ Score_elem * elt = dependency(i);
+ Item *it_l = elt->item();
+ if (it_l && it_l->pcol_l_->breakable_b())
+ if (item()) {
+ Score_elem *new_l = it_l->find_prebroken_piece(item()->pcol_l_);
+ if (new_l != elt ) {
+ do_substitute_dependency( elt, new_l);
+ remove_us_arr.push(elt);
+
+ add_dependency(new_l);
+ }
+ }else {
+ add_dependency(it_l->broken_to_a_[0]);
+ add_dependency(it_l->broken_to_a_[1]);
+ }
+
+ }
+
+ 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]);
+
+ /*
+ see comment at handle_broken_dependencies()
+ */
+ if (status < PREBROKEN)
+ status = PREBROKEN;
+}
+
+
void
Score_elem::unlink_all()
for (int i=0; i < dependency_size(); i++)
dependency(i)->unlink_all();
junk_links();
- group_element_i_ = 0;
+ y_group_element_i_ = 0;
+ x_group_element_i_ = 0;
}
void