]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/ledger-line-spanner.cc
* lily/ledger-line-spanner.cc (print): swap linear_combination
[lilypond.git] / lily / ledger-line-spanner.cc
index ca54f00089789ea7f73543a06f68fbeff47a255d..d2eda9a07eb0b2d1df7f6a5f2e8ad5919243779e 100644 (file)
@@ -17,7 +17,6 @@
 #include "spanner.hh" 
 #include "group-interface.hh" 
 #include "paper-column.hh"
-#include "ambitus.hh"
 
 struct Ledger_line_spanner
 {
@@ -110,6 +109,12 @@ Ledger_line_spanner::print (SCM smob)
 
   if (heads.is_empty ())
     return SCM_EOL;
+  
+  // find size of note heads.
+  Grob * staff = Staff_symbol_referencer::get_staff_symbol (me);
+  if (!staff)
+    return SCM_EOL;
+  
     
   Stencil ledgers;
   Stencil default_ledger;
@@ -125,8 +130,6 @@ Ledger_line_spanner::print (SCM smob)
          common[a] = common[a]->common_refpoint (g, a);
     }
 
-  // find size of note heads.
-  Grob * staff = Staff_symbol_referencer::get_staff_symbol (me);
   int interspaces = Staff_symbol::line_count (staff)-1;
   Ledger_requests reqs;
   Real length_fraction = 0.25;
@@ -135,11 +138,12 @@ Ledger_line_spanner::print (SCM smob)
       Item *h = dynamic_cast<Item*> (heads[i]);
       
       int pos = Staff_symbol_referencer::get_rounded_position (h);
-      if (abs (pos) > interspaces)
+      if (pos
+         && abs (pos) > interspaces)
        {
          Interval head_extent = h->extent (common[X_AXIS], X_AXIS);
          Interval ledger_extent = head_extent;
-         head_extent.widen (length_fraction * head_extent.length ());
+         ledger_extent.widen (length_fraction * head_extent.length ());
 
          Direction vdir = Direction (sign (pos));
          int rank = Paper_column::get_rank (h->get_column ());
@@ -195,7 +199,7 @@ Ledger_line_spanner::print (SCM smob)
   // create  ledgers for note heads
   Real ledgerlinethickness =
     Staff_symbol::get_ledger_line_thickness (staff);
-  Real halfspace = Staff_symbol::staff_space (me)/2;
+  Real halfspace = Staff_symbol::staff_space (staff)/2;
   for (int i = heads.size (); i--; )
     {
       Item *h = dynamic_cast<Item*> (heads[i]);
@@ -203,7 +207,8 @@ Ledger_line_spanner::print (SCM smob)
       int pos = Staff_symbol_referencer::get_rounded_position (h);
       if (abs (pos) > interspaces + 1)
        {
-         Interval ledger_size = h->extent (common[X_AXIS], X_AXIS);
+         Interval head_size = h->extent (common[X_AXIS], X_AXIS);
+         Interval ledger_size = head_size;
          ledger_size.widen (ledger_size.length ()* length_fraction);
 
          Interval max_size = reqs[Paper_column::get_rank (h->get_column ())][Direction (sign(pos))].ledger_extent_;
@@ -212,11 +217,11 @@ Ledger_line_spanner::print (SCM smob)
          Real left_shorten =0.0;
          if (Grob * g = unsmob_grob (h->get_property ("accidental-grob")))
            {
+             Interval accidental_size = g->extent (common[X_AXIS], X_AXIS);
              Real d =
-               linear_combination (Drul_array<Real> (h->extent (common[X_AXIS], X_AXIS)[LEFT],
-                                                     g->extent (common[X_AXIS], X_AXIS)[RIGHT]),
-                               
-                                   0.5);
+               linear_combination (Drul_array<Real> (accidental_size[RIGHT],
+                                                     head_size[LEFT]),                         
+                                   0.0);
 
              left_shorten =  (-ledger_size[LEFT] + d) >?  0 ;
 
@@ -244,5 +249,15 @@ Ledger_line_spanner::print (SCM smob)
 
 ADD_INTERFACE (Ledger_line_spanner,
               "ledger-line-interface",
-              "This spanner draws the ledger lines of a staff on note heads. ",
-              "note-heads thickness gap length minimum-length")
+              "This spanner draws the ledger lines of a staff, for note heads that stick out. ",
+              "note-heads thickness gap length minimum-length");
+
+
+struct Ledgered_interface { 
+  static bool has_interface (Grob*);
+};
+
+ADD_INTERFACE (Ledgered_interface,
+              "ledgered-interface",
+              "Objects that need ledger lines.",
+              "no-ledgers");