]> git.donarmstrong.com Git - lilypond.git/commitdiff
(set_spacing_rods): new
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 9 Mar 2005 00:01:17 +0000 (00:01 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 9 Mar 2005 00:01:17 +0000 (00:01 +0000)
function. Keep ledgered note heads at a minimum distance.
Introduce minimum-length-fraction
(print): introduce length-fraction property.

16 files changed:
ChangeLog
lily/include/rod.hh
lily/include/spring.hh
lily/ledger-line-spanner.cc
lily/lyric-hyphen.cc
lily/multi-measure-rest.cc
lily/piano-pedal-performer.cc
lily/rod.cc
lily/separating-group-spanner.cc
lily/separation-item.cc
lily/spacing-spanner.cc
lily/spanner.cc
ly/paper-defaults.ly
scm/backend-library.scm
scm/define-grob-properties.scm
scm/define-grobs.scm

index 9a040a2030c08450a69df8af4b3e93ca0fd74bbd..ce38da0b232fdcd3da35059059c5600f30292a60 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-03-09  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+       * lily/ledger-line-spanner.cc (set_spacing_rods): new
+       function. Keep ledgered note heads at a minimum distance.
+       Introduce minimum-length-fraction
+       (print): introduce length-fraction property.
+
+2005-03-08  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+       * tex/GNUmakefile: remove latin1.enc rules.
+
 2005-03-08  Jan Nieuwenhuizen  <janneke@gnu.org>
 
        * scm/titling.scm: Typo.
index 0ffba421d666749e68e58babbb4919fd5c263ff1..d334db2a37ae91a806a3f66fdc3387096396d1ba 100644 (file)
@@ -15,7 +15,7 @@
 
 struct Rod
 {
-  Drul_array <Item*> item_l_drul_;
+  Drul_array <Item*> item_drul_;
   Real distance_;
 
   /**
index 58b72feb0e352ff4ca37d08a3888135f1e13af36..2efb1105fda8a3145598e6d27ab1eb53fe9c4004 100644 (file)
@@ -28,7 +28,7 @@ DECLARE_UNSMOB(Spring_smob, spring);
 
 struct Spring
 {
-  Drul_array<Item*> item_l_drul_;
+  Drul_array<Item*> item_drul_;
   Real distance_;
   bool expand_only_b_;
 
index 7d4b922a0351ba9b3d2d22e41eb296a0e6efdff8..0af662952fc07f7e540a7b298c2d9c94e21f1089 100644 (file)
@@ -8,7 +8,9 @@
 */
 
 #include <map>
+#include <set>
 
+#include "item.hh"
 #include "note-head.hh" 
 #include "staff-symbol-referencer.hh" 
 #include "staff-symbol.hh" 
@@ -20,6 +22,7 @@
 struct Ledger_line_spanner
 {
   DECLARE_SCHEME_CALLBACK (print, (SCM ));
+  DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM ));
   static Stencil brew_ledger_lines (Grob *me,
                                    int pos,
                                    int interspaces,
@@ -79,6 +82,99 @@ Ledger_line_spanner::brew_ledger_lines (Grob *staff,
 }
 
 
+typedef std::map<int, Drul_array<Interval> > Head_extents_map;
+typedef std::map<int, Grob*> Column_map;
+
+MAKE_SCHEME_CALLBACK (Ledger_line_spanner, set_spacing_rods, 1);
+SCM
+Ledger_line_spanner::set_spacing_rods (SCM smob)
+{
+  Spanner *me = dynamic_cast<Spanner*> (unsmob_grob (smob));
+
+  // find size of note heads.
+  Grob * staff = Staff_symbol_referencer::get_staff_symbol (me);
+  if (!staff)
+    return SCM_EOL;
+
+  Link_array<Grob> heads (Pointer_group_interface__extract_grobs (me, (Grob*)0, "note-heads"));
+  
+  if (heads.is_empty ())
+    return SCM_EOL;
+  
+  Real min_length_fraction
+    = robust_scm2double (me->get_property ("minimum-length-fraction"), 0.15);
+  
+  Head_extents_map head_extents;
+  Column_map columns;
+  
+  int interspaces = Staff_symbol::line_count (staff)-1;
+  for (int i = heads.size (); i--; )
+    {
+      Item *h = dynamic_cast<Item*> (heads[i]);
+      
+      int pos = Staff_symbol_referencer::get_rounded_position (h);
+      if (pos
+         && abs (pos) > interspaces)
+       {
+         Grob *column = h->get_column ();
+         int rank = Paper_column::get_rank (column);
+
+         Interval head_extent = h->extent (column, X_AXIS);
+         Direction vdir = Direction (sign (pos));
+         if (!vdir)
+           continue;
+         
+         Interval prev_extent; 
+
+         Head_extents_map::iterator j = head_extents.find (rank);
+         if (j != head_extents.end ())
+           prev_extent = (*j).second[vdir];
+         else
+           columns[rank] = column;
+         
+         prev_extent.unite (head_extent);
+         head_extents[rank][vdir] = prev_extent;
+       }
+    }
+
+  for (Column_map::const_iterator c (columns.begin()); c != columns.end(); c++)
+    {
+      Grob *column = (*c).second;
+      int rank = (*c).first;
+
+      int next_rank = rank + 2;
+      
+      if (head_extents.find (next_rank) != head_extents.end ())
+       {
+         Drul_array<Interval> extents_left = head_extents[rank]; 
+         Drul_array<Interval> extents_right = head_extents[next_rank]; 
+
+         Direction d = DOWN;
+         do
+           {
+             if (!extents_right[d].is_empty () && !extents_right[d].is_empty ())
+               {
+                 Real l1 = extents_right[d].length() * min_length_fraction;
+                 Real l2 = extents_left[d].length() * min_length_fraction;
+
+                 Rod rod;
+                 rod.distance_ = l1 + l2 + (l1+ l2)/2.0
+                   + extents_left[d][RIGHT]
+                   - extents_right[d][LEFT];
+                 
+                 rod.item_drul_[LEFT] = dynamic_cast<Item*> (column);
+                 rod.item_drul_[RIGHT] = dynamic_cast<Item*> (columns[next_rank]);
+                 rod.add_to_cols ();
+               }
+           }
+         while (flip (&d) != DOWN);
+       }
+    }
+
+  return SCM_UNSPECIFIED;
+}
+
+
 struct Ledger_request
 {
   Interval ledger_extent_;
@@ -115,6 +211,9 @@ Ledger_line_spanner::print (SCM smob)
     return SCM_EOL;
   
     
+  Real length_fraction
+    = robust_scm2double (me->get_property ("length-fraction"), 0.25);
+
   Stencil ledgers;
   Stencil default_ledger;
 
@@ -131,7 +230,6 @@ Ledger_line_spanner::print (SCM smob)
 
   int interspaces = Staff_symbol::line_count (staff)-1;
   Ledger_requests reqs;
-  Real length_fraction = 0.25;
   for (int i = heads.size (); i--; )
     {
       Item *h = dynamic_cast<Item*> (heads[i]);
@@ -239,7 +337,6 @@ Ledger_line_spanner::print (SCM smob)
        }
     }
 
-
   ledgers.translate_axis (-me->relative_coordinate (common[X_AXIS], X_AXIS),
                          X_AXIS);
   
@@ -249,7 +346,7 @@ Ledger_line_spanner::print (SCM smob)
 ADD_INTERFACE (Ledger_line_spanner,
               "ledger-line-interface",
               "This spanner draws the ledger lines of a staff, for note heads that stick out. ",
-              "note-heads thickness gap length minimum-length");
+              "note-heads thickness minimum-length-fraction length-fraction gap");
 
 
 struct Ledgered_interface { 
index f98d5c446f84ead7e25d9ac8429a4bf7447f559c..07a393e7d24752ce28a33ae59d61f69296e43d7c 100644 (file)
@@ -100,14 +100,14 @@ Hyphen_spanner::set_spacing_rods (SCM smob)
   Direction d = LEFT;
   do
     {
-      r.item_l_drul_[d] = sp->get_bound (d);
-      if (r.item_l_drul_[d])
-       r.distance_ += r.item_l_drul_[d]->extent (r.item_l_drul_[d], X_AXIS)[-d];
+      r.item_drul_[d] = sp->get_bound (d);
+      if (r.item_drul_[d])
+       r.distance_ += r.item_drul_[d]->extent (r.item_drul_[d], X_AXIS)[-d];
     }
   while (flip (&d) != LEFT);
 
-  if (r.item_l_drul_[LEFT]
-      && r.item_l_drul_[RIGHT])
+  if (r.item_drul_[LEFT]
+      && r.item_drul_[RIGHT])
     r.add_to_cols ();
   
   return SCM_UNSPECIFIED;
index 31a1c8b9adec3bda6d5a451d07914c1aabae0051..f2298a92de21d9e497dc29e3f6a30802976a7af7 100644 (file)
@@ -328,8 +328,8 @@ Multi_measure_rest::set_spacing_rods (SCM smob)
        continue;
 
       Rod rod;
-      rod.item_l_drul_[LEFT] = li;
-      rod.item_l_drul_[RIGHT] = ri;
+      rod.item_drul_[LEFT] = li;
+      rod.item_drul_[RIGHT] = ri;
 
       rod.distance_ = li->extent (li, X_AXIS)[BIGGER]
        - ri->extent (ri, X_AXIS)[SMALLER]
index e5c8a70129d8d956928267f33c1e97f476482d0e..e423e01106ecb2e615d3a9a1b433dd3cae1a1698 100644 (file)
@@ -18,7 +18,7 @@ class Piano_pedal_performer : public Performer
   {
     char const *name_;
     Music* start_req_;
-    Drul_array<Music*> req_l_drul_;
+    Drul_array<Music*> req_drul_;
   };
 
 public:
@@ -58,8 +58,8 @@ Piano_pedal_performer::initialize ()
   do
     {
       p->name_ = *np;
-      p->req_l_drul_[START] = 0;
-      p->req_l_drul_[STOP] = 0;
+      p->req_drul_[START] = 0;
+      p->req_drul_[STOP] = 0;
       p->start_req_ = 0;
 
       p++;
@@ -73,11 +73,11 @@ Piano_pedal_performer::create_audio_elements ()
   for (Pedal_info*p = info_alist_; p && p->name_; p ++)
  
     {
-      if (p->req_l_drul_[STOP])
+      if (p->req_drul_[STOP])
        {
          if (!p->start_req_)
            {
-             p->req_l_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", String (p->name_)));
+             p->req_drul_[STOP]->origin ()->warning (_f ("can't find start of piano pedal: `%s'", String (p->name_)));
            }
          else
            {
@@ -89,16 +89,16 @@ Piano_pedal_performer::create_audio_elements ()
          p->start_req_ = 0;
        }
 
-      if (p->req_l_drul_[START])
+      if (p->req_drul_[START])
        {
-         p->start_req_ = p->req_l_drul_[START];
+         p->start_req_ = p->req_drul_[START];
          Audio_piano_pedal* a = new Audio_piano_pedal;
          a->type_string_ = String (p->name_);
          a->dir_ = START;
          audios_.push (a);
        }
-      p->req_l_drul_[START] = 0;
-      p->req_l_drul_[STOP] = 0;
+      p->req_drul_[START] = 0;
+      p->req_drul_[STOP] = 0;
     }
 }
 
@@ -115,8 +115,8 @@ Piano_pedal_performer::start_translation_timestep ()
 {
   for (Pedal_info*p = info_alist_; p && p->name_; p ++)
     {
-      p->req_l_drul_[STOP] = 0;
-      p->req_l_drul_[START] = 0;
+      p->req_drul_[STOP] = 0;
+      p->req_drul_[START] = 0;
     }
 }
 
@@ -132,7 +132,7 @@ Piano_pedal_performer::try_music (Music* r)
                          scm_str2symbol (nm.to_str0())))
            {
              Direction d = to_dir (r->get_property ("span-direction"));
-             p->req_l_drul_[d] = r;
+             p->req_drul_[d] = r;
              return true;
            }
        }
