From fd4e16ed62c2a7769fcb5ed2c84697808fbad50a Mon Sep 17 00:00:00 2001 From: Joe Neeman Date: Thu, 5 Jul 2007 13:24:39 +1000 Subject: [PATCH] move extremal_break_aligned_grob to Spacing_interface --- lily/include/spacing-interface.hh | 1 + lily/note-spacing.cc | 23 ++++--------- lily/separating-line-group-engraver.cc | 24 ++++++++++++++ lily/separation-item.cc | 39 ---------------------- lily/spacing-interface.cc | 46 ++++++++++++++++++++++++++ lily/staff-spacing.cc | 6 ++-- 6 files changed, 82 insertions(+), 57 deletions(-) diff --git a/lily/include/spacing-interface.hh b/lily/include/spacing-interface.hh index 14b8c2bf03..135b31ae6e 100644 --- a/lily/include/spacing-interface.hh +++ b/lily/include/spacing-interface.hh @@ -19,6 +19,7 @@ struct Spacing_interface static Item* right_column (Grob *me); static Item* left_column (Grob *me); static Drul_array skylines (Grob *me, Grob *right_col); + static Grob* extremal_break_aligned_grob (Grob *me, Direction, Direction, Interval*); DECLARE_GROB_INTERFACE(); }; diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc index 61af354f4c..c434e633c3 100644 --- a/lily/note-spacing.cc +++ b/lily/note-spacing.cc @@ -116,6 +116,12 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Direction d = LEFT; bool acc_right = false; + Grob *bar = Spacing_interface::extremal_break_aligned_grob (me, RIGHT, + rcolumn->break_status_dir (), + &bar_xextent); + if (bar) + bar_yextent = Staff_spacing::bar_y_positions (bar); + do { vector const &items (ly_scm2link_array (props [d])); @@ -129,22 +135,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn, Grob *stem = Note_column::get_stem (it); if (!stem || !stem->is_live ()) - { - if (d == RIGHT && Separation_item::has_interface (it)) - { - if (it->get_column () != rcolumn) - it = it->find_prebroken_piece (rcolumn->break_status_dir ()); - - Grob *last = Separation_item::extremal_break_aligned_grob (it, LEFT, &bar_xextent); - - if (last) - bar_yextent = Staff_spacing::bar_y_positions (last); - - break; - } - - return; - } + return; if (Stem::is_invisible (stem)) { diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 31bd53a2d5..aafb49399e 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -49,8 +49,11 @@ protected: Spacings last_spacings_; DECLARE_ACKNOWLEDGER (item); + DECLARE_ACKNOWLEDGER (break_aligned); void stop_translation_timestep (); void start_translation_timestep (); + + vector break_aligned_; public: TRANSLATOR_DECLARATIONS (Separating_line_group_engraver); }; @@ -101,6 +104,12 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i) } } +void +Separating_line_group_engraver::acknowledge_break_aligned (Grob_info gi) +{ + break_aligned_.push_back (gi.grob ()); +} + void Separating_line_group_engraver::start_translation_timestep () { @@ -110,6 +119,18 @@ Separating_line_group_engraver::start_translation_timestep () void Separating_line_group_engraver::stop_translation_timestep () { + for (vsize i = 0; i < break_aligned_.size (); i++) + { + SCM smob = break_aligned_[i]->self_scm (); + + if (Item *sp = current_spacings_.staff_spacing_) + Pointer_group_interface::add_grob (sp, ly_symbol2scm ("left-break-aligned"), smob); + + for (vsize j = 0; j < last_spacings_.note_spacings_.size (); j++) + Pointer_group_interface::add_grob (last_spacings_.note_spacings_[j], + ly_symbol2scm ("right-break-aligned"), smob); + } + if (!current_spacings_.is_empty ()) last_spacings_ = current_spacings_; @@ -118,9 +139,12 @@ Separating_line_group_engraver::stop_translation_timestep () Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"), col); current_spacings_.clear (); + break_aligned_.clear (); } ADD_ACKNOWLEDGER (Separating_line_group_engraver, item); +ADD_ACKNOWLEDGER (Separating_line_group_engraver, break_aligned); + ADD_TRANSLATOR (Separating_line_group_engraver, /* doc */ "Generates objects for computing spacing parameters.", diff --git a/lily/separation-item.cc b/lily/separation-item.cc index a692fc0b9b..00103c31d4 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -128,45 +128,6 @@ Separation_item::boxes (Grob *me, Grob *left) return out; } -/* - 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 * -Separation_item::extremal_break_aligned_grob (Grob *me, - Direction d, - Interval *last_ext) -{ - Grob *col = dynamic_cast (me)->get_column (); - last_ext->set_empty (); - Grob *last_grob = 0; - - extract_grob_set (me, "elements", elts); - for (vsize i = elts.size (); i--;) - { - Grob *break_item = elts[i]; - if (!scm_is_symbol (break_item->get_property ("break-align-symbol"))) - continue; - - if (!scm_is_pair (break_item->get_property ("space-alist"))) - continue; - - Interval ext = break_item->extent (col, X_AXIS); - - if (ext.is_empty ()) - continue; - - if (!last_grob - || (last_grob && d * (ext[d]- (*last_ext)[d]) > 0)) - { - *last_ext = ext; - last_grob = break_item; - } - } - - return last_grob; -} - extern bool debug_skylines; MAKE_SCHEME_CALLBACK (Separation_item, print, 1) SCM diff --git a/lily/spacing-interface.cc b/lily/spacing-interface.cc index dbfe4e43c6..93bd1c2cfa 100644 --- a/lily/spacing-interface.cc +++ b/lily/spacing-interface.cc @@ -168,6 +168,52 @@ Spacing_interface::left_note_columns (Grob *me) return get_note_columns (elts); } +/* + Try to find the break-aligned symbol that belongs on the D-side + of ME, sticking out in direction -D. The x size is put in LAST_EXT +*/ +Grob * +Spacing_interface::extremal_break_aligned_grob (Grob *me, + Direction d, + Direction break_dir, + Interval *last_ext) +{ + Grob *col = 0; + last_ext->set_empty (); + Grob *last_grob = 0; + + extract_grob_set (me, d == LEFT ? "left-break-aligned" : "right-break-aligned", elts); + + for (vsize i = elts.size (); i--;) + { + Item *break_item = dynamic_cast (elts[i]); + + if (break_item->break_status_dir () != break_dir) + break_item = break_item->find_prebroken_piece (break_dir); + + if (!break_item || !scm_is_pair (break_item->get_property ("space-alist"))) + continue; + + if (!col) + col = dynamic_cast (elts[0])->get_column ()->find_prebroken_piece (break_dir); + + Interval ext = break_item->extent (col, X_AXIS); + + if (ext.is_empty ()) + continue; + + if (!last_grob + || (last_grob && d * (ext[-d]- (*last_ext)[-d]) < 0)) + { + *last_ext = ext; + last_grob = break_item; + } + } + + return last_grob; +} + + ADD_INTERFACE (Spacing_interface, "This object calculates the desired and minimum distances between two columns.", diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index 8a8822a803..72b997514c 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -119,8 +119,10 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col) Grob *left_col = me_item->get_column (); Interval last_ext; - Grob *last_grob = Separation_item::extremal_break_aligned_grob (left_col, RIGHT, - &last_ext); + Direction break_dir = me_item->break_status_dir (); + Grob *last_grob = Spacing_interface::extremal_break_aligned_grob (me, LEFT, + break_dir, + &last_ext); if (!last_grob) { /* -- 2.39.5