]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/separating-line-group-engraver.cc (acknowledge_grob):
authorhanwen <hanwen>
Tue, 6 Jan 2004 15:53:08 +0000 (15:53 +0000)
committerhanwen <hanwen>
Tue, 6 Jan 2004 15:53:08 +0000 (15:53 +0000)
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.

14 files changed:
ChangeLog
Documentation/topdocs/NEWS.texi
input/regression/multi-measure-rest-multi-staff-center.ly [new file with mode: 0644]
lily/include/separation-item.hh
lily/multi-measure-rest-engraver.cc
lily/multi-measure-rest.cc
lily/separating-line-group-engraver.cc
lily/separation-item.cc
lily/slash-repeat-engraver.cc
lily/system.cc
lily/timing-engraver.cc
scm/define-grob-interfaces.scm
scm/define-grobs.scm
scm/define-translator-properties.scm

index 5cc5c36b2c67e678d503e0ecf9f7992cea4b6545..dc0c0120e692b87d0ece1a782b25c3d37d1b2bdd 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 2004-01-06  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+       * 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.
index a2bfabf60c9f4211447cfc7eb091a5c8b5765be3..887a273939a7bce36369ad14b90fe13fb04b8198 100644 (file)
@@ -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 (file)
index 0000000..77f3a2a
--- /dev/null
@@ -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 } 
+}
index 2beaedd56ad427c7fbdc62ce50ea47d05f47c4c0..9a48e1cacb50c6fc742d3687f51f1d0242c08ff0 100644 (file)
@@ -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*);  
index b25fd144d11642f90de8784e9bd22ef0e656e139..8099c3a51744e3d24cc698722834e05515ff3c3a 100644 (file)
@@ -40,6 +40,8 @@ private:
   Moment start_moment_;
   Rational last_main_moment_;
 
+  bool bar_seen_;
+  
   Spanner *mmrest_;
   Link_array<Spanner> 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<Item*> (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 */       "");
index 8824ab3596773a3ea93b33ce2ea9c9ad66ff9225..e6e747e23cc384d4b450b39fd09866b40762e208 100644 (file)
@@ -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);
 
index 6fefed83d44df7cb8eea19511a09e1b12b0e6c62..2cb1cf9aa2442569345d232a7b7fa75167e6d7c4 100644 (file)
@@ -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");
index c1822616e49c961e8d32ecd06f1239054174edd4..8b59a919678891a412152655fb83b51ecc3b2bf4 100644 (file)
@@ -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<Item*>(me)->get_column ()->relative_coordinate (common, X_AXIS) + iv ;
+}
+
 
 /*
   Try to find the break-aligned symbol in SEPARATION_ITEM that is
index 456013b67f18fa9d06d6021fa011667b538f19aa..b7595056e109a7c68febb78a311d6207c57acfb6 100644 (file)
@@ -145,5 +145,5 @@ ENTER_DESCRIPTION(Slash_repeat_engraver,
 /* creats*/       "RepeatSlash",
 /* accepts */     "repeated-music",
 /* acks  */      "",
-/* reads */       "measureLength currentCommandColumn",
+/* reads */       "measureLength",
 /* write */       "");
index 4cf53c114a16577c16bfc05377330211598ad160..ae06cfc9881616c3cfc35d71a16a6e58122febb8 100644 (file)
@@ -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. 
index be0fa1aef6cf0815e2a7ac7640a57f1bed9ff089..a6153a90bfe925ba26a1a2ae35349b2c4c4036d6 100644 (file)
@@ -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 ();
-      
 }
 
 
index 08c99b85c79d0ae724c778dcbc7e63da657407b2..26e050f8389959fb615c4c6d1b761934159af0e4 100644 (file)
@@ -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:
 
index 434ece6856695fe86e4d5c964f7ab4ceb830e5b3..5569834df6742a864371a49c4ebab4fe7c68babb 100644 (file)
 
     (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
index fdd449715ccaa5f7b44f18ca428e413a6a988371..6f1342ae38b4e2a892d0b2aad1343fcbed9439e9 100644 (file)
@@ -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: