From: hanwen Date: Tue, 6 Jan 2004 15:53:08 +0000 (+0000) Subject: * lily/separating-line-group-engraver.cc (acknowledge_grob): X-Git-Tag: release/2.1.7~4 X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=3da7cf2632925a849d53cc93a863952a1ed5f599;p=lilypond.git * lily/separating-line-group-engraver.cc (acknowledge_grob): set/unset breakableSeparationItem * lily/separation-item.cc (relative_width): add function. * scm/define-grob-interfaces.scm (only-prebreak-interface): add only-prebreak-interface * lily/system.cc (output_lines): only junk only-prebreak-interface grobs. * lily/multi-measure-rest-engraver.cc (stop_translation_timestep): read breakableSeparationItem * input/regression/multi-measure-rest-multi-staff-center.ly: new file. * lily/system.cc (output_lines): don't suicide Spacing_items. --- diff --git a/ChangeLog b/ChangeLog index 5cc5c36b2c..dc0c0120e6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,22 @@ 2004-01-06 Han-Wen Nienhuys + * lily/separating-line-group-engraver.cc (acknowledge_grob): + set/unset breakableSeparationItem + + * lily/separation-item.cc (relative_width): add function. + + * scm/define-grob-interfaces.scm (only-prebreak-interface): add + only-prebreak-interface + + * lily/system.cc (output_lines): only junk only-prebreak-interface grobs. + + * lily/multi-measure-rest-engraver.cc (stop_translation_timestep): + read breakableSeparationItem + + * input/regression/multi-measure-rest-multi-staff-center.ly: new file. + + * lily/system.cc (output_lines): don't suicide Spacing_items. + * lily/dot-column.cc (dot_config_badness): new function: select the best scoring dot configuration: dots should go close to the note heads, but be shifted up or down according to conventions. diff --git a/Documentation/topdocs/NEWS.texi b/Documentation/topdocs/NEWS.texi index a2bfabf60c..887a273939 100644 --- a/Documentation/topdocs/NEWS.texi +++ b/Documentation/topdocs/NEWS.texi @@ -8,13 +8,17 @@ @chapter New features in 2.1 since 2.0 @itemize +@item Multi measure rests are now truly centered between the +clefs/barlines of the staff, independent of symbols on the other staffs. + @item Collision resolution for dots in chords has been improved greatly. @item Spacing following barlines was improved for widely stretched lines. @item -Lyric hyphens now conform to standard typesetting practice. +Lyric hyphens and extenders now conform to standard typesetting +practice. @item Lyrics are now aligned under note heads conforming to engraving diff --git a/input/regression/multi-measure-rest-multi-staff-center.ly b/input/regression/multi-measure-rest-multi-staff-center.ly new file mode 100644 index 0000000000..77f3a2a7c4 --- /dev/null +++ b/input/regression/multi-measure-rest-multi-staff-center.ly @@ -0,0 +1,14 @@ +\header { texidoc = "The centering of multi-measure rests is +independent on prefatory matter in other staves." + + } +\version "2.1.6" + +\score { +\notes << \new Staff { R1 } + \new Staff { r1 \clef bass } + + >> + +\paper { raggedright = ##t } +} diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index 2beaedd56a..9a48e1cacb 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -18,6 +18,7 @@ struct Separation_item static bool has_interface (Grob*); static Interval conditional_width (Grob*,Grob*) ; static Interval width (Grob*) ; + static Interval relative_width (Grob*, Grob*) ; static Grob*extremal_break_aligned_grob (Grob*,Direction, Interval*); static void add_item (Grob*,Item*); static void add_conditional_item (Grob*,Grob*); diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index b25fd144d1..8099c3a517 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -40,6 +40,8 @@ private: Moment start_moment_; Rational last_main_moment_; + bool bar_seen_; + Spanner *mmrest_; Link_array numbers_; @@ -49,6 +51,7 @@ private: Multi_measure_rest_engraver::Multi_measure_rest_engraver () { + bar_seen_ = false; start_measure_ = 0; mmrest_ = 0; last_rest_ =0; @@ -82,6 +85,7 @@ Multi_measure_rest_engraver::try_music (Music* req) void Multi_measure_rest_engraver::process_music () { + if (new_req_ && stop_req_) stop_req_ = 0; @@ -158,10 +162,24 @@ Multi_measure_rest_engraver::process_music () = gh_scm2int (get_property ("currentBarNumber")); } - if (gh_string_p (get_property ("whichBar"))) + bar_seen_ = gh_string_p (get_property ("whichBar")); +} + +void +Multi_measure_rest_engraver::stop_translation_timestep () +{ + /* + We can not do this earlier, as breakableSeparationItem is not yet there. + */ + + if (bar_seen_) { - Grob *cmc = unsmob_grob (get_property( "currentCommandColumn")); + Grob *cmc = unsmob_grob (get_property("breakableSeparationItem")); + if (!cmc) + cmc = unsmob_grob (get_property ("currentCommandColumn")); + Item *it = dynamic_cast (cmc); + if (mmrest_) { add_bound_item (mmrest_, it); @@ -176,11 +194,8 @@ Multi_measure_rest_engraver::process_music () add_bound_item (last_numbers_[i], it); } } -} - -void -Multi_measure_rest_engraver::stop_translation_timestep () -{ + + SCM smp = get_property ("measurePosition"); Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); @@ -231,6 +246,8 @@ Multi_measure_rest_engraver::stop_translation_timestep () void Multi_measure_rest_engraver::start_translation_timestep () { + bar_seen_ = false; + SCM smp = get_property ("measurePosition"); Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); @@ -308,5 +325,5 @@ ENTER_DESCRIPTION(Multi_measure_rest_engraver, /* creats*/ "MultiMeasureRest MultiMeasureRestNumber MultiMeasureRestText", /* accepts */ "multi-measure-rest-event multi-measure-text-event", /* acks */ "", -/* reads */ "currentBarNumber restNumberThreshold currentCommandColumn measurePosition measureLength", +/* reads */ "currentBarNumber restNumberThreshold breakableSeparationItem currentCommandColumn measurePosition measureLength", /* write */ ""); diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 8824ab3596..e6e747e23c 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -20,6 +20,7 @@ #include "text-item.hh" #include "percent-repeat-item.hh" #include "lookup.hh" +#include "separation-item.hh" MAKE_SCHEME_CALLBACK (Multi_measure_rest,percent,1); SCM @@ -76,11 +77,13 @@ Multi_measure_rest::brew_molecule (SCM smob) Grob *common = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS); do { - Item * col = sp->get_bound (d)->get_column (); + Item * b = sp->get_bound (d); - Interval coldim = col->extent (common, X_AXIS); + Interval coldim = (Separation_item::has_interface (b)) + ? Separation_item::relative_width (b, common) + : b->extent (common, X_AXIS); - sp_iv[d] = coldim[-d] ; + sp_iv[d] = coldim.is_empty () ? b->relative_coordinate (common, X_AXIS) : coldim[-d]; } while ((flip (&d)) != LEFT); diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc index 6fefed83d4..2cb1cf9aa2 100644 --- a/lily/separating-line-group-engraver.cc +++ b/lily/separating-line-group-engraver.cc @@ -16,6 +16,8 @@ #include "note-spacing.hh" #include "group-interface.hh" #include "accidental-placement.hh" +#include "translator-group.hh" + struct Spacings { @@ -37,12 +39,13 @@ struct Spacings } }; + class Separating_line_group_engraver : public Engraver { protected: - Item * break_malt_; - Item * musical_malt_; - Item * last_musical_malt_; + Item * break_item_; + Item * musical_item_; + Item * last_musical_item_; Spacings current_spacings_; Spacings last_spacings_; @@ -61,8 +64,8 @@ public: Separating_line_group_engraver::Separating_line_group_engraver () { sep_span_ = 0; - break_malt_ = 0; - musical_malt_ =0; + break_item_ = 0; + musical_item_ =0; } void @@ -120,22 +123,25 @@ Separating_line_group_engraver::acknowledge_grob (Grob_info i) } bool ib =Item::breakable_b (it); - Item *&p_ref_ (ib ? break_malt_ - : musical_malt_); + Item *&p_ref_ (ib ? break_item_ + : musical_item_); if (!p_ref_) { p_ref_ = new Item (get_property ("SeparationItem")); if (ib) - p_ref_->set_grob_property ("breakable", SCM_BOOL_T); + { + p_ref_->set_grob_property ("breakable", SCM_BOOL_T); + daddy_trans_->set_property ("breakableSeparationItem", p_ref_->self_scm ()); + } announce_grob(p_ref_, SCM_EOL); - if (p_ref_ == break_malt_) + if (p_ref_ == break_item_) { Item *it = new Item (get_property ("StaffSpacing")); current_spacings_.staff_spacing_ = it; - it->set_grob_property ("left-items", gh_cons (break_malt_->self_scm (), SCM_EOL)); + it->set_grob_property ("left-items", gh_cons (break_item_->self_scm (), SCM_EOL)); announce_grob(it, SCM_EOL); @@ -144,14 +150,14 @@ Separating_line_group_engraver::acknowledge_grob (Grob_info i) for (; i--;) Pointer_group_interface::add_grob (last_spacings_.note_spacings_[i], ly_symbol2scm ("right-items"), - break_malt_); + break_item_); } else if (last_spacings_.staff_spacing_) { last_spacings_.staff_spacing_->set_grob_property ("right-items", - gh_cons (break_malt_->self_scm(), SCM_EOL)); + gh_cons (break_item_->self_scm(), SCM_EOL)); } } } @@ -165,18 +171,18 @@ Separating_line_group_engraver::acknowledge_grob (Grob_info i) void Separating_line_group_engraver::start_translation_timestep () { - + if (break_item_) + daddy_trans_->unset_property (ly_symbol2scm ("breakableSeparationItem")); + break_item_ =0; } void Separating_line_group_engraver::stop_translation_timestep () { - if (break_malt_) + if (break_item_) { - Separating_group_spanner::add_spacing_unit (sep_span_, break_malt_); - typeset_grob (break_malt_); - - break_malt_ =0; + Separating_group_spanner::add_spacing_unit (sep_span_, break_item_); + typeset_grob (break_item_); } if (Item * sp = current_spacings_.staff_spacing_) @@ -185,9 +191,9 @@ Separating_line_group_engraver::stop_translation_timestep () TODO: should really look at the left-items of following note-spacing grobs. */ - if (musical_malt_) + if (musical_item_) Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"), - musical_malt_); + musical_item_); typeset_grob (sp); } @@ -200,13 +206,13 @@ Separating_line_group_engraver::stop_translation_timestep () current_spacings_.clear (); - if (musical_malt_) + if (musical_item_) { - Separating_group_spanner::add_spacing_unit (sep_span_, musical_malt_); - typeset_grob (musical_malt_); + Separating_group_spanner::add_spacing_unit (sep_span_, musical_item_); + typeset_grob (musical_item_); } - musical_malt_ =0; + musical_item_ =0; } @@ -216,4 +222,4 @@ ENTER_DESCRIPTION(Separating_line_group_engraver, /* accepts */ "", /* acks */ "item-interface", /* reads */ "", -/* write */ ""); +/* write */ "breakableSeparationItem"); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index c1822616e4..8b59a91967 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -127,6 +127,14 @@ Separation_item::width (Grob *me) return w; } +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 diff --git a/lily/slash-repeat-engraver.cc b/lily/slash-repeat-engraver.cc index 456013b67f..b7595056e1 100644 --- a/lily/slash-repeat-engraver.cc +++ b/lily/slash-repeat-engraver.cc @@ -145,5 +145,5 @@ ENTER_DESCRIPTION(Slash_repeat_engraver, /* creats*/ "RepeatSlash", /* accepts */ "repeated-music", /* acks */ "", -/* reads */ "measureLength currentCommandColumn", +/* reads */ "measureLength", /* write */ ""); diff --git a/lily/system.cc b/lily/system.cc index 4cf53c114a..ae06cfc988 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -76,7 +76,7 @@ System::output_lines () gh_pair_p (s); s = ly_cdr (s)) { Grob * g = unsmob_grob (ly_car (s)); - if (Spacing_interface::has_interface (g)) + if (g->internal_has_interface ("only-prebreak-interface")) { /* Kill no longer needed grobs. diff --git a/lily/timing-engraver.cc b/lily/timing-engraver.cc index be0fa1aef6..a6153a90bf 100644 --- a/lily/timing-engraver.cc +++ b/lily/timing-engraver.cc @@ -83,7 +83,6 @@ Timing_engraver::stop_translation_timestep () Timing_translator::stop_translation_timestep (); daddy_trans_->set_property ("whichBar", SCM_EOL); last_moment_ = now_mom (); - } diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm index 08c99b85c7..26e050f838 100644 --- a/scm/define-grob-interfaces.scm +++ b/scm/define-grob-interfaces.scm @@ -63,6 +63,17 @@ extents of a cluster spanner at this X position. "Note name" '(style)) +(ly:add-interface + 'only-prebreak-interface + "Kill this grob after the line breaking process." + '() ) + +(ly:add-interface + 'piano-pedal-interface + "A piano pedal sign" + '()) + + (ly:add-interface 'rhythmic-grob-interface "Any object with a rhythmic basis. Used to determine which grobs @@ -75,11 +86,6 @@ are interesting enough to maintain a hara-kiri staff." "tablature notes" '()) -(ly:add-interface - 'piano-pedal-interface - "A piano pedal sign" - '()) - ;; todo: figure out where to put this doco: diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 434ece6856..5569834df6 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -970,13 +970,15 @@ (SeparationItem . ( + (X-extent-callback . #f) + (Y-extent-callback . #f) (meta . ((interfaces . (spacing-interface separation-item-interface item-interface )))) )) (SeparatingGroupSpanner . ( (spacing-procedure . ,Separating_group_spanner::set_spacing_rods) - (meta . ((interfaces . (spacing-interface separation-spanner-interface spanner-interface)))) + (meta . ((interfaces . (only-prebreak-interface spacing-interface separation-spanner-interface spanner-interface)))) )) (SustainPedal diff --git a/scm/define-translator-properties.scm b/scm/define-translator-properties.scm index fdd449715c..6f1342ae38 100644 --- a/scm/define-translator-properties.scm +++ b/scm/define-translator-properties.scm @@ -118,6 +118,10 @@ using barchecks in polyphonic music.") (translator-property-description 'beatGrouping list? "List of beatgroups. Eg. in 5/8 time #(list 2 3).") + +(translator-property-description 'breakableSeparationItem ly:grob? +"The breakable items in this time step, for this staff.") + (translator-property-description 'breakAlignOrder list? "Defines the order in which prefatory matter (clefs, key signatures) appears, eg. this puts the key signatures after the bar lines: