]> git.donarmstrong.com Git - lilypond.git/commitdiff
calc skyline properties for separation items.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 29 Nov 2006 20:32:59 +0000 (21:32 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Wed, 29 Nov 2006 20:32:59 +0000 (21:32 +0100)
lily/include/separation-item.hh
lily/separation-item.cc

index c5d7c7106ac0b4aab0f121383559f887f6f69af9..1c2ae7ef95790e594cad83af550d628fdf41f410 100644 (file)
@@ -16,6 +16,9 @@
 struct Separation_item
 {
   DECLARE_GROB_INTERFACE();
+  DECLARE_SCHEME_CALLBACK(calc_skylines, (SCM));
+
+  static vector<Box> boxes (Grob *me);
   static Interval conditional_width (Grob *, Grob *);
   static Interval width (Grob *);
   static Interval relative_width (Grob *, Grob *);
index c9d673979985188596e783a617f44d8771e7848c..535edcac6704458a5cde0eb11a5fe0b1790fc4cf 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "separation-item.hh"
 
+#include "skyline.hh"
 #include "paper-column.hh"
 #include "warn.hh"
 #include "pointer-group-interface.hh"
@@ -62,6 +63,58 @@ Separation_item::conditional_width (Grob *me, Grob *left)
   return w;
 }
 
+
+MAKE_SCHEME_CALLBACK(Separation_item,calc_skylines,1);
+SCM
+Separation_item::calc_skylines (SCM smob)
+{
+  Item *me = unsmob_item (smob);
+  SCM lines = scm_cons (SCM_BOOL_F,SCM_BOOL_F);
+
+  Direction d = LEFT;
+  do
+    {
+      Skyline l (boxes (me), X_AXIS, d);
+      index_set_cell (lines, d, ly_offsets2scm (l.to_points ()));
+    }
+  while (flip (&d) != LEFT);
+
+  return lines;
+}
+
+
+vector<Box>
+Separation_item::boxes (Grob *me)
+{
+  Item *item = dynamic_cast<Item *> (me);
+
+  int very_large = INT_MAX;
+  Paper_column *pc = item->get_column ();
+  vector<Box> out;
+  extract_grob_set (me, "elements", elts);
+
+  Grob *ycommon = common_refpoint_of_array (elts, me, Y_AXIS);
+  
+  for (vsize i = 0; i < elts.size (); i++)
+    {
+      Item *il = dynamic_cast<Item *> (elts[i]);
+      if (pc != il->get_column ())
+       {
+         continue;
+       }
+
+      if (to_boolean (il->get_property ("no-spacing-rods")))
+       continue;
+
+      Box b (il->extent (pc, X_AXIS),
+            il->pure_height (ycommon, 0, very_large));
+
+      out.push_back (b);
+    }
+
+  return out;      
+}
+
 Interval
 Separation_item::width (Grob *me)
 {