]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/item.cc
Merge branch 'jneeman' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond into jneeman
[lilypond.git] / lily / item.cc
index 922faf0abd2041d62a85fcfc707eda5ed990d91f..173df20ed87fd7b19451d2f4b212ea9c0dc18eea 100644 (file)
@@ -3,11 +3,12 @@
 
   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"
@@ -37,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 *
@@ -73,7 +71,7 @@ Item::copy_breakable_items ()
     {
       Grob *dolly = clone (count++);
       Item *item = dynamic_cast<Item *> (dolly);
-      pscore_->root_system ()->typeset_grob (item);
+      get_root_system (this)->typeset_grob (item);
       new_copies[i] = item;
     }
   while (flip (&i) != LEFT);
@@ -96,7 +94,7 @@ Item::discretionary_processing ()
   if (is_broken ())
     return;
 
-  if (Item::is_breakable (this))
+  if (Item::is_non_musical (this))
     copy_breakable_items ();
 }
 
@@ -130,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;
     }
@@ -152,21 +150,44 @@ Item::handle_prebroken_dependencies ()
   SCM vis = get_property ("break-visibility");
   if (scm_is_vector (vis))
     {
-      bool visible = to_boolean (scm_vector_ref (vis,  scm_from_int (break_status_dir () + 1)));
+      bool visible = to_boolean (scm_c_vector_ref (vis, break_status_dir () + 1));
 
       if (!visible)
        suicide ();
     }
 }
 
-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 *
@@ -176,9 +197,7 @@ unsmob_item (SCM s)
 }
 
 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"
@@ -209,5 +228,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")