index de174e9ea1851e2d062e6076b3308e1a176b615c..889429a63e8f0b904bd47b204c78569c1d07e2dc 100644 (file)
@@ -17,7 +17,7 @@
 Rod::Rod ()
 {
   distance_ = 0.0;
-  item_l_drul_[LEFT] = item_l_drul_[RIGHT] = 0;
+  item_drul_[LEFT] = item_drul_[RIGHT] = 0;
 }
 
 
@@ -25,15 +25,15 @@ Rod::Rod ()
 void
 Rod::columnize ()
 {
-  if (!item_l_drul_[LEFT]
-      || !item_l_drul_[RIGHT])
+  if (!item_drul_[LEFT]
+      || !item_drul_[RIGHT])
     return ;
   
   Direction d = LEFT;
   do {
-    Paper_column * pc = item_l_drul_[d]->get_column ();
-    distance_ += - d * item_l_drul_[d]->relative_coordinate (pc, X_AXIS);
-    item_l_drul_[d] = pc;
+    Paper_column * pc = item_drul_[d]->get_column ();
+    distance_ += - d * item_drul_[d]->relative_coordinate (pc, X_AXIS);
+    item_drul_[d] = pc;
   } while ((flip (&d))!= LEFT);
 
 }
@@ -42,10 +42,10 @@ void
 Rod::add_to_cols ()
 {
   columnize ();
-  if (item_l_drul_[LEFT] != item_l_drul_[RIGHT]
-      && item_l_drul_[LEFT] && item_l_drul_[RIGHT])
-    Spaceable_grob::add_rod (item_l_drul_[LEFT],
-                            item_l_drul_[RIGHT],
+  if (item_drul_[LEFT] != item_drul_[RIGHT]
+      && item_drul_[LEFT] && item_drul_[RIGHT])
+    Spaceable_grob::add_rod (item_drul_[LEFT],
+                            item_drul_[RIGHT],
                             distance_);
 }
 
index 2cc6c35999afcff6c25810850fd725c1edf9a9d4..7481ee0684135df1eaed9d8e70e2de26b1906454 100644 (file)
@@ -42,8 +42,8 @@ Separating_group_spanner::find_rods (Item * r, SCM next, Real padding)
            {
              Rod rod;
 
-             rod.item_l_drul_[LEFT] = lb;
-             rod.item_l_drul_[RIGHT] = r;
+             rod.item_drul_[LEFT] = lb;
+             rod.item_drul_[RIGHT] = r;
 
              rod.distance_ = li[RIGHT] - ri[LEFT] + padding;
              rod.add_to_cols ();
@@ -56,8 +56,8 @@ Separating_group_spanner::find_rods (Item * r, SCM next, Real padding)
        {
          Rod rod;
 
-         rod.item_l_drul_[LEFT] = l;
-         rod.item_l_drul_[RIGHT]= r;
+         rod.item_drul_[LEFT] = l;
+         rod.item_drul_[RIGHT]= r;
 
          rod.distance_ = li[RIGHT] - ri[LEFT] + padding;
        
index b6a99a5ee52d4f28f1e2bed4351e45997fa7c101..7d852f69d7336c3f3c443984eb6359057f5bbe81 100644 (file)
@@ -170,7 +170,5 @@ Separation_item::extremal_break_aligned_grob (Grob *separation_item, Direction d
 ADD_INTERFACE (Separation_item, "separation-item-interface",
               "Item that computes widths to generate spacing rods. "
               "This is done in concert with @ref{separation-spanner-interface}."
-              
               ,
-
               "padding X-extent conditional-elements elements");
index 97604610c26ac49398277f49658721f6c3c8c3a4..389593ff93166d2d8e46271ccd6b42316c7a64dd 100644 (file)
@@ -244,8 +244,8 @@ Spacing_spanner::prune_loose_columns (Grob*me, Link_array<Grob> *cols, Rational
 
          Rod r;
          r.distance_ = dists[LEFT] + dists[RIGHT];
-         r.item_l_drul_[LEFT] = dynamic_cast<Item*> (cols->elem (i-1));
-         r.item_l_drul_[RIGHT] = dynamic_cast<Item*> (cols->elem (i+1));
+         r.item_drul_[LEFT] = dynamic_cast<Item*> (cols->elem (i-1));
+         r.item_drul_[RIGHT] = dynamic_cast<Item*> (cols->elem (i+1));
 
          r.add_to_cols ();
        }
index 0e4c9e04c024287d0ea87f44bae1b86898be0bc9..842d706e6de509d1e7b190c308f06dc2a1cce22a 100644 (file)
@@ -343,8 +343,8 @@ Spanner::set_spacing_rods (SCM smob)
 
   Rod r;
   Spanner*sp = dynamic_cast<Spanner*> (me);
-  r.item_l_drul_[LEFT] = sp->get_bound (LEFT);
-  r.item_l_drul_[RIGHT] = sp->get_bound (RIGHT);
+  r.item_drul_[LEFT] = sp->get_bound (LEFT);
+  r.item_drul_[RIGHT] = sp->get_bound (RIGHT);
   r.distance_ =
     robust_scm2double (me->get_property ("minimum-length"), 0);
 
index 06796d7d04780943242dc06ffc45658b9d9db2f7..925f1c3ffa2cad8c85386b98e2b7232ac2ac9df8 100644 (file)
@@ -72,7 +72,7 @@
           (else 'latin1)))
        ;; add to taste here.
        
-       (baseline-skip . 2)
+       (baseline-skip . 3)
        (word-space . 0.6)))
 
     #(define page-breaking ly:optimal-page-breaks)
index ce407e53f6645ae5847939bb3e71b0c5b01d31f3..431c7b48a616423188beb1d196fbc1800f211727 100644 (file)
@@ -25,7 +25,7 @@
          (newline (current-error-port))
          
          ;; hmmm.  what's the best failure option? 
-         (throw 'ly-file-failed))))
+         (throw 'ly-file-failed)))))
 
 (define-public (sanitize-command-option str)
   (string-append
index f723e580b069edf42e644da78cc8033c7a15090f..3036987af8450e7a3e6dcfaeaba6563fd40c4dc1 100644 (file)
@@ -287,6 +287,7 @@ second for staff space. Both contributions are added.")
 left to a group of accidentals.")
      (length ,ly:dimension? "User override for the stem length of
 unbeamed stems.")
+     (length-fraction ,number? "Length of ledger line as fraction of note head size.")
      (lengths ,list? "Default stem lengths. The list gives a length
 for each flag-count.")
      (line-count ,integer? "The number of staff lines.")
@@ -305,6 +306,7 @@ polyphonic guitar notation. The value of this setting is used by
 collisions, even if they have a different number of dots. This normal
 notation for some types of polyphonic music. ")
 
+     (minimum-length-fraction ,number? "Minimum length of ledger line as fraction of note head size.")
      (minimum-distance ,ly:dimension? "Minimum distance between rest
 and notes or beam.")
      (minimum-X-extent ,number-pair? "Minimum size of an object in X
index fece9d0b2e349605fd92492bdf3eba1968007bba..487ad88ffcd9e2b68a6a526652ed083de4fbe08f 100644 (file)
        (print-function . ,Ledger_line_spanner::print)
        (X-extent-callback . #f)
        (Y-extent-callback . #f)
+       (spacing-procedure . ,Ledger_line_spanner::set_spacing_rods)
        (print-function . ,Ledger_line_spanner::print)
        (layer . 0)
        (meta . ((interfaces . (spanner-interface ledger-line-interface))))