From: Joe Neeman Date: Thu, 28 Jun 2007 10:02:15 +0000 (+0300) Subject: Another attempt at removing separating-group-spanner. X-Git-Tag: release/2.11.28-1~21^2~21 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=f6bd48526091ebf836ce8cbf89b83593b1549736;p=lilypond.git Another attempt at removing separating-group-spanner. --- diff --git a/lily/axis-group-interface.cc b/lily/axis-group-interface.cc index da08f53526..b9641d41c3 100644 --- a/lily/axis-group-interface.cc +++ b/lily/axis-group-interface.cc @@ -478,7 +478,7 @@ add_boxes (Grob *me, Grob *x_common, Grob *y_common, vector *const boxes, S positions, one for above the staff, one for below). In each pass, we loop through the unplaced grobs from left to right. - If the grob overlaps the right-most affected position, we place it + If the grob doesn't overlap the right-most affected position, we place it (and then update the right-most affected position to point to the right edge of the just-placed grob). Otherwise, we skip it until the next pass. */ diff --git a/lily/include/separating-group-spanner.hh b/lily/include/separating-group-spanner.hh deleted file mode 100644 index d48705c859..0000000000 --- a/lily/include/separating-group-spanner.hh +++ /dev/null @@ -1,29 +0,0 @@ -/* - separating-group-spanner.hh -- declare Separating_group_spanner - - source file of the GNU LilyPond music typesetter - - (c) 1998--2007 Han-Wen Nienhuys -*/ - -#ifndef SEPARATING_GROUP_SPANNER_HH -#define SEPARATING_GROUP_SPANNER_HH - -#include "grob-interface.hh" -#include "lily-proto.hh" - -class Separating_group_spanner -{ - static void find_rods (Item *, - vector const &separators, - vsize idx, - Real); -public: - static void add_spacing_unit (Grob *me, Item *); - - DECLARE_GROB_INTERFACE(); - DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM)); -}; - -#endif /* SEPARATING_GROUP_SPANNER_HH */ - diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index 1b2471118d..bf9681957e 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -22,11 +22,9 @@ struct Separation_item static vector boxes (Grob *me, Grob *left); static Skyline conditional_skyline (Grob *, Grob *); - static Interval width (Grob *); - static Interval relative_width (Grob *, Grob *); static Grob *extremal_break_aligned_grob (Grob *, Direction, Interval *); - static bool set_distance (Drul_array, Real); - static void set_skyline_distance (Drul_array, Real); + static void set_distance (Drul_array, Real); + static bool is_empty (Grob *me); static void add_item (Grob *, Item *); static void add_conditional_item (Grob *, Grob *); }; diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 1b66670a7c..279f2d011f 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -79,9 +79,7 @@ Multi_measure_rest::print (SCM smob) { Item *b = sp->get_bound (d); - Interval coldim = (Separation_item::has_interface (b)) - ? Separation_item::relative_width (b, common) - : b->extent (common, X_AXIS); + Interval coldim = b->extent (common, X_AXIS); sp_iv[d] = coldim.is_empty () ? b->relative_coordinate (common, X_AXIS) : coldim[-d]; } diff --git a/lily/paper-column-engraver.cc b/lily/paper-column-engraver.cc index 6ed851243d..1396c1280d 100644 --- a/lily/paper-column-engraver.cc +++ b/lily/paper-column-engraver.cc @@ -9,11 +9,13 @@ #include "paper-column-engraver.hh" #include "system.hh" #include "international.hh" +#include "accidental-placement.hh" #include "axis-group-interface.hh" #include "context.hh" #include "note-spacing.hh" #include "paper-column.hh" #include "pointer-group-interface.hh" +#include "separation-item.hh" #include "staff-spacing.hh" #include "system.hh" #include "warn.hh" @@ -192,12 +194,17 @@ Paper_column_engraver::stop_translation_timestep () for (vsize i = 0; i < items_.size (); i++) { Item *elem = items_[i]; + Grob *col = Item::is_non_musical (elem) ? command_column_ : musical_column_; + if (!elem->get_parent (X_AXIS) || !unsmob_grob (elem->get_object ("axis-group-parent-X"))) { - bool br = Item::is_non_musical (elem); - Axis_group_interface::add_element (br ? command_column_ : musical_column_, elem); + Axis_group_interface::add_element (col, elem); } + else if (Accidental_placement::has_interface (elem)) + Separation_item::add_conditional_item (col, elem); + else + Separation_item::add_item (col, elem); } items_.clear (); diff --git a/lily/paper-column.cc b/lily/paper-column.cc index 2256d03600..bb827db18b 100644 --- a/lily/paper-column.cc +++ b/lily/paper-column.cc @@ -146,16 +146,9 @@ Paper_column::minimum_distance (Grob *left, Grob *right) Direction d = LEFT; do { - skys[d].set_minimum_height (0.0); - extract_grob_set (cols[d], "elements", elts); - - for (vsize i = 0; i < elts.size (); i++) - if (Separation_item::has_interface (elts[i])) - { - Skyline_pair *sp = Skyline_pair::unsmob (elts[i]->get_property ("horizontal-skylines")); - if (sp) - skys[d].merge ((*sp)[-d]); - } + Skyline_pair *sp = Skyline_pair::unsmob (cols[d]->get_property ("horizontal-skylines")); + if (sp) + skys[d] = (*sp)[-d]; } while (flip (&d) != LEFT); diff --git a/lily/separating-group-spanner.cc b/lily/separating-group-spanner.cc deleted file mode 100644 index 7de9341e39..0000000000 --- a/lily/separating-group-spanner.cc +++ /dev/null @@ -1,101 +0,0 @@ -/* - separating-group-spanner.cc -- implement Separating_group_spanner - - source file of the GNU LilyPond music typesetter - - (c) 1998--2007 Han-Wen Nienhuys -*/ - -#include "separating-group-spanner.hh" - -#include "separation-item.hh" -#include "paper-column.hh" -#include "output-def.hh" -#include "dimensions.hh" -#include "pointer-group-interface.hh" -#include "moment.hh" - -void -Separating_group_spanner::find_rods (Item *r, - vector const &separators, - vsize idx, - Real padding) -{ - - /* - This is an inner loop: look for the first normal (unbroken) Left - grob. This looks like an inner loop (ie. quadratic total), but in - most cases, the interesting L will just be the first entry of - NEXT, making it linear in most of the cases. - */ - for (; idx != VPOS; idx--) - { - Item *l = dynamic_cast (separators[idx]); - Item *lb = l->find_prebroken_piece (RIGHT); - - if (lb) - { - Separation_item::set_distance (Drul_array (lb, r), padding); - } - - if (Separation_item::set_distance (Drul_array (l, r), padding) - /* - This check is because grace notes are set very tight, and - the accidentals of main note may stick out so far to cover - a barline preceding the grace note. - */ - && spanned_time_interval (l, r).length ().main_part_ > Rational (0)) - break; - - /* - this grob doesn't cause a constraint. We look further until we - find one that does. - */ - } -} - -MAKE_SCHEME_CALLBACK (Separating_group_spanner, set_spacing_rods, 1); -SCM -Separating_group_spanner::set_spacing_rods (SCM smob) -{ - Grob *me = unsmob_grob (smob); - - /* - Ugh: padding is added doubly, also for SeparationItem - */ - Real padding = robust_scm2double (me->get_property ("padding"), 0.1); - - extract_grob_set (me, "elements", elts); - for (vsize i = elts.size (); i-- > 1;) - { - Item *r = dynamic_cast (elts[i]); - if (!r) - continue; - - if (Separation_item::width (r).is_empty ()) - continue; - - Item *rb - = dynamic_cast (r->find_prebroken_piece (LEFT)); - - find_rods (r, elts, i - 1, padding); - if (rb) - find_rods (rb, elts, i - 1, padding); - } - - return SCM_UNSPECIFIED; -} - -void -Separating_group_spanner::add_spacing_unit (Grob *me, Item *i) -{ - Pointer_group_interface::add_unordered_grob (me, ly_symbol2scm ("elements"), i); -} - -ADD_INTERFACE (Separating_group_spanner, - "A spanner that calculates spacing constraints (\"rods\") " - "using the @code{separation-item-interface} grobs in @code{elements}.", - - /* properties */ - "elements " - "padding "); diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index f493840d95..28510166dc 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -8,7 +8,6 @@ #include "engraver.hh" -#include "separating-group-spanner.hh" #include "separation-item.hh" #include "paper-column.hh" #include "output-def.hh" @@ -53,11 +52,7 @@ protected: Spacings current_spacings_; Spacings last_spacings_; - Spanner *sep_span_; - DECLARE_ACKNOWLEDGER (item); - void process_music (); - virtual void finalize (); void stop_translation_timestep (); void start_translation_timestep (); public: @@ -66,38 +61,10 @@ public: Separating_line_group_engraver::Separating_line_group_engraver () { - sep_span_ = 0; break_item_ = 0; musical_item_ = 0; } -void -Separating_line_group_engraver::process_music () -{ - if (!sep_span_) - { - sep_span_ = make_spanner ("SeparatingGroupSpanner", SCM_EOL); - - sep_span_->set_bound (LEFT, unsmob_grob (get_property ("currentCommandColumn"))); - } -} -void -Separating_line_group_engraver::finalize () -{ - if (!sep_span_) - return; - - SCM ccol = get_property ("currentCommandColumn"); - Grob *column = unsmob_grob (ccol); - - sep_span_->set_bound (RIGHT, unsmob_grob (ccol)); - sep_span_ = 0; - - if (last_spacings_.staff_spacing_ - && last_spacings_.staff_spacing_->get_column () == column) - last_spacings_.staff_spacing_->suicide (); -} - void Separating_line_group_engraver::acknowledge_item (Grob_info i) { @@ -176,9 +143,6 @@ Separating_line_group_engraver::start_translation_timestep () void Separating_line_group_engraver::stop_translation_timestep () { - if (break_item_) - Separating_group_spanner::add_spacing_unit (sep_span_, break_item_); - if (Item *sp = current_spacings_.staff_spacing_) { /* @@ -195,9 +159,6 @@ Separating_line_group_engraver::stop_translation_timestep () current_spacings_.clear (); - if (musical_item_) - Separating_group_spanner::add_spacing_unit (sep_span_, musical_item_); - musical_item_ = 0; } diff --git a/lily/separation-item.cc b/lily/separation-item.cc index 642f9583c0..8704a55b45 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -30,7 +30,7 @@ Separation_item::add_conditional_item (Grob *me, Grob *e) } void -Separation_item::set_skyline_distance (Drul_array items, +Separation_item::set_distance (Drul_array items, Real padding) { Drul_array lines (Skyline_pair::unsmob (items[LEFT]->get_property ("horizontal-skylines")), @@ -51,11 +51,10 @@ Separation_item::set_skyline_distance (Drul_array items, } bool -Separation_item::set_distance (Drul_array items, - Real padding) +Separation_item::is_empty (Grob *me) { - set_skyline_distance (items, padding); - return true; + Skyline_pair *sky = Skyline_pair::unsmob (me->get_property ("horizontal-skylines")); + return (!sky || sky->is_empty ()); } /* @@ -127,21 +126,6 @@ Separation_item::boxes (Grob *me, Grob *left) return out; } -Interval -Separation_item::width (Grob *me) -{ - SCM sw = me->get_property ("X-extent"); - return ly_scm2interval (sw); -} - -Interval -Separation_item::relative_width (Grob *me, Grob *common) -{ - Interval iv = width (me); - - return dynamic_cast (me)->get_column ()->relative_coordinate (common, X_AXIS) + iv; -} - /* 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 diff --git a/lily/skyline.cc b/lily/skyline.cc index c935660c6e..de6f7d078b 100644 --- a/lily/skyline.cc +++ b/lily/skyline.cc @@ -530,7 +530,8 @@ Skyline::to_points (Axis horizon_axis) const bool Skyline::is_empty () const { - return buildings_.empty (); + Building b = buildings_.front (); + return b.end_ == infinity_f && b.y_intercept_ == -infinity_f; } Skyline_pair::Skyline_pair () diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index 91b1b2e7f0..5f9aad08f9 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -20,6 +20,7 @@ #include "paper-column.hh" #include "paper-score.hh" #include "pointer-group-interface.hh" +#include "separation-item.hh" #include "spaceable-grob.hh" #include "spacing-interface.hh" #include "staff-spacing.hh" @@ -207,6 +208,49 @@ Spacing_spanner::generate_pair_spacing (Grob *me, } } +static void +set_column_rods (vector const &cols, vsize idx, Real padding) +{ + + /* + This is an inner loop: look for the first normal (unbroken) Left + grob. This looks like an inner loop (ie. quadratic total), but in + most cases, the interesting L will just be the first entry of + NEXT, making it linear in most of the cases. + */ + Item *r = dynamic_cast (cols[idx]); + + if (Separation_item::is_empty (r)) + return; + + for (; idx != VPOS; idx--) + { + Item *l = dynamic_cast (cols[idx]); + Item *lb = l->find_prebroken_piece (RIGHT); + + if (Separation_item::is_empty (l) && (!lb || Separation_item::is_empty (lb))) + continue; + + Separation_item::set_distance (Drul_array (l, r), padding); + if (lb) + Separation_item::set_distance (Drul_array (lb, r), padding); + + + /* + This check is because grace notes are set very tight, and + the accidentals of main note may stick out so far to cover + a barline preceding the grace note. + */ + if (spanned_time_interval (l, r).length ().main_part_ > Rational (0)) + break; + + /* + this grob doesn't cause a constraint. We look further until we + find one that does. + */ + } +} + void Spacing_spanner::generate_springs (Grob *me, vector const &cols, @@ -219,7 +263,10 @@ Spacing_spanner::generate_springs (Grob *me, Paper_column *next = (i + 1 < cols.size ()) ? dynamic_cast (cols[i+1]) : 0; if (i > 0) - generate_pair_spacing (me, prev, col, next, options); + { + generate_pair_spacing (me, prev, col, next, options); + set_column_rods (cols, i, 0.1); // FIXME + } prev = col; } diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc index 83e7f6167d..2b13681376 100644 --- a/lily/staff-spacing.cc +++ b/lily/staff-spacing.cc @@ -197,8 +197,9 @@ 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 = Spacing_interface::minimum_distance (me, right_col); + Real min_dist = Paper_column::minimum_distance (left_col, right_col); /* ensure that the "fixed" distance will leave a gap of at least 0.3 ss. */ Real min_dist_correction = max (0.0, 0.3 + min_dist - fixed); diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 7f9a068c2b..a5b691391a 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1114,6 +1114,7 @@ (axes . (0)) (before-line-breaking . ,ly:paper-column::before-line-breaking) (X-extent . ,ly:axis-group-interface::width) + (horizontal-skylines . ,ly:separation-item::calc-skylines) ;; (stencil . ,ly:paper-column::print) (non-musical . #t) @@ -1229,6 +1230,7 @@ (axes . (0)) (allow-loose-spacing . #t) (before-line-breaking . ,ly:paper-column::before-line-breaking) + (horizontal-skylines . ,ly:separation-item::calc-skylines) ;; (stencil . ,ly:paper-column::print) (X-extent . ,ly:axis-group-interface::width) @@ -1448,14 +1450,6 @@ (interfaces . ( separation-item-interface)))))) - (SeparatingGroupSpanner - . ( - (springs-and-rods . ,ly:separating-group-spanner::set-spacing-rods) - (meta . ((class . Spanner) - (interfaces . (only-prebreak-interface - - separating-group-spanner-interface)))))) - (Slur . ((details . ,default-slur-details) (control-points . ,ly:slur::calc-control-points) diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm index 12657af88a..8309ec390f 100644 --- a/scm/safe-lily.scm +++ b/scm/safe-lily.scm @@ -177,7 +177,6 @@ ly:piano-pedal-bracket::print ly:rest::print ly:script-interface::print - ly:separating-group-spanner::set-spacing-rods ly:slur::height ly:slur::print ly:spacing-spanner::set-springs