]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/item.cc
Release: bump Welcome versions.
[lilypond.git] / lily / item.cc
index 4e9818192aad73b851129f72d5a70194d67a8797..f90b29d30a78445c0789de622aadd1275d916ca3 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1997--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -43,7 +43,7 @@ Item::Item (SCM s)
 }
 
 /**
-   Item copy ctor.  Copy nothing: everything should be a elt property
+   Item copy ctor.  Copy nothing: everything should be an elt property
    or a special purpose pointer (such as broken_to_drul_[]) */
 Item::Item (Item const &s)
   : Grob (s)
@@ -55,9 +55,6 @@ Item::Item (Item const &s)
 bool
 Item::is_non_musical (Grob *me)
 {
-  if (me->original ())
-    return false;
-
   Item *i = dynamic_cast<Item *> (me->get_parent (X_AXIS));
   return i ? Item::is_non_musical (i) : to_boolean (me->get_property ("non-musical"));
 }
@@ -80,15 +77,13 @@ void
 Item::copy_breakable_items ()
 {
   Drul_array<Item *> new_copies;
-  Direction i = LEFT;
-  do
+  for (LEFT_and_RIGHT (d))
     {
       Grob *dolly = clone ();
       Item *item = dynamic_cast<Item *> (dolly);
       get_root_system (this)->typeset_grob (item);
-      new_copies[i] = item;
+      new_copies[d] = item;
     }
-  while (flip (&i) != LEFT);
 
   broken_to_drul_ = new_copies;
 }
@@ -105,7 +100,7 @@ Item::is_broken () const
 void
 Item::discretionary_processing ()
 {
-  if (is_broken ())
+  if (is_broken () || original ())
     return;
 
   if (Item::is_non_musical (this))
@@ -118,14 +113,12 @@ Item::find_broken_piece (System *l) const
   if (get_system () == l)
     return (Item *) (this);
 
-  Direction d = LEFT;
-  do
+  for (LEFT_and_RIGHT (d))
     {
       Grob *s = broken_to_drul_[d];
       if (s && s->get_system () == l)
         return s;
     }
-  while (flip (&d) != LEFT);
 
   return 0;
 }
@@ -205,21 +198,18 @@ spanned_time_interval (Item *l, Item *r)
   Drul_array<Item *> bounds (l, r);
   Interval_t<Moment> iv;
 
-  Direction d = LEFT;
-  do
+  for (LEFT_and_RIGHT (d))
     {
       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
+  for (LEFT_and_RIGHT (d))
     {
       if (!bounds[d] || !bounds[d]->get_column ())
         iv[d] = iv[-d];
     }
-  while (flip (&d) != LEFT);
 
   return iv;
 }
@@ -233,23 +223,26 @@ Item::derived_mark () const
     scm_gc_mark (broken_to_drul_[RIGHT]->self_scm ());
 }
 
-Item *
-unsmob_item (SCM s)
-{
-  return dynamic_cast<Item *> (unsmob_grob (s));
-}
-
 Interval
-Item::pure_height (Grob *g, int start, int end)
+Item::pure_y_extent (Grob *g, int start, int end)
 {
   if (cached_pure_height_valid_)
     return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
+  /* Note: cached_pure_height_ does not notice if start changes, implicitly
+     assuming that Items' pure_heights do not depend on 'start' or 'end'.
+  */
 
-  cached_pure_height_ = Grob::pure_height (this, start, end);
-  cached_pure_height_valid_ = true;
+  cache_pure_height (Grob::pure_y_extent (this, start, end));
   return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
 }
 
+void
+Item::cache_pure_height (Interval height)
+{
+  cached_pure_height_ = height;
+  cached_pure_height_valid_ = true;
+}
+
 ADD_INTERFACE (Item,
                "Grobs can be distinguished in their role in the horizontal"
                " spacing.  Many grobs define constraints on the spacing by"
@@ -270,7 +263,7 @@ ADD_INTERFACE (Item,
                "Whether these versions are visible and take up space is"
                " determined by the outcome of the @code{break-visibility}"
                " grob property, which is a function taking a direction"
-               " (@code{-1}, @code{0} or@tie{}@code{1}) as an argument.  It"
+               " (@w{@code{-1}}, @code{0} or@tie{}@code{1}) as an argument.  It"
                " returns a cons of booleans, signifying whether this grob"
                " should be transparent and have no extent.\n"
                "\n"