]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/item.cc
Merge branch 'cvs-head' of http://lilypond.org/vc/lilypond into master-hanwen
[lilypond.git] / lily / item.cc
index 369d4f5178849b53fc00673d6ce15216fbf751ed..ff00630b5f8a739cc7719caf5ee87d84c29781f0 100644 (file)
@@ -3,17 +3,18 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "item.hh"
 
+#include "axis-group-interface.hh"
 #include "paper-score.hh"
 #include "warn.hh"
 #include "paper-column.hh"
 #include "lily-guile.hh"
 #include "system.hh"
-#include "group-interface.hh"
+#include "pointer-group-interface.hh"
 
 Grob *
 Item::clone (int count) const
@@ -25,7 +26,6 @@ Item::Item (SCM s, Object_key const *key)
   : Grob (s, key)
 {
   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
-  Group_interface::add_thing (this, ly_symbol2scm ("interfaces"), ly_symbol2scm ("item-interface"));
 }
 
 /**
@@ -38,16 +38,13 @@ Item::Item (Item const &s, int copy_count)
 }
 
 bool
-Item::is_breakable (Grob *me)
+Item::is_non_musical (Grob *me)
 {
-  if (me->original_)
+  if (me->original ())
     return false;
 
-  if (!dynamic_cast<Item *> (me))
-    me->programming_error ("only items can be breakable.");
-
   Item *i = dynamic_cast<Item *> (me->get_parent (X_AXIS));
-  return (i) ? Item::is_breakable (i) : to_boolean (me->get_property ("breakable"));
+  return i ? Item::is_non_musical (i) : to_boolean (me->get_property ("non-musical"));
 }
 
 Paper_column *
@@ -74,7 +71,7 @@ Item::copy_breakable_items ()
     {
       Grob *dolly = clone (count++);
       Item *item = dynamic_cast<Item *> (dolly);
-      pscore_->system_->typeset_grob (item);
+      get_root_system (this)->typeset_grob (item);
       new_copies[i] = item;
     }
   while (flip (&i) != LEFT);
@@ -97,7 +94,7 @@ Item::discretionary_processing ()
   if (is_broken ())
     return;
 
-  if (Item::is_breakable (this))
+  if (Item::is_non_musical (this))
     copy_breakable_items ();
 }
 
@@ -131,9 +128,9 @@ Item::find_prebroken_piece (Direction d) const
 Direction
 Item::break_status_dir () const
 {
-  if (original_)
+  if (original ())
     {
-      Item *i = dynamic_cast<Item *> (original_);
+      Item *i = dynamic_cast<Item *> (original ());
 
       return (i->broken_to_drul_[LEFT] == this) ? LEFT : RIGHT;
     }
@@ -149,40 +146,48 @@ Item::handle_prebroken_dependencies ()
   /*
     Can't do this earlier, because try_visibility_lambda () might set
     the elt property transparent, which would then be copied.
-
-    TODO:
-
-    give the item to break-visibility itself, so the function can do
-    more complicated things.
   */
   SCM vis = get_property ("break-visibility");
-  if (ly_c_procedure_p (vis))
+  if (scm_is_vector (vis))
     {
-      SCM args = scm_list_n (scm_int2num (break_status_dir ()), SCM_UNDEFINED);
-      SCM result = scm_apply_0 (vis, args);
-      bool trans = ly_scm2bool (scm_car (result));
-      bool empty = ly_scm2bool (scm_cdr (result));
+      bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1));
 
-      if (empty && trans)
+      if (!visible)
        suicide ();
-      else if (empty)
-       {
-         set_extent (SCM_EOL, X_AXIS);
-         set_extent (SCM_EOL, Y_AXIS);
-       }
-      else if (trans)
-       set_property ("print-function", SCM_EOL);
     }
 }
 
-SCM
-Item::do_derived_mark () const
+bool
+Item::pure_is_visible (int start, int end) const
+{
+  SCM vis = get_property ("break-visibility");
+  if (scm_is_vector (vis))
+    {
+      int pos = 1;
+      int pc_rank = Paper_column::get_rank (get_column ());
+      if (pc_rank == start)
+       pos = 2;
+      else if (pc_rank == end)
+       pos = 0;
+      return to_boolean (scm_vector_ref (vis, scm_from_int (pos)));
+    }
+  return true;
+}
+
+Interval_t<int>
+Item::spanned_rank_iv ()
+{
+  int c = get_column ()->get_rank ();
+  return Interval_t<int> (c, c);
+}
+
+void
+Item::derived_mark () const
 {
   if (broken_to_drul_[LEFT])
     scm_gc_mark (broken_to_drul_[LEFT]->self_scm ());
   if (broken_to_drul_[RIGHT])
     scm_gc_mark (broken_to_drul_[RIGHT]->self_scm ());
-  return SCM_EOL;
 }
 
 Item *
@@ -225,5 +230,10 @@ ADD_INTERFACE (Item,
               "  all-visible                yes     yes    yes\n"
               "  begin-of-line-invisible    yes     yes    no\n"
               "  end-of-line-invisible      no      yes    yes\n"
+              "  center-invisible           yes      no    yes\n"
               "@end example\n",
-              "no-spacing-rods break-visibility breakable")
+
+              /* properties */
+              "break-visibility "
+              "no-spacing-rods "
+              "non-musical")