]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/item.cc
(replace_whitespace): UTF-8 characters are up to 4 bytes long.
[lilypond.git] / lily / item.cc
index ff00630b5f8a739cc7719caf5ee87d84c29781f0..fdf9b00ce9d36c1498076dc221e6ab01f992be61 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "item.hh"
 #include "system.hh"
 #include "pointer-group-interface.hh"
 
+#include "moment.hh"
+
+
 Grob *
-Item::clone (int count) const
+Item::clone () const
 {
-  return new Item (*this, count);
+  return new Item (*this);
 }
 
-Item::Item (SCM s, Object_key const *key)
-  : Grob (s, key)
+Item::Item (SCM s)
+  : Grob (s)
 {
   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
+  cached_pure_height_valid_ = false;
 }
 
 /**
    Item copy ctor.  Copy nothing: everything should be a elt property
    or a special purpose pointer (such as broken_to_drul_[]) */
-Item::Item (Item const &s, int copy_count)
-  : Grob (s, copy_count)
+Item::Item (Item const &s)
+  : Grob (s)
 {
   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
+  cached_pure_height_valid_ = false;
 }
 
 bool
@@ -66,10 +71,9 @@ Item::copy_breakable_items ()
 {
   Drul_array<Item *> new_copies;
   Direction i = LEFT;
-  int count = 0;
   do
     {
-      Grob *dolly = clone (count++);
+      Grob *dolly = clone ();
       Item *item = dynamic_cast<Item *> (dolly);
       get_root_system (this)->typeset_grob (item);
       new_copies[i] = item;
@@ -147,14 +151,18 @@ Item::handle_prebroken_dependencies ()
     Can't do this earlier, because try_visibility_lambda () might set
     the elt property transparent, which would then be copied.
   */
-  SCM vis = get_property ("break-visibility");
-  if (scm_is_vector (vis))
-    {
-      bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1));
+  if (!Item::break_visible (this))
+    suicide ();
+}
 
-      if (!visible)
-       suicide ();
-    }
+bool
+Item::break_visible (Grob *g)
+{
+  Item *it = dynamic_cast<Item*> (g);
+  SCM vis = g->get_property ("break-visibility");
+  if (scm_is_vector (vis))
+    return to_boolean (scm_c_vector_ref (vis, it->break_status_dir () + 1));
+  return true;
 }
 
 bool
@@ -175,12 +183,39 @@ Item::pure_is_visible (int start, int end) const
 }
 
 Interval_t<int>
-Item::spanned_rank_iv ()
+Item::spanned_rank_interval () const
 {
   int c = get_column ()->get_rank ();
   return Interval_t<int> (c, c);
 }
 
+Interval_t<Moment>
+spanned_time_interval (Item *l, Item *r) 
+{
+  Drul_array<Item*> bounds (l, r);
+  Interval_t<Moment> iv;
+
+  Direction d = LEFT;
+  do
+    {
+      if (bounds[d] && bounds[d]->get_column ())
+       iv[d] = robust_scm2moment (bounds[d]->get_column ()->get_property ("when"),
+                                 iv[d]);
+    }
+  while (flip (&d) != LEFT);
+
+  do
+    {
+      if (!bounds[d] || !bounds[d]->get_column ())
+       iv[d] = iv[-d];
+    }
+  while (flip (&d) != LEFT);
+  
+  
+  return iv;
+}
+
+
 void
 Item::derived_mark () const
 {
@@ -196,10 +231,25 @@ unsmob_item (SCM s)
   return dynamic_cast<Item *> (unsmob_grob (s));
 }
 
+Interval
+Item::pure_height (Grob *g, int start, int end)
+{
+  if (cached_pure_height_valid_)
+    return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
+
+  cached_pure_height_ = Grob::pure_height (this, start, end);
+  cached_pure_height_valid_ = true;
+  return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
+}
+
+bool
+Item::less (Grob * const &g1, Grob * const &g2)
+{
+  return dynamic_cast<Item*> (g1)->get_column ()->get_rank () < dynamic_cast<Item*> (g2)->get_column ()->get_rank ();
+}
+
 ADD_INTERFACE (Item,
-              "item-interface",
-              "\n"
-              "\n"
+
               "Grobs can be distinguished in their role in the horizontal spacing.\n"
               "Many grobs define constraints on the spacing by their sizes. For\n"
               "example, note heads, clefs, stems, and all other symbols with a fixed\n"
@@ -235,5 +285,6 @@ ADD_INTERFACE (Item,
 
               /* properties */
               "break-visibility "
-              "no-spacing-rods "
+              "extra-spacing-width "
+              "infinite-spacing-height "
               "non-musical")