]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/staff-symbol.cc
Doc: NR - input.itely - TOC customization
[lilypond.git] / lily / staff-symbol.cc
index a5db48de46887a1e44527fb0ce13551a1c683d65..de88102d1420d140152786692eeeb72b0ce8bb5a 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1997--2014 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -33,7 +33,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, print, 1);
 SCM
 Staff_symbol::print (SCM smob)
 {
-  Grob *me = Grob::unsmob (smob);
+  Grob *me = unsmob<Grob> (smob);
   Spanner *sp = dynamic_cast<Spanner *> (me);
   Grob *common
     = sp->get_bound (LEFT)->common_refpoint (sp->get_bound (RIGHT), X_AXIS);
@@ -65,11 +65,19 @@ Staff_symbol::print (SCM smob)
       else
         {
           Item *x = sp->get_bound (d);
-
-          span_points[d] = ((!x->break_status_dir ()
-                             && !x->extent (x, X_AXIS).is_empty ())
-                            ? Paper_column::break_align_width (x, ly_symbol2scm ("break-alignment"))[d]
-                            : x->relative_coordinate (common, X_AXIS));
+          if (x->extent (x, X_AXIS).is_empty ()
+              || (x->break_status_dir () && sp->broken_neighbor (d)))
+            span_points[d] = x->relative_coordinate (common, X_AXIS);
+          // What the default implementation of to-barline does for
+          // spanners is not really in usefully recognizable shape by
+          // now, so we just reimplement.
+          else
+            {
+              SCM where = (d == RIGHT
+                           ? me->get_property ("break-align-symbols")
+                           : ly_symbol2scm ("break-alignment"));
+              span_points[d] = Paper_column::break_align_width (x, where)[d];
+            }
         }
 
       span_points[d] -= d * t / 2;
@@ -255,7 +263,9 @@ Staff_symbol::line_count (Grob *me)
 Real
 Staff_symbol::staff_space (Grob *me)
 {
-  return robust_scm2double (me->get_property ("staff-space"), 1.0);
+  Real ss = me->layout ()->get_dimension (ly_symbol2scm ("staff-space"));
+
+  return robust_scm2double (me->get_property ("staff-space"), 1.0) * ss;
 }
 
 Real
@@ -279,7 +289,7 @@ MAKE_SCHEME_CALLBACK (Staff_symbol, height, 1);
 SCM
 Staff_symbol::height (SCM smob)
 {
-  Grob *me = Grob::unsmob (smob);
+  Grob *me = unsmob<Grob> (smob);
   Real t = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
   t *= robust_scm2double (me->get_property ("thickness"), 1.0);
 
@@ -306,34 +316,9 @@ Staff_symbol::height (SCM smob)
 bool
 Staff_symbol::on_line (Grob *me, int pos, bool allow_ledger)
 {
-  SCM line_positions = me->get_property ("line-positions");
-  if (scm_is_pair (line_positions))
-    {
-      Real min_line = HUGE_VAL;
-      Real max_line = -HUGE_VAL;
-      for (SCM s = line_positions; scm_is_pair (s); s = scm_cdr (s))
-        {
-          Real current_line = scm_to_double (scm_car (s));
-          if (pos == current_line)
-            return true;
-          if (current_line > max_line)
-            max_line = current_line;
-          if (current_line < min_line)
-            min_line = current_line;
-
-        }
-
-      if (allow_ledger)
-        {
-          if (pos < min_line)
-            return (( (int) (rint (pos - min_line)) % 2) == 0);
-          if (pos > max_line)
-            return (( (int) (rint (pos - max_line)) % 2) == 0);
-        }
-
-      return false;
-    }
-  else
+  // standard staff lines (any line count) and standard ledger lines
+  if (!scm_is_pair (me->get_property ("line-positions"))
+      && !scm_is_pair (me->get_property ("ledger-positions")))
     {
       int const line_cnt = line_count (me);
       bool result = abs (pos + line_cnt) % 2 == 1;
@@ -343,6 +328,34 @@ Staff_symbol::on_line (Grob *me, int pos, bool allow_ledger)
         }
       return result;
     }
+
+  // staff lines (custom or standard)
+  vector<Real> lines = Staff_symbol::line_positions (me);
+  for (vector<Real>::const_iterator i = lines.begin (),
+       e = lines.end ();
+       i != e;
+       ++i)
+    {
+      if (pos == *i)
+        return true;
+    }
+
+  // ledger lines (custom or standard)
+  if (allow_ledger)
+    {
+      vector<Real> ledgers = Staff_symbol::ledger_positions (me, pos);
+      if (ledgers.empty ())
+        return false;
+      for (vector<Real>::const_iterator i = ledgers.begin (),
+           e = ledgers.end ();
+           i != e;
+           ++i)
+        {
+          if (pos == *i)
+            return true;
+        }
+    }
+  return false;
 }
 
 Interval
@@ -372,6 +385,7 @@ ADD_INTERFACE (Staff_symbol,
                " @code{width} property.",
 
                /* properties */
+               "break-align-symbols "
                "ledger-extra "
                "ledger-line-thickness "
                "ledger-positions "