]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/span-bar.cc
(get_header): copy module, instead of
[lilypond.git] / lily / span-bar.cc
index 548961d8efe7e398ce09787c7fc47d12cdd9072d..9a3312daa0f490cfd5c1cce4b5bd5368b3285d5b 100644 (file)
@@ -15,6 +15,8 @@
 #include "warn.hh"
 #include "axis-group-interface.hh"
 #include "bar-line.hh"
+#include "grob.hh"
+#include "pointer-group-interface.hh"
 
 void
 Span_bar::add_bar (Grob *me, Grob *b)
@@ -28,7 +30,7 @@ MAKE_SCHEME_CALLBACK (Span_bar, print, 1);
 
 /* Limitations/Bugs:
 
-(1) Elements from 'me->get_property ("elements")' must be
+(1) Elements from 'me->get_object ("elements")' must be
 ordered according to their y coordinates relative to their common
 axis group parent.  Otherwise, the computation goes mad.
 
@@ -43,9 +45,9 @@ SCM
 Span_bar::print (SCM smobbed_me)
 {
   Grob *me = unsmob_grob (smobbed_me);
-  SCM elements = me->get_property ("elements");
+  extract_grob_set (me, "elements", elements);
+  Grob *refp = common_refpoint_of_array (elements, me, Y_AXIS);
 
-  Grob *refp = common_refpoint_of_list (elements, me, Y_AXIS);
   Span_bar::evaluate_glyph (me);
   SCM glyph = me->get_property ("glyph");
 
@@ -59,9 +61,9 @@ Span_bar::print (SCM smobbed_me)
   /* compose span_bar_mol */
   Array<Interval> extents;
   Grob *model_bar = 0;
-  for (SCM elts = elements; scm_is_pair (elts); elts = scm_cdr (elts))
+  for (int i = elements.size (); i--;)
     {
-      Grob *bar = unsmob_grob (scm_car (elts));
+      Grob *bar = elements[i];
       Interval ext = bar->extent (refp, Y_AXIS);
       if (ext.is_empty ())
        continue;
@@ -72,14 +74,14 @@ Span_bar::print (SCM smobbed_me)
 
   if (!model_bar)
     model_bar = me;
-  
+
   extents.sort (&Interval::left_comparison);
 
   Stencil span_bar;
-  for (int i = 1; i < extents.size (); i ++)
+  for (int i = 1; i < extents.size (); i++)
     {
-      Interval prev_extent = extents[i-1];
-      Interval ext = extents[i]; 
+      Interval prev_extent = extents[i - 1];
+      Interval ext = extents[i];
       if (!prev_extent.is_empty ())
        {
          Interval l (prev_extent [UP],
@@ -103,7 +105,7 @@ Span_bar::print (SCM smobbed_me)
     }
 
   span_bar.translate_axis (- me->relative_coordinate (refp, Y_AXIS),
-                              Y_AXIS);
+                          Y_AXIS);
 
   return span_bar.smobbed_copy ();
 }
@@ -115,7 +117,7 @@ Span_bar::width_callback (SCM element_smob, SCM scm_axis)
   Grob *se = unsmob_grob (element_smob);
   (void) scm_axis;
 
-  assert ( (Axis) scm_to_int (scm_axis) == X_AXIS);
+  assert ((Axis) scm_to_int (scm_axis) == X_AXIS);
   String gl = ly_scm2string (se->get_property ("glyph"));
 
   /*
@@ -156,10 +158,10 @@ Span_bar::center_on_spanned_callback (SCM element_smob, SCM axis)
   if (i.is_empty ())
     {
       me->suicide ();
-      return scm_make_real (0.0);
+      return scm_from_double (0.0);
     }
 
-  return scm_make_real (i.center ());
+  return scm_from_double (i.center ());
 }
 
 void
@@ -168,10 +170,10 @@ Span_bar::evaluate_empty (Grob *me)
   /* TODO: filter all hara-kiried out of ELEMENS list, and then
      optionally do suicide. Call this cleanage function from
      center_on_spanned_callback () as well. */
-  if (!scm_is_pair (me->get_property ("elements")))
-    {
-      me->suicide ();
-    }
+
+  extract_grob_set (me, "elements", elements);
+  if (elements.is_empty ())
+    me->suicide ();
 }
 
 void
@@ -182,12 +184,10 @@ Span_bar::evaluate_glyph (Grob *me)
   if (scm_is_string (gl))
     return;
 
-  for (SCM s = me->get_property ("elements");
-       !scm_is_string (gl) && scm_is_pair (s); s = scm_cdr (s))
-    {
-      gl = unsmob_grob (scm_car (s))
-       ->get_property ("glyph");
-    }
+  extract_grob_set (me, "elements", elements);
+  for (int i = elements.size ();
+       i-- && !scm_is_string (gl);)
+    gl = elements[i]->get_property ("glyph");
 
   if (!scm_is_string (gl))
     {
@@ -197,17 +197,11 @@ Span_bar::evaluate_glyph (Grob *me)
 
   String type = ly_scm2string (gl);
   if (type == "|:")
-    {
-      type = ".|";
-    }
+    type = ".|";
   else if (type == ":|")
-    {
-      type = "|.";
-    }
+    type = "|.";
   else if (type == ":|:")
-    {
-      type = ".|.";
-    }
+    type = ".|.";
 
   gl = scm_makfrom0str (type.to_str0 ());
   if (scm_equal_p (me->get_property ("glyph"), gl)
@@ -219,7 +213,7 @@ Interval
 Span_bar::get_spanned_interval (Grob *me)
 {
   return ly_scm2interval (Axis_group_interface::group_extent_callback
-                         (me->self_scm (), scm_int2num (Y_AXIS)));
+                         (me->self_scm (), scm_from_int (Y_AXIS)));
 }
 
 MAKE_SCHEME_CALLBACK (Span_bar, get_bar_size, 1);
@@ -232,9 +226,9 @@ Span_bar::get_bar_size (SCM smob)
     {
       /* This happens if the bars are hara-kiried from under us. */
       me->suicide ();
-      return scm_make_real (-1);
+      return scm_from_double (-1);
     }
-  return scm_make_real (iv.length ());
+  return scm_from_double (iv.length ());
 }
 
 ADD_INTERFACE (Span_bar, "span-bar-interface",