]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/item.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / item.cc
index e94b5bc26762862fd4e38a8a4406bfc5c590b690..f4760eb2fd564bdb5d4555fa7592520a2e7fd679 100644 (file)
@@ -3,7 +3,7 @@
 
   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"
@@ -13,7 +13,7 @@
 #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
@@ -24,8 +24,7 @@ Item::clone (int count) const
 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"));
+  broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] = 0;
 }
 
 /**
@@ -38,16 +37,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,10 +70,11 @@ 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);
+
   broken_to_drul_ = new_copies;
 }
 
@@ -96,7 +93,7 @@ Item::discretionary_processing ()
   if (is_broken ())
     return;
 
-  if (Item::is_breakable (this))
+  if (Item::is_non_musical (this))
     copy_breakable_items ();
 }
 
@@ -130,9 +127,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;
     }
@@ -148,40 +145,24 @@ 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_vector_ref (vis, scm_from_int (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
+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 *
@@ -224,5 +205,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")