From: Han-Wen Nienhuys Date: Fri, 4 Aug 2006 00:34:34 +0000 (+0000) Subject: * lily/paper-column.cc (set_system): new function. X-Git-Tag: cvs/HEAD~190 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=07b896e8b1a3e8a0caf8924bc0f70d9c5f6dedc4;p=lilypond.git * lily/paper-column.cc (set_system): new function. * lily/spacing-engraver.cc (stop_translation_timestep): store SpacingSpanner refs in Paper_column. * lily/spacing-loose-columns.cc (set_loose_columns): rewrite compute loose clique spacing using GraceSpacing/SpacingSpanner. --- diff --git a/ChangeLog b/ChangeLog index e4bc82eeee..1afba1af89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-08-04 Han-Wen Nienhuys + + * lily/paper-column.cc (set_system): new function. + + * lily/spacing-engraver.cc (stop_translation_timestep): store + SpacingSpanner refs in Paper_column. + + * lily/spacing-loose-columns.cc (set_loose_columns): rewrite + compute loose clique spacing using GraceSpacing/SpacingSpanner. + 2006-08-03 Han-Wen Nienhuys * lily/beam-engraver.cc (listen_beam): add method for diff --git a/lily/include/paper-column.hh b/lily/include/paper-column.hh index d21828c374..f9686a4968 100644 --- a/lily/include/paper-column.hh +++ b/lily/include/paper-column.hh @@ -29,6 +29,7 @@ public: virtual void do_break_processing (); virtual Paper_column *get_column () const; virtual System *get_system () const; + void set_system (System *); static int compare (Grob * const &a, Grob * const &b); diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 4da6ff3ef9..4558709c30 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -45,6 +45,12 @@ Paper_column::get_system () const return system_; } +void +Paper_column::set_system (System *s) +{ + system_ = s; +} + Paper_column * Paper_column::get_column () const { diff --git a/lily/spacing-basic.cc b/lily/spacing-basic.cc index 4a11d75b48..fcae3dfcc2 100644 --- a/lily/spacing-basic.cc +++ b/lily/spacing-basic.cc @@ -140,7 +140,6 @@ Spacing_spanner::note_spacing (Grob *me, Grob *lc, Grob *rc, Spacing_options grace_opts; grace_opts.init_from_grob (grace_spacing); - bool bla; dist = grace_opts.get_duration_space (delta_t.grace_part_, &bla); } diff --git a/lily/spacing-engraver.cc b/lily/spacing-engraver.cc index 9325451d28..e80f98f1ae 100644 --- a/lily/spacing-engraver.cc +++ b/lily/spacing-engraver.cc @@ -211,8 +211,14 @@ Spacing_engraver::stop_translation_timestep () musical_column->set_property ("shortest-playing-duration", sh); musical_column->set_property ("shortest-starter-duration", st); + + musical_column->set_object ("spacing", spacing_->self_scm ()); + unsmob_grob (get_property ("currentCommandColumn")) + ->set_object ("spacing", spacing_->self_scm ()); } + + void Spacing_engraver::start_translation_timestep () { diff --git a/lily/spacing-loose-columns.cc b/lily/spacing-loose-columns.cc index fdcc77f1b2..202cfac668 100644 --- a/lily/spacing-loose-columns.cc +++ b/lily/spacing-loose-columns.cc @@ -25,7 +25,6 @@ set_loose_columns (System *which, Column_x_positions const *posns) if (!loose_col_count) return; - Real default_padding = 1.0; for (int i = 0; i < loose_col_count; i++) { int divide_over = 1; @@ -69,73 +68,59 @@ set_loose_columns (System *which, Column_x_positions const *posns) if (!right->get_system ()) right = right->find_prebroken_piece (LEFT); - clique.push_back (right); - Grob *common = right->common_refpoint (left, X_AXIS); - Item *finished_right_column = clique.back (); - - for (vsize j = clique.size () - 2; j > 0; j--) - { - int count = 0; - Real total_space = 0.0; - Real total_fixed = 0.0; - extract_grob_set (col, "spacing-wishes", wishes); - for (vsize i = 0; i < wishes.size (); i++) - { - Grob *spacing = wishes[i]; - Real space = 0.0; - Real fixed = 0.0; - - if (Staff_spacing::has_interface (spacing)) - Staff_spacing::get_spacing_params (spacing, &space, &fixed); - else if (Note_spacing::has_interface (spacing)) - { - Spacing_options options; + clique.push_back (right); - fixed = robust_relative_extent (col, col, X_AXIS)[RIGHT]; + vector clique_spacing; + clique_spacing.push_back (0.0); + for (vsize j = 1; j < clique.size () - 1; j ++) + { + Grob *clique_col = clique[j]; - Moment dt = Paper_column::when_mom (right) - Paper_column::when_mom (col); - bool expand = false; + Paper_column *loose_col = dynamic_cast (clique[j]); + Paper_column *last_col = dynamic_cast (clique[j-1]); - space = options.get_duration_space (dt.main_part_, &expand); - Note_spacing::get_spacing (spacing, right, space, options.increment_, - &space, &fixed); - } - else - continue; + Grob *spacing = unsmob_grob (clique_col->get_object ("spacing")); + if (Grob *grace_spacing = unsmob_grob (clique_col->get_object ("grace-spacing"))) + { + spacing = grace_spacing; + } + + Spacing_options options; + options.init_from_grob (spacing); - count++; + bool expand_only = false; + Real base_note_space = Spacing_spanner::note_spacing (spacing, last_col, loose_col, + &options, &expand_only); - total_space += space; - total_fixed += fixed; - } + clique_spacing.push_back (base_note_space); + } - Real distance_to_next = 0.0; - Real right_point = 0.0; - if (count) - { - total_space /= count; - total_fixed /= count; + Real default_padding = 1.0; + clique_spacing.push_back (default_padding); - distance_to_next = total_space; - right_point - = finished_right_column->relative_coordinate (common, X_AXIS); - } - else - { - Interval my_extent = robust_relative_extent (col, col, X_AXIS); - distance_to_next = my_extent[RIGHT] + default_padding; - right_point = robust_relative_extent (finished_right_column, common, X_AXIS)[LEFT]; - } + Real right_point = robust_relative_extent (clique.back (), common, X_AXIS)[LEFT]; + + + Grob *finished_right_column = clique.back (); + + for (vsize j = clique.size () - 2; j > 0; j--) + { + Paper_column *clique_col = dynamic_cast (clique[j]); + + right_point = finished_right_column->relative_coordinate (common, X_AXIS); + Real distance_to_next = clique_spacing[j+1]; + Real my_offset = right_point - distance_to_next; - col->system_ = which; - col->translate_axis (my_offset - col->relative_coordinate (common, X_AXIS), X_AXIS); + clique_col->set_system (which); + clique_col->translate_axis (my_offset - clique_col->relative_coordinate (common, X_AXIS), X_AXIS); - finished_right_column = col; + finished_right_column = clique_col; } + } } diff --git a/lily/system.cc b/lily/system.cc index a8a0ff5160..2fba41a49e 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -218,6 +218,7 @@ System::break_into_pieces (vector const &breaking) c[j]->translate_axis (breaking[i].config_[j], X_AXIS); dynamic_cast (c[j])->system_ = system; } + set_loose_columns (system, &breaking[i]); broken_intos_.push_back (system); } diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index 9d59719a8a..37a4c35749 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -526,7 +526,8 @@ paper-columns or note-column objects.") in addition to notes and stems.") (elements ,ly:grob-array? "list of grobs, type depending on the Grob where this is set in.") - (grace-spacing ,ly:grob-array? "a run of grace notes.") + (grace-spacing ,ly:grob? "a run of grace notes.") + (spacing ,ly:grob? "the spacing spanner governing this section.") (heads ,ly:grob-array? "List of note heads.") (items-worth-living ,ly:grob-array? "A list of interesting items. If empty in a particular staff, then that staff is erased.")