X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Frest-collision.cc;h=77eecea668677c904a23e72808f45897fd77295a;hb=d36e8ced83cfeabcf4ec3840ffe93a717a17ac4d;hp=3e66ec751300ef138689e08880c616324f6d2ce0;hpb=2862b1027f316a2f0444fa92e441ee28acf7a463;p=lilypond.git diff --git a/lily/rest-collision.cc b/lily/rest-collision.cc index 3e66ec7513..77eecea668 100644 --- a/lily/rest-collision.cc +++ b/lily/rest-collision.cc @@ -3,130 +3,93 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include "debug.hh" #include "rest-collision.hh" -#include "rest-column.hh" #include "note-column.hh" #include "stem.hh" #include "note-head.hh" #include "collision.hh" #include "paper-def.hh" - -IMPLEMENT_IS_TYPE_B1(Rest_collision,Item); - void -Rest_collision::add (Note_column *nc_l) +Rest_collision::add_column (Note_column *nc_l) { add_dependency (nc_l); - ncol_l_arr_.push (nc_l); -} - -void -Rest_collision::add (Rest_column *rc_l) -{ - add_dependency (rc_l); - rest_l_arr_.push (rc_l); + if (nc_l->rest_b ()) + rest_l_arr_.push (nc_l); + else + ncol_l_arr_.push (nc_l); } void Rest_collision::do_post_processing() { /* + [TODO] handle rest under beam (do_post: beams are calculated now) - - [todo] - i-d like to have access to the beam itself, - iso only the (half-initialised?) stem - what about combination of collisions and rest under beam */ - - // no rests to collide - if (!rest_l_arr_.size()) - return; - // can this happen? - Stem* stem_l = rest_l_arr_[0]->stem_l_; - if (!stem_l) - return; - // no beam - if (!(stem_l->beams_left_i_ || stem_l->beams_right_i_)) - return; - - int dir_i = rest_l_arr_[0]->dir_; - int midpos = 4; -#if 1 - // ugh - int stem_length_i = 7 - 2; - // ugh, Stem::stem_start vs Stem::stem_end - int pos = (int)(stem_l->stem_end_f() - midpos) - dir_i * stem_length_i; -#else // nogo: stem_start not set for rests? - int pos = (stem_l->stem_start_f() - midpos) + dir_i * 2; -#endif - rest_l_arr_[0]->translate_heads (pos); } void Rest_collision::do_pre_processing() { /* - handle rest-rest and rest-note collisions + handle rest-rest and rest-note collisions - [todo] - decide not to print rest if too crowded? + [todo] + decide not to print rest if too crowded? */ // no rests to collide if (!rest_l_arr_.size()) - return; + return; // no partners to collide with if (rest_l_arr_.size() + ncol_l_arr_.size () < 2) - return; + return; // meisjes met meisjes if (!ncol_l_arr_.size()) { - int dy = rest_l_arr_.size() > 2 ? 6 : 4; + int dy = rest_l_arr_.size() > 2 ? 6 : 4; - rest_l_arr_[0]->translate_heads (rest_l_arr_[0]->dir_ *dy); - // top is last element... - rest_l_arr_.top()->translate_heads (rest_l_arr_.top ()->dir_* dy); + rest_l_arr_[0]->translate_rests (rest_l_arr_[0]->dir () *dy); + // top is last element... + rest_l_arr_.top()->translate_rests (rest_l_arr_.top ()->dir ()* dy); } // meisjes met jongetjes else { -#if 0 // breendet: rests go always under - // geen gemug, trug op je rug - int dir_i = -1; - rest_l_arr_[0]->translate_heads (dir_i * 3); -#else - // int dir_i = - ncol_l_arr_[0]->dir_; - int dir_i = rest_l_arr_[0]->dir_; - // hope it's 4: if it works->doco - int midpos = 4; + // int dir_i = - ncol_l_arr_[0]->dir_; + Direction dir = rest_l_arr_[0]->dir (); // minimum move - int minpos = 4; + int minpos = 4; - // quart rest height - // UGH Should get dims from table! - int size_i = 6; + // quart rest height + // UGH Should get dims from table! + int size_i = 6; - int sep_i = 3 + size_i / 2; - for (int i = 0; i < ncol_l_arr_.size(); i++) - { - // how to know whether to sort? - ncol_l_arr_[i]->sort(); - for (int j = 0; j < ncol_l_arr_[i]->head_l_arr_.size(); j++) - minpos = minpos >? dir_i * - (ncol_l_arr_[i]->head_l_arr_[j]->position_i_ -midpos) + sep_i; - } - rest_l_arr_[0]->translate_heads (dir_i * minpos); -#endif + + // staff ref'd? + Real internote_f = paper_l ()->get_realvar (interline_scm_sym)/2.0; + int sep_i = 3 + size_i / 2; + for (int i = 0; i < ncol_l_arr_.size(); i++) + { + // how to know whether to sort? + ncol_l_arr_[i]->sort(); + for (int j = 0; j < ncol_l_arr_[i]->head_l_arr_.size(); j++) + { + int stem = (int)((ncol_l_arr_[i]->stem_l_->extent + (Y_AXIS)[dir]) / internote_f); + minpos = minpos >? (dir * stem + sep_i); + } + } + rest_l_arr_[0]->translate_rests (dir * minpos); } } @@ -140,17 +103,18 @@ Rest_collision::do_print() const } void -Rest_collision::do_substitute_dependency (Score_elem*o,Score_elem*n) +Rest_collision::do_substitute_element_pointer (Score_element*o,Score_element*n) { - Item*o_l = o->item(); - Item*n_l = n?n->item():0; - - rest_l_arr_.substitute ((Rest_column*)o_l,(Rest_column*)n_l); - ncol_l_arr_.substitute ((Note_column*)o_l,(Note_column*)n_l); + if (Note_column *onl = dynamic_cast (o)) + { + Note_column *n_l = n?dynamic_cast (n):0; + rest_l_arr_.substitute (onl, n_l); + ncol_l_arr_.substitute (onl, n_l); + } } Rest_collision::Rest_collision() { - transparent_b_ = true; - empty_b_ = true; + set_elt_property (transparent_scm_sym, SCM_BOOL_T); + set_empty (true); }