From 62f3c5d4ddb492bc771f2d25b971cd3c9f38676d Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Fri, 29 Jun 2007 15:56:37 +0300 Subject: [PATCH] use PaperColumns instead of SeparationItems --- lily/dynamic-engraver.cc | 13 +--- lily/multi-measure-rest-engraver.cc | 9 ++- lily/note-spacing-engraver.cc | 2 +- lily/separating-line-group-engraver.cc | 100 +++++-------------------- lily/separation-item.cc | 10 ++- lily/slur-engraver.cc | 2 +- lily/spacing-spanner.cc | 2 +- lily/staff-spacing.cc | 21 +----- lily/tie-engraver.cc | 7 +- lily/tie-formatting-problem.cc | 13 +--- scm/define-grobs.scm | 1 + 11 files changed, 43 insertions(+), 137 deletions(-) diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 18ebeda943..5de7516024 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -344,16 +344,9 @@ Dynamic_engraver::typeset_all () || use_bar) { - Grob *column_bound = 0; - if (use_bar) - { - column_bound = unsmob_grob (get_property ("breakableSeparationItem")); - } - - if (!column_bound) - column_bound = unsmob_grob (use_bar - ? get_property ("currentCommandColumn") - : get_property ("currentMusicalColumn")); + Grob *column_bound = unsmob_grob (use_bar + ? get_property ("currentCommandColumn") + : get_property ("currentMusicalColumn")); finished_cresc_->set_bound (RIGHT, script_ ? script_ diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index c8ea549701..cf5f25a613 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -148,12 +148,13 @@ void Multi_measure_rest_engraver::stop_translation_timestep () { /* We cannot do this earlier, as breakableSeparationItem is not yet - there. */ + there. + + Actually, we no longer use breakableSeparationItem -- should this be moved? + -- jneem */ if (bar_seen_) { - Grob *cmc = unsmob_grob (get_property ("breakableSeparationItem")); - if (!cmc) - cmc = unsmob_grob (get_property ("currentCommandColumn")); + Grob *cmc = unsmob_grob (get_property ("currentCommandColumn")); /* Ugh, this is a kludge - need this for multi-measure-rest-grace.ly */ last_command_item_ = dynamic_cast (cmc); diff --git a/lily/note-spacing-engraver.cc b/lily/note-spacing-engraver.cc index 569735f859..4116226517 100644 --- a/lily/note-spacing-engraver.cc +++ b/lily/note-spacing-engraver.cc @@ -106,7 +106,7 @@ Note_spacing_engraver::stop_translation_timestep () && last_spacing_parent_context_ && last_spacing_parent_context_ == context ()->get_parent_context ()) { - Grob *sep = unsmob_grob (get_property ("breakableSeparationItem")); + Grob *sep = unsmob_grob (get_property ("currentCommandColumn")); if (sep) Pointer_group_interface::add_grob (last_spacing_, ly_symbol2scm ("right-items"), diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 28510166dc..7fe9ae9115 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -45,38 +45,23 @@ struct Spacings class Separating_line_group_engraver : public Engraver { protected: - Item *break_item_; - Item *musical_item_; - Item *last_musical_item_; - Spacings current_spacings_; Spacings last_spacings_; DECLARE_ACKNOWLEDGER (item); void stop_translation_timestep (); - void start_translation_timestep (); public: TRANSLATOR_DECLARATIONS (Separating_line_group_engraver); }; Separating_line_group_engraver::Separating_line_group_engraver () { - break_item_ = 0; - musical_item_ = 0; } void Separating_line_group_engraver::acknowledge_item (Grob_info i) { Item *it = i.item (); - if (it->get_parent (X_AXIS) - && it->get_parent (X_AXIS) == it->get_parent (Y_AXIS) - && Axis_group_interface::has_axis (it->get_parent (X_AXIS), X_AXIS) - && Axis_group_interface::has_axis (it->get_parent (Y_AXIS), Y_AXIS)) - return; - - if (to_boolean (it->get_property ("no-spacing-rods"))) - return; if (Note_spacing::has_interface (it)) { @@ -84,91 +69,44 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i) return; } - bool ib = Item::is_non_musical (it); - Item *&p_ref_ (ib ? break_item_ - : musical_item_); - - if (!p_ref_) + if (Item::is_non_musical (it) + && !current_spacings_.staff_spacing_ + && to_boolean (get_property ("createSpacing"))) { - p_ref_ = make_item ("SeparationItem", SCM_EOL); - - if (ib) - { - p_ref_->set_property ("non-musical", SCM_BOOL_T); - context ()->set_property ("breakableSeparationItem", p_ref_->self_scm ()); - } - - if (to_boolean (get_property ("createSpacing")) - && p_ref_ == break_item_) + current_spacings_.staff_spacing_ = make_item ("StaffSpacing", SCM_EOL); + + if (!last_spacings_.note_spacings_.size () + && last_spacings_.staff_spacing_) { - Item *it = make_item ("StaffSpacing", SCM_EOL); - current_spacings_.staff_spacing_ = it; - Pointer_group_interface::add_grob (it, ly_symbol2scm ("left-items"), - break_item_); - - if (!last_spacings_.note_spacings_.size () - && last_spacings_.staff_spacing_) + SCM ri = last_spacings_.staff_spacing_->get_object ("right-items"); + Grob_array *ga = unsmob_grob_array (ri); + if (!ga) { - SCM ri = last_spacings_.staff_spacing_->get_object ("right-items"); - Grob_array *ga = unsmob_grob_array (ri); - if (!ga) - { - SCM ga_scm = Grob_array::make_array (); - last_spacings_.staff_spacing_->set_object ("right-items", ga_scm); - ga = unsmob_grob_array (ga_scm); - } - - ga->clear (); - ga->add (break_item_); + SCM ga_scm = Grob_array::make_array (); + last_spacings_.staff_spacing_->set_object ("right-items", ga_scm); + ga = unsmob_grob_array (ga_scm); } + + ga->clear (); + ga->add (unsmob_grob (get_property ("currentCommandColumn"))); } } - - if (Accidental_placement::has_interface (it)) - Separation_item::add_conditional_item (p_ref_, it); - else - Separation_item::add_item (p_ref_, it); -} - -void -Separating_line_group_engraver::start_translation_timestep () -{ - if (break_item_) - { - context ()->unset_property (ly_symbol2scm ("breakableSeparationItem")); - break_item_ = 0; - } } void Separating_line_group_engraver::stop_translation_timestep () { - if (Item *sp = current_spacings_.staff_spacing_) - { - /* - TODO: should really look at the left-items of following - note-spacing grobs. - */ - if (musical_item_) - Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"), - musical_item_); - } - if (!current_spacings_.is_empty ()) last_spacings_ = current_spacings_; current_spacings_.clear (); - - musical_item_ = 0; } ADD_ACKNOWLEDGER (Separating_line_group_engraver, item); ADD_TRANSLATOR (Separating_line_group_engraver, /* doc */ "Generates objects for computing spacing parameters.", - /* create */ - "SeparationItem " - "SeparatingGroupSpanner " - "StaffSpacing", + /* create */ "StaffSpacing", /* read */ "createSpacing", - /* write */ "breakableSeparationItem"); + /* write */ "" + ); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index 8704a55b45..a692fc0b9b 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -8,6 +8,7 @@ #include "separation-item.hh" +#include "axis-group-interface.hh" #include "lookup.hh" #include "stencil.hh" #include "skyline.hh" @@ -106,20 +107,21 @@ Separation_item::boxes (Grob *me, Grob *left) { Item *il = dynamic_cast (elts[i]); if (pc != il->get_column ()) - { - continue; - } + continue; + if (Axis_group_interface::has_interface (il)) + continue; Interval y (il->pure_height (ycommon, 0, very_large)); Interval x (il->extent (pc, X_AXIS)); Interval extra = robust_scm2interval (elts[i]->get_property ("extra-spacing-width"), - Interval (0, 0)); + Interval (-0.1, 0.1)); x[LEFT] += extra[LEFT]; x[RIGHT] += extra[RIGHT]; if (to_boolean (elts[i]->get_property ("infinite-spacing-height"))) y = Interval (-infinity_f, infinity_f); + if (!x.is_empty () && !y.is_empty ()) out.push_back (Box (x, y)); } diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 9900ba713b..57068e6225 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -194,7 +194,7 @@ Slur_engraver::process_music () void Slur_engraver::stop_translation_timestep () { - if (Grob *g = unsmob_grob (get_property ("breakableSeparationItem"))) + if (Grob *g = unsmob_grob (get_property ("currentCommandColumn"))) { for (vsize i = 0; i < end_slurs_.size (); i++) Slur::add_extra_encompass (end_slurs_[i], g); diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index 5f9aad08f9..d878c58b7f 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -223,7 +223,7 @@ set_column_rods (vector const &cols, vsize idx, Real padding) if (Separation_item::is_empty (r)) return; - for (; idx != VPOS; idx--) + while (idx--) { Item *l = dynamic_cast (cols[idx]); Item *lb = l->find_prebroken_piece (RIGHT); diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index 2b13681376..8a8822a803 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -115,26 +115,11 @@ Staff_spacing::next_notes_correction (Grob *me, Spring Staff_spacing::get_spacing (Grob *me, Grob *right_col) { - Grob *separation_item = 0; Item *me_item = dynamic_cast (me); - - extract_grob_set (me, "left-items", items); - for (vsize i = items.size (); i--;) - { - Grob *cand = items[i]; - if (cand && Separation_item::has_interface (cand)) - separation_item = cand; - } - - // printf ("doing col %d\n" , Paper_column::get_rank (left_col)); - if (!separation_item) - { - programming_error ("no sep item"); - return Spring (); - } + Grob *left_col = me_item->get_column (); Interval last_ext; - Grob *last_grob = Separation_item::extremal_break_aligned_grob (separation_item, RIGHT, + Grob *last_grob = Separation_item::extremal_break_aligned_grob (left_col, RIGHT, &last_ext); if (!last_grob) { @@ -197,7 +182,7 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col) ideal = fixed; } - Grob *left_col = dynamic_cast (me)->get_column (); + Real optical_correction = next_notes_correction (me, last_grob); Real min_dist = Paper_column::minimum_distance (left_col, right_col); diff --git a/lily/tie-engraver.cc b/lily/tie-engraver.cc index bdcd3dbb36..cf525dc7b9 100644 --- a/lily/tie-engraver.cc +++ b/lily/tie-engraver.cc @@ -179,14 +179,9 @@ Tie_engraver::stop_translation_timestep () if (!wait) heads_to_tie_.clear (); - Grob *sep = unsmob_grob (get_property ("breakableSeparationItem")); for (vsize i = 0; i < ties_.size (); i++) - { - if (sep) - ties_[i]->set_object ("separation-item", sep->self_scm ()); - typeset_tie (ties_[i]); - } + ties_.clear (); tie_column_ = 0; } diff --git a/lily/tie-formatting-problem.cc b/lily/tie-formatting-problem.cc index 3105d784f1..3a8ed37a62 100644 --- a/lily/tie-formatting-problem.cc +++ b/lily/tie-formatting-problem.cc @@ -316,18 +316,9 @@ Tie_formatting_problem::from_ties (vector const &ties) { Item *it = dynamic_cast (ties[i])->get_bound (d); if (it->break_status_dir ()) - { - Item *sep - = dynamic_cast (unsmob_grob (ties[i]->get_object ("separation-item"))); - if (sep && sep->get_column () == it->get_column ()) - it = sep; + it = it->get_column (); - bounds.push_back (it); - } - else - { - bounds.push_back (it); - } + bounds.push_back (it); } set_chord_outline (bounds, d); diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index a5b691391a..d9faba5d70 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1127,6 +1127,7 @@ (meta . ((class . Paper_column) (interfaces . (paper-column-interface axis-group-interface + separation-item-interface spaceable-grob-interface)))))) (NoteCollision -- 2.39.2