]> git.donarmstrong.com Git - lilypond.git/commitdiff
time signature positioning for non-standard staves
authorBenkő Pál <benko.pal@gmail.com>
Thu, 19 Jul 2012 21:07:57 +0000 (23:07 +0200)
committerBenkő Pál <benko.pal@gmail.com>
Thu, 9 Aug 2012 19:42:10 +0000 (21:42 +0200)
the only non-standardness the old code catered for is altered line-count.
the aim here is to position time signature similarly with any of the following:
\override StaffSymbol #'line-count = #'4
\override StaffSymbol #'line-positions = #'(-2 0 2 4)
\override StaffSymbol #'line-positions = #'(-4 -2 0 2)

lily/time-signature.cc

index ad553e4229268800e94763b3d81de959213272c2..082b62a93c0f45bd0d7f786fd4808e22dde1496b 100644 (file)
@@ -23,6 +23,7 @@
 #include "font-interface.hh"
 #include "international.hh"
 #include "output-def.hh"
+#include "staff-symbol.hh"
 #include "staff-symbol-referencer.hh"
 #include "text-interface.hh"
 #include "warn.hh"
@@ -57,8 +58,35 @@ Time_signature::print (SCM smob)
   else
     m = numbered_time_signature (me, n, d);
 
-  if (Staff_symbol_referencer::line_count (me) % 2 == 0)
-    m.translate_axis (Staff_symbol_referencer::staff_space (me) / 2, Y_AXIS);
+  /*
+    position the signature centred on the staff line
+    nearest to the middle of the staff
+  */
+  if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
+    {
+      std::vector<Real> const linepos = Staff_symbol::line_positions (staff);
+      if (!linepos.empty ())
+        {
+          Interval const span = Staff_symbol::line_span (staff);
+          Real const mid = span.center ();
+          Real pos = linepos.front ();
+          Real dist = fabs (pos - mid);
+          for (std::vector<Real>::const_iterator
+                 i = linepos.begin (), e = linepos.end ();
+               ++i != e;)
+            {
+              double const d = fabs (*i - mid);
+              if (d < dist)
+                {
+                  pos = *i;
+                  dist = d;
+                }
+            }
+
+          m.translate_axis
+            (pos * Staff_symbol_referencer::staff_space (me) / 2, Y_AXIS);
+        }
+    }
 
   return m.smobbed_copy ();
 }