X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fitem.cc;h=eba020f52b8440a63922493cdfefac429123b4eb;hb=875cf3061b68867a109cdaf52c93be868a3e01be;hp=daaf880a96abd8b5df2add34fdef3f979637af09;hpb=65a284d681d8a099efb60be7a938a7f98d58cc73;p=lilypond.git diff --git a/lily/item.cc b/lily/item.cc index daaf880a96..eba020f52b 100644 --- a/lily/item.cc +++ b/lily/item.cc @@ -3,96 +3,127 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ +#include "dimension-cache.hh" -#include "p-score.hh" +#include "paper-score.hh" #include "debug.hh" #include "item.hh" -#include "p-col.hh" -#include "elem-group.hh" +#include "paper-column.hh" #include "spanner.hh" +#include "lily-guile.hh" -Item::Item() +Item::Item () { - break_priority_i_ = 0; - breakable_b_ = false; - break_status_i_ = 0; broken_to_drul_[LEFT] = broken_to_drul_[RIGHT]=0; } -IMPLEMENT_IS_TYPE_B1(Item, Score_elem); +bool +Item::breakable_b () const +{ + if (original_l_ ) + return false; + + Item * i =dynamic_cast (parent_l (X_AXIS)); + return (i) ? i->breakable_b () : get_elt_property( "breakable") != SCM_UNDEFINED; +} void Item::do_print() const { -#ifndef NPRINT - DOUT << "breakable_b_: " << breakable_b_ << - " break_status_i_: " <line_l() : 0; + Graphical_element *g = parent_l (X_AXIS); + if (!g) + return 0; + return dynamic_cast (g)-> line_l (); } -int -Item::break_status_i() const -{ - return break_status_i_; -} void Item::copy_breakable_items() { - if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]) - return; + if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT] + || !breakable_b ()) + return ; + Drul_array new_copies; Direction i=LEFT; do { - Item * item_p = clone()->item (); - - item_p->break_status_i_ = i; + Score_element * dolly = clone(); + Item * item_p = dynamic_cast(dolly); pscore_l_->typeset_element (item_p); - item_p->handle_prebroken_dependencies(); new_copies[i] =item_p; } - while ((i *= -1) != LEFT); + while (flip(&i) != LEFT); broken_to_drul_= new_copies; + + do + { + broken_to_drul_[i]->handle_prebroken_dependencies(); + broken_to_drul_[i]->try_visibility_lambda(); + } + while (flip(&i) != LEFT); + try_visibility_lambda (); } void -Item::do_breakable_col_processing() +Item::try_visibility_lambda () { - if (!breakable_b_) - return; + SCM vis = remove_elt_property ("visibility-lambda"); + if (vis != SCM_UNDEFINED) + { + SCM args = scm_listify (gh_int2scm (break_status_dir ()), SCM_UNDEFINED); + SCM result = gh_apply (vis, args); + int trans = gh_scm2bool (gh_car (result)); + int empty = gh_scm2bool (gh_cdr (result)); + + if (empty) + set_empty (true, X_AXIS, Y_AXIS); + if (trans) + set_elt_property ("transparent", SCM_BOOL_T); + } +} +void +Item::do_break () +{ copy_breakable_items(); handle_prebroken_dependencies(); - + /* Otherwise the broken items won't be pre_process()'ed. - */ + */ add_dependency (broken_to_drul_[LEFT]); - add_dependency (broken_to_drul_[RIGHT]); + add_dependency (broken_to_drul_[RIGHT]); +} +void +Item::do_breakable_col_processing() +{ + if (breakable_b ()) + do_break (); + else + try_visibility_lambda (); } -Item* -Item::find_prebroken_piece (Line_of_score*l) const +Score_element* +Item::find_broken_piece (Line_of_score*l) const { if (line_l() == l) - return (Item*)this; + return (Item*)(this); else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l) return broken_to_drul_[LEFT]; else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l) @@ -102,59 +133,98 @@ Item::find_prebroken_piece (Line_of_score*l) const } Item* -Item::find_prebroken_piece (int breakstatus) const +Item::find_broken_piece (Direction d) const { - if (!breakstatus) - return (Item *) this; // ugh + if (!d) + return (Item *) (this); // ugh else - return (Item*) broken_to_drul_[(Direction)breakstatus]; + return dynamic_cast (broken_to_drul_[d]); } void Item::handle_prebroken_dependencies() { - if (breakable_b_) - Score_elem::handle_prebroken_dependencies(); + if (original_l_) + Score_element::handle_prebroken_dependencies(); +} + +bool +Item::broken_original_b () const +{ + return broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]; } int Item::left_right_compare(Item const *l, Item const *r) { - while (!l->is_type_b (Paper_column::static_name ())) - l = l->axis_group_l_a_[X_AXIS]->item(); - while (!r->is_type_b (Paper_column::static_name ())) - r = r->axis_group_l_a_[X_AXIS]->item(); - - Paper_column *p1 = (Paper_column*)l; - Paper_column* p2 = (Paper_column*)r; + Paper_column *p1 = l->column_l (); + Paper_column* p2 = r->column_l (); return p1->rank_i () - p2->rank_i (); } +Paper_column * +Item::column_l () const +{ + return dynamic_cast (parent_l (X_AXIS))->column_l (); +} -bool -Item::linked_b() const +Item::Item (Item const &s) + : Score_element (s) { - return Score_elem::linked_b() || attached_span_l_arr_.size(); + broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0; } + void -Item::do_junk_links() +Item::handle_prebroken_dependents () { - attached_span_l_arr_.set_size(0); + Item * parent = dynamic_cast (parent_l (X_AXIS)); + if (breakable_b () && parent) + { + if(!(broken_to_drul_[LEFT] || broken_to_drul_[RIGHT])) + do_break (); + + Direction d = LEFT; + do + { + Item * broken_self = find_broken_piece (d); + Item * broken_parent = parent->find_broken_piece (d); + + broken_self->set_parent (broken_parent, X_AXIS); + + /* + ugh. Should do this is after breaking? + */ + if (!broken_self->parent_l (Y_AXIS)) + { + Score_element * yparent =dynamic_cast(parent_l (Y_AXIS)); + Item *yparenti = dynamic_cast (yparent); + Item *broken_yparent = yparenti ? + yparenti->find_broken_piece (d) : 0; + + if (!yparent) + programming_error ("Vertical refpoint lost!"); + else if (yparenti) + { + broken_self->set_parent (broken_yparent, Y_AXIS); + } + } + } + while ((flip (&d))!=LEFT); + } } -void -Item::do_unlink() +Direction +Item::break_status_dir () const { - Link_array attached = attached_span_l_arr_; + if (original_l_) + { + Item * i = dynamic_cast (original_l_); - for (int i=0; i < attached_span_l_arr_.size (); i++) { - Spanner *&s= attached_span_l_arr_[i]; - if (s->spanned_drul_[LEFT] == this) - s->set_bounds (LEFT, 0); - if (s->spanned_drul_[RIGHT] == this) - s->set_bounds (RIGHT,0); - s =0; - } - attached_span_l_arr_.set_size (0); + return (i->broken_to_drul_[LEFT] == this) ? LEFT : RIGHT; + } + else + return CENTER; } + +