]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/cluster.cc
* lily/lexer.ll: change is_string -> ly_c_string_p
[lilypond.git] / lily / cluster.cc
index d1794a908a3def988adb07d38fea6f6bbaf9b44d..6dfea67e99d0c7a980a61df8611d6ea1811dc02a 100644 (file)
@@ -32,24 +32,24 @@ brew_cluster_piece (Grob *me, Array<Offset> bottom_points, Array<Offset> top_poi
 {
   Real blotdiameter = Staff_symbol_referencer::staff_space (me)/2;
 
-  Real padding =robust_scm2double ( me->get_grob_property ("padding"), 0.0);
+  Real padding =robust_scm2double ( me->get_property ("padding"), 0.0);
 
   Offset vpadding = Offset (0, padding);
   Offset hpadding = Offset (0.5 * blotdiameter, 0);
   Offset hvpadding = 0.5 * hpadding + vpadding;
 
-  SCM shape_scm = me->get_grob_property ("style");
+  SCM shape_scm = me->get_property ("style");
   String shape;
 
-  if (gh_symbol_p (shape_scm))
+  if (is_symbol (shape_scm))
     {
       shape = ly_symbol2string (shape_scm);
     }
   else
     {
       programming_error ("#'style should be symbol.");
-      me->suicide();
-      return  Stencil();
+      me->suicide ();
+      return  Stencil ();
     }
 
 
@@ -63,7 +63,7 @@ brew_cluster_piece (Grob *me, Array<Offset> bottom_points, Array<Offset> top_poi
        {
          Box box;
          box.add_point (bottom_points[i] - hvpadding);
-         box.add_point (Offset(top_points[i + 1][X_AXIS],
+         box.add_point (Offset (top_points[i + 1][X_AXIS],
                                top_points[i][Y_AXIS]) + hvpadding);
          out.add_stencil (Lookup::round_filled_box (box, blotdiameter));
        }
@@ -73,7 +73,7 @@ brew_cluster_piece (Grob *me, Array<Offset> bottom_points, Array<Offset> top_poi
       for (int i = 0; i < size - 1; i++)
        {
          Box box;
-         box.add_point (Offset(bottom_points[i][X_AXIS],
+         box.add_point (Offset (bottom_points[i][X_AXIS],
                                bottom_points[i + 1][Y_AXIS]) - hvpadding);
          box.add_point (top_points[i + 1] + hvpadding);
          out.add_stencil (Lookup::round_filled_box (box, blotdiameter));
@@ -134,51 +134,45 @@ Cluster::print (SCM smob)
   Spanner *spanner = dynamic_cast<Spanner*> (me);
   if (!spanner)
     {
-      me->programming_error ("Cluster::print(): not a spanner");
+      me->programming_error ("Cluster::print (): not a spanner");
       return SCM_EOL;
     }
 
   Item *left_bound = spanner->get_bound (LEFT);
   Item *right_bound = spanner->get_bound (RIGHT);
 
-  Grob *common = left_bound->common_refpoint (right_bound, X_AXIS);
-  SCM cols  =me->get_grob_property ("columns");
+  Grob *commonx = left_bound->common_refpoint (right_bound, X_AXIS);
+  SCM cols  =me->get_property ("columns");
 
-  if (!gh_pair_p (cols))
+  if (!ly_c_pair_p (cols))
     {
       me->warning ("junking empty cluster");
       me->suicide ();
       
       return SCM_EOL;
     }
-  common = common_refpoint_of_list (cols, common, X_AXIS);
+  
+  commonx = common_refpoint_of_list (cols, commonx, X_AXIS);
+  Grob * commony = common_refpoint_of_list (cols, me, Y_AXIS);
   Array<Offset> bottom_points;
   Array<Offset> top_points;
 
 
-  Real left_coord = left_bound->relative_coordinate (common, X_AXIS);
-
-  Real unit = Staff_symbol_referencer::staff_space (me) *0.5;
+  Real left_coord = left_bound->relative_coordinate (commonx, X_AXIS);
 
   /*
     TODO: should we move the cluster a little to the right to be in
     line with the center of the note heads?
     
    */
-  for (SCM s = cols; gh_pair_p (s); s = ly_cdr (s))
+  for (SCM s = cols; ly_c_pair_p (s); s = ly_cdr (s))
     {
       Grob * col = unsmob_grob (ly_car (s));
+      Interval yext = col->extent (commony, Y_AXIS);
 
-      SCM posns = col->get_grob_property ("positions");
-      
-      Slice s (0,0);
-      if (is_number_pair (posns))
-       s = Slice (gh_scm2int (gh_car (posns)),
-                  gh_scm2int (gh_cdr (posns)));
-
-      Real x = col->relative_coordinate (common, X_AXIS) - left_coord;
-      bottom_points.push (Offset (x, s[DOWN] *unit));
-      top_points.push (Offset (x, s[UP] * unit));
+      Real x = col->relative_coordinate (commonx, X_AXIS) - left_coord;
+      bottom_points.push (Offset (x, yext[DOWN]));
+      top_points.push (Offset (x, yext[UP]));
     }
 
   /*
@@ -188,24 +182,20 @@ Cluster::print (SCM smob)
     {
       Spanner *orig = dynamic_cast<Spanner*> (spanner->original_);
       
-      if (spanner->get_break_index () < orig->broken_intos_.size()-1)
+      if (spanner->get_break_index () < orig->broken_intos_.size ()-1)
        {
          Spanner * next = orig->broken_intos_[spanner->get_break_index () + 1];
-         SCM cols = next->get_grob_property ("columns");
-         if (gh_pair_p (cols))
+         SCM cols = next->get_property ("columns");
+         if (ly_c_pair_p (cols))
            {
+             Grob *next_commony = common_refpoint_of_list (cols, next, Y_AXIS);
              Grob * col = unsmob_grob (ly_car (scm_last_pair (cols)));
-             SCM posns = col->get_grob_property ("positions");
-      
-             Slice s (0,0);
-             if (is_number_pair (posns))
-               s = Slice (gh_scm2int (gh_car (posns)),
-                          gh_scm2int (gh_cdr (posns)));
 
-             Real x = right_bound->relative_coordinate (common,X_AXIS) - left_coord;
+             Interval v = col->extent (next_commony, Y_AXIS);
+             Real x = right_bound->relative_coordinate (commonx, X_AXIS) - left_coord;
              
-             bottom_points.insert (Offset (x, s[DOWN] * unit),0);
-             top_points.insert (Offset (x, s[UP] * unit),0);
+             bottom_points.insert (Offset (x, v[DOWN]),0);
+             top_points.insert (Offset (x, v[UP]),0);
            }
        }
     }
@@ -214,6 +204,7 @@ Cluster::print (SCM smob)
   top_points.reverse ();
 
   Stencil out = brew_cluster_piece (me, bottom_points, top_points);
+  out.translate_axis (- me->relative_coordinate (commony, Y_AXIS), Y_AXIS);
   return out.smobbed_copy ();
 }
 
@@ -227,3 +218,30 @@ ADD_INTERFACE (Cluster,"cluster-interface",
               "and @code{ramp}.\n"
 ,
   "style padding columns");
+
+
+
+struct Cluster_beacon
+{
+public:
+  DECLARE_SCHEME_CALLBACK (height, (SCM, SCM));
+  static bool has_interface (Grob *);
+};
+
+MAKE_SCHEME_CALLBACK (Cluster_beacon,height,2);
+SCM
+Cluster_beacon::height (SCM g, SCM)
+{
+  Grob *me = unsmob_grob (g);
+  Interval v = robust_scm2interval (me->get_property ("positions"),
+                                   Interval (0,0));
+  return ly_interval2scm (Staff_symbol_referencer::staff_space (me) * 0.5 * v);
+}
+
+
+
+ADD_INTERFACE(Cluster_beacon,
+             "cluster-beacon-interface",
+             "A place holder for the cluster spanner to determine the vertical "
+             "extents of a cluster spanner at this X position.",
+             "positions");