X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnote-spacing.cc;h=8c291dbad384a6ab5681f729118aa29f36480b40;hb=7aabfb20c46e0a1de41698ddc6859ccd3a6dea85;hp=fee2bb8b0703286822e2f4626b24651743eca54c;hpb=cea67fef5f76fa6d939c06e0164a4ad3105fa2d9;p=lilypond.git diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index fee2bb8b07..8c291dbad3 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2002 Han-Wen Nienhuys + (c) 2001--2003 Han-Wen Nienhuys */ @@ -17,12 +17,7 @@ #include "stem.hh" #include "separation-item.hh" #include "staff-spacing.hh" - -bool -Note_spacing::has_interface (Grob* g) -{ - return g && g->has_interface (ly_symbol2scm ("note-spacing-interface")); -} +#include "accidental-placement.hh" void Note_spacing::get_spacing (Grob *me, Item* right_col, @@ -54,13 +49,13 @@ Note_spacing::get_spacing (Grob *me, Item* right_col, if (!it) continue; - Item *it_col = it->column_l (); + Item *it_col = it->get_column (); if (d == RIGHT && right_col != it_col) continue; if (Separation_item::has_interface (it)) { - extents[d].unite (Separation_item::my_width (it)); + extents[d].unite (Separation_item::width (it)); continue; } @@ -71,6 +66,10 @@ Note_spacing::get_spacing (Grob *me, Item* right_col, if (!g) g = Note_column::first_head (it); + /* + Ugh. If Stem is switched off, we don't know what the + first note head will be. + */ if (g) left_head_wid = g->extent(it_col, X_AXIS); } @@ -83,7 +82,12 @@ Note_spacing::get_spacing (Grob *me, Item* right_col, accs = Note_column::accidentals (it->get_parent (X_AXIS)); if (accs) - extents[d].unite (accs->extent (it_col, X_AXIS)); + { + Interval v = + Accidental_placement::get_relevant_accidental_extent (accs, it_col, me); + + extents[d].unite (v); + } } } @@ -102,10 +106,22 @@ Note_spacing::get_spacing (Grob *me, Item* right_col, */ *fixed = left_head_wid.empty_b () ? increment : left_head_wid[RIGHT]; *space = (base_space - increment) + *fixed + - (extents[LEFT][RIGHT] - left_head_wid[RIGHT])/ 2; - ; + (extents[LEFT][RIGHT] + - (left_head_wid.empty_b () ? 0.0 : left_head_wid[RIGHT]))/ 2; - if (*space - *fixed < 2 * ((- extents[RIGHT][LEFT]) >? 0)) + if (Item::breakable_b (right_col) + || right_col->original_) + { + /* + This is for the situation + + rest | 3/4 (eol) + + */ + *space += -extents[RIGHT][LEFT]; + *fixed += -extents[RIGHT][LEFT]; + } + else if (*space - *fixed < 2 * ((- extents[RIGHT][LEFT]) >? 0)) { /* @@ -118,16 +134,16 @@ Note_spacing::get_spacing (Grob *me, Item* right_col, *space += 0.5 * (( -extents[RIGHT][LEFT]) >? 0); } - *space += stem_dir_correction (me, right_col, increment); + stem_dir_correction (me, right_col, increment, space, fixed); } Item * Note_spacing::left_column (Grob *me) { - if (me->immutable_property_alist_ == SCM_EOL) + if (!me->live()) return 0; - return dynamic_cast (me)->column_l (); + return dynamic_cast (me)->get_column (); } /* @@ -141,10 +157,7 @@ prune RIGHT-ITEMS. Item * Note_spacing::right_column (Grob*me) { - /* - ugh. should have generic is_live() method? - */ - if (me->immutable_property_alist_ == SCM_EOL) + if (!me->live()) return 0; SCM right = me->get_grob_property ("right-items"); @@ -155,8 +168,8 @@ Note_spacing::right_column (Grob*me) { Item * ri = unsmob_item (gh_car (s)); - Item * col = ri->column_l (); - int rank = Paper_column::rank_i (col); + Item * col = ri->get_column (); + int rank = Paper_column::get_rank (col); if (rank < min_rank) { @@ -174,7 +187,7 @@ Note_spacing::right_column (Grob*me) SCM newright = SCM_EOL; for (SCM s = right ; gh_pair_p (s) ; s =gh_cdr (s)) { - if (unsmob_item (gh_car (s))->column_l () == mincol) + if (unsmob_item (gh_car (s))->get_column () == mincol) newright = gh_cons (gh_car (s), newright); } @@ -184,7 +197,7 @@ Note_spacing::right_column (Grob*me) if (!mincol) { /* - int r = Paper_column::rank_i (dynamic_cast(me)->column_l ()); + int r = Paper_column::get_rank (dynamic_cast(me)->get_column ()); programming_error (_f("Spacing wish column %d has no right item.", r)); */ @@ -202,9 +215,10 @@ Note_spacing::right_column (Grob*me) TODO: have to check wether the stems are in the same staff. */ -Real +void Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, - Real increment) + Real increment, + Real * space, Real *fixed) { Drul_array stem_dirs(CENTER,CENTER); Drul_array stem_posns; @@ -213,14 +227,13 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, me->get_grob_property ("right-items")); Drul_array beams_drul(0,0); - Real correction = 0.0; stem_dirs[LEFT] = stem_dirs[RIGHT] = CENTER; Interval intersect; Interval bar_xextent; Interval bar_yextent; - bool correct = true; + bool correct_stem_dirs = true; Direction d = LEFT; bool acc_right = false; @@ -233,13 +246,13 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, if (d == RIGHT) acc_right = acc_right || Note_column::accidentals (it); - Grob *stem = Note_column::stem_l (it); + Grob *stem = Note_column::get_stem (it); - if (!stem) + if (!stem || !stem->live ()) { if (d == RIGHT && Separation_item::has_interface (it)) { - if (it->column_l () != rcolumn) + if (it->get_column () != rcolumn) { it = it->find_prebroken_piece (rcolumn->break_status_dir ()); } @@ -252,23 +265,23 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, break; } - goto exit_func; + return ; } if(Stem::invisible_b (stem)) { - correct = false; - goto exit_func ; + correct_stem_dirs = false; + continue; } - beams_drul[d] = Stem::beam_l (stem); + beams_drul[d] = Stem::get_beam (stem); Direction sd = Stem::get_direction (stem); if (stem_dirs[d] && stem_dirs[d] != sd) { - correct = false; - goto exit_func; + correct_stem_dirs = false; + continue; } stem_dirs[d] = sd; @@ -277,10 +290,9 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, hanging from the note. */ if (d == LEFT - && Stem::duration_log (stem) > 2 && !Stem::beam_l (stem)) + && Stem::duration_log (stem) > 2 && !Stem::get_beam (stem)) { - correct = false; - goto exit_func; + correct_stem_dirs = false; } @@ -298,10 +310,11 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, /* don't correct if accidentals are sticking out of the right side. - */ if (acc_right) - return 0.0; + return ; + + Real correction = 0.0; if (!bar_yextent.empty_b()) { @@ -309,7 +322,7 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, stem_posns[RIGHT] = bar_yextent; } - if (correct &&stem_dirs[LEFT] *stem_dirs[RIGHT] == -1) + if (correct_stem_dirs && stem_dirs[LEFT] *stem_dirs[RIGHT] == -1) { if (beams_drul[LEFT] && beams_drul[LEFT] == beams_drul[RIGHT]) { @@ -318,33 +331,36 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, */ correction = increment* stem_dirs[LEFT]; + correction *= gh_scm2double (me->get_grob_property ("knee-spacing-correction")); + *fixed += correction; } else { intersect = stem_posns[LEFT]; intersect.intersect(stem_posns[RIGHT]); - correct = correct && !intersect.empty_b (); + correct_stem_dirs = correct_stem_dirs && !intersect.empty_b (); - if (!correct) - return 0.0; - - correction = abs (intersect.length ()); + if (correct_stem_dirs) + { + correction =abs (intersect.length ()); - /* - Ugh. 7 is hardcoded. - */ - correction = (correction/7) get_grob_property ("stem-spacing-correction")); - + /* + Ugh. 7 is hardcoded. + */ + correction = (correction/7) get_grob_property ("stem-spacing-correction")); + } + if (!bar_yextent.empty_b()) { correction *= 0.5; } } } - else if (correct && stem_dirs[LEFT] *stem_dirs[RIGHT] == UP) + else if (correct_stem_dirs && stem_dirs[LEFT] *stem_dirs[RIGHT] == UP) { /* Correct for the following situation: @@ -369,7 +385,7 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, Interval hp = head_posns[LEFT]; hp.intersect (head_posns[RIGHT]); if (!hp.empty_b()) - return 0.0; + return ; Direction lowest = (head_posns[LEFT][DOWN] > head_posns[RIGHT][UP]) ? RIGHT : LEFT; @@ -381,11 +397,14 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, correction= -lowest * corr ; } - if (!bar_xextent.empty_b()) - correction += - bar_xextent[LEFT]; - - exit_func: - return correction; + *space += correction; + +#if 0 + /* there used to be a correction for bar_xextent() here, but + it's unclear what that was good for ? + */ +#endif + } @@ -393,5 +412,5 @@ Note_spacing::stem_dir_correction (Grob*me, Item * rcolumn, ADD_INTERFACE (Note_spacing,"note-spacing-interface", "", - "left-items right-items stem-spacing-correction"); + "left-items right-items stem-spacing-correction knee-spacing-correction");