X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstaff-spacing.cc;h=7e1db27b06766e99525562a5943795fff7a6cd53;hb=36f6766b9de37adb09d2a27e3f925b356cbc0849;hp=9e995156cfb638cdd3f51996cf73a3d82d1a2ee5;hpb=c5dcd1764a635088bea85e46e0f5be3d3b134a3f;p=lilypond.git diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index 9e995156cf..7e1db27b06 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -3,16 +3,16 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2002 Han-Wen Nienhuys + (c) 2001--2005 Han-Wen Nienhuys */ -#include + +#include "staff-spacing.hh" + +#include #include "paper-column.hh" #include "separation-item.hh" -#include "item.hh" -#include "staff-spacing.hh" -#include "grob.hh" #include "warn.hh" #include "bar-line.hh" #include "staff-symbol-referencer.hh" @@ -33,7 +33,7 @@ Staff_spacing::next_note_correction (Grob * me, if (!g || !Note_column::has_interface (g)) return 0.0; - Item *col =dynamic_cast (g)->column_l (); + Item *col = dynamic_cast (g)->get_column (); Real max_corr = 0. >? (- g->extent (col, X_AXIS)[LEFT]); /* @@ -41,12 +41,17 @@ Staff_spacing::next_note_correction (Grob * me, */ if (Grob * a = Note_column::accidentals (g)) { - Interval v= Accidental_placement::get_relevant_accidental_extent - (a, col, me); + Interval v; + if (Accidental_placement::has_interface (a)) + { + v = Accidental_placement::get_relevant_accidental_extent (a, col, me); + } + else + v = a->extent (col, X_AXIS); max_corr = max_corr >? (- v[LEFT]); } - if (Grob* a = unsmob_grob (g->get_grob_property ("arpeggio"))) + if (Grob* a = unsmob_grob (g->get_property ("arpeggio"))) { max_corr = max_corr >? (- a->extent (col, X_AXIS)[LEFT]); } @@ -55,11 +60,11 @@ Staff_spacing::next_note_correction (Grob * me, Let's decrease the space a little if the problem is not located after a barline. */ - if (bar_size.empty_b ()) + if (bar_size.is_empty ()) max_corr *= 0.75; - if (!bar_size.empty_b()) - if (Grob *stem = Note_column::stem_l (g)) + if (!bar_size.is_empty ()) + if (Grob *stem = Note_column::get_stem (g)) { Direction d = Stem::get_direction (stem); if (d == DOWN) @@ -73,7 +78,7 @@ Staff_spacing::next_note_correction (Grob * me, Real corr = abs (stem_posns.length ()/7.) get_grob_property ("stem-spacing-correction")); + robust_scm2double (me->get_property ("stem-spacing-correction"), 1); if (d != DOWN) corr = 0.0; @@ -91,17 +96,17 @@ Interval Staff_spacing::bar_y_positions (Grob *bar_grob) { Interval bar_size; - bar_size.set_empty(); + bar_size.set_empty (); if (Bar_line::has_interface (bar_grob)) { - SCM glyph = bar_grob->get_grob_property ("glyph"); + SCM glyph = bar_grob->get_property ("glyph"); - String glyph_str = gh_string_p (glyph) ? ly_scm2string (glyph) : ""; - if (glyph_str.left_str (1) == "|" || glyph_str.left_str (1) == ".") + String glyph_string = scm_is_string (glyph) ? ly_scm2string (glyph) : ""; + if (glyph_string.left_string (1) == "|" || glyph_string.left_string (1) == ".") { - SCM sz = Bar_line::get_staff_bar_size (bar_grob->self_scm()); - bar_size = Interval (-1,1); - bar_size *= gh_scm2double (sz) + SCM sz = Bar_line::get_staff_bar_size (bar_grob->self_scm ()); + bar_size = Interval (-1, 1); + bar_size *= robust_scm2double (sz, 1) / Staff_symbol_referencer::staff_space (bar_grob); } } @@ -120,72 +125,41 @@ Real Staff_spacing::next_notes_correction (Grob *me, Grob * last_grob) { Interval bar_size = bar_y_positions (last_grob); - Real max_corr =0.0; - for (SCM s = me->get_grob_property ("right-items"); - gh_pair_p (s); s = gh_cdr (s)) + Real max_corr = 0.0; + + for (SCM s = me->get_property ("right-items"); + scm_is_pair (s); s = scm_cdr (s)) { - Grob * g = unsmob_grob (gh_car (s)); + Grob * g = unsmob_grob (scm_car (s)); + max_corr = max_corr >? next_note_correction (me, g, bar_size); - for (SCM t = g->get_grob_property ("elements"); - gh_pair_p (t); t = gh_cdr (t)) - max_corr = max_corr >? next_note_correction (me, unsmob_grob (gh_car (t)), bar_size); + for (SCM t = g->get_property ("elements"); + scm_is_pair (t); t = scm_cdr (t)) + max_corr = max_corr >? next_note_correction (me, unsmob_grob (scm_car (t)), bar_size); } + return max_corr; } -/* - Try to find the break-aligned symbol in SEPARATION_ITEM that is - sticking out at direction D. The x size is put in LAST_EXT -*/ -Grob* -Staff_spacing::extremal_break_aligned_grob (Grob *separation_item, Direction d, - Interval * last_ext) -{ - Grob *left_col = dynamic_cast (separation_item)->column_l (); - last_ext->set_empty (); - Grob *last_grob = 0; - for (SCM s = separation_item->get_grob_property ("elements"); - gh_pair_p (s); s = gh_cdr (s)) - { - Grob * break_item = unsmob_grob (gh_car (s)); - - if (!gh_symbol_p (break_item->get_grob_property ("break-align-symbol"))) - continue; - - Interval ext = break_item->extent (left_col, X_AXIS); - - if (ext.empty_b ()) - continue; - if (!last_grob - || (last_grob && d * (ext[d]- (*last_ext)[d]) > 0) ) - { - *last_ext = ext; - last_grob = break_item; - } - } - - return last_grob; -} - void Staff_spacing::get_spacing_params (Grob *me, Real * space, Real * fixed) { *space = 1.0; *fixed = 1.0; - Grob * separation_item=0; + Grob * separation_item = 0; Item * me_item = dynamic_cast (me); - for (SCM s = me->get_grob_property ("left-items"); - gh_pair_p (s); s = gh_cdr(s)) + for (SCM s = me->get_property ("left-items"); + scm_is_pair (s); s = scm_cdr (s)) { - Grob * cand = unsmob_grob(gh_car (s)); + Grob * cand = unsmob_grob (scm_car (s)); if (cand && Separation_item::has_interface (cand)) separation_item = cand ; } - // printf ("doing col %d\n" , Paper_column::rank_i(left_col)); + // printf ("doing col %d\n" , Paper_column::get_rank (left_col)); if (!separation_item) { @@ -194,10 +168,17 @@ Staff_spacing::get_spacing_params (Grob *me, Real * space, Real * fixed) } Interval last_ext; - Grob *last_grob = extremal_break_aligned_grob (separation_item, RIGHT, + Grob *last_grob = Separation_item::extremal_break_aligned_grob (separation_item, RIGHT, &last_ext); if (!last_grob) { + /* + TODO: + + Should insert a adjustable space here? For excercises, you might want to + use a staff without a clef in the beginning. + */ + /* we used to have a warning here, but itgenerates a lot of spurious error messages. @@ -208,40 +189,60 @@ Staff_spacing::get_spacing_params (Grob *me, Real * space, Real * fixed) *fixed = last_ext[RIGHT]; *space = *fixed + 1.0; - SCM alist = last_grob->get_grob_property ("space-alist"); + SCM alist = last_grob->get_property ("space-alist"); if (!scm_list_p (alist)) return ; - SCM space_def = scm_sloppy_assq (ly_symbol2scm ("first-note"), alist); if (me_item->break_status_dir () == CENTER) { SCM nndef = scm_sloppy_assq (ly_symbol2scm ("next-note"), alist); - if (gh_pair_p (nndef )) + if (scm_is_pair (nndef)) space_def = nndef; } - - if (!gh_pair_p (space_def)) + + + if (!scm_is_pair (space_def)) { programming_error ("Unknown prefatory spacing. "); return; } - space_def = gh_cdr (space_def); - Real distance = gh_scm2double (gh_cdr (space_def)); - SCM type = gh_car (space_def) ; + space_def = scm_cdr (space_def); + Real distance = scm_to_double (scm_cdr (space_def)); + SCM type = scm_car (space_def) ; *fixed = last_ext[RIGHT]; - if (type == ly_symbol2scm ("extra-space")) - *space = *fixed + distance; - else if (type == ly_symbol2scm("minimum-space")) - *space = last_ext[LEFT] + (last_ext.length () >? distance); - - + if (type == ly_symbol2scm ("fixed-space")) + { + *fixed += distance; + *space = *fixed; + } + else if (type == ly_symbol2scm ("extra-space")) + { + *space = *fixed + distance; + } + else if (type == ly_symbol2scm ("semi-fixed-space")) + { + *fixed += distance / 2; + *space = *fixed + distance/2; + } + else if (type == ly_symbol2scm ("minimum-space")) + { + *space = last_ext[LEFT] + (last_ext.length () >? distance); + } + else if (type == ly_symbol2scm ("minimum-fixed-space")) + { + *space = last_ext[LEFT] + (last_ext.length () >? distance); + *fixed = *space; + } + *space += next_notes_correction (me, last_grob); } -ADD_INTERFACE (Staff_spacing,"staff-spacing-interface", - "", +ADD_INTERFACE (Staff_spacing, "staff-spacing-interface", + "This object calculates spacing details from a " + " breakable symbol (left) to another object. For example, it takes care " + " of optical spacing from a bar lines to a note.", "stem-spacing-correction left-items right-items");