]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grob.cc
Fix 1240.
[lilypond.git] / lily / grob.cc
index b27350b92996e694a9acffe8ff94cbb2513a8e86..aa9c1d40f4bee450f9d2940d530719db68b3d986 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1997--2010 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
@@ -123,7 +123,9 @@ Grob::get_print_stencil () const
   if (Stencil *m = unsmob_stencil (stil))
     {
       retval = *m;
-      if (to_boolean (get_property ("transparent")))
+      bool transparent = to_boolean (get_property ("transparent"));
+
+      if (transparent)
        retval = Stencil (m->extent_box (), SCM_EOL);
       else
        {
@@ -156,7 +158,8 @@ Grob::get_print_stencil () const
        }
 
       /* process whiteout */
-      if (to_boolean (get_property ("whiteout")))
+      /* a grob has to be visible, otherwise the whiteout property has no effect */
+      if (!transparent && to_boolean (get_property ("whiteout")))
         {
           /* Call the scheme procedure stencil-whiteout in scm/stencils.scm */
           /* to add a round-filled-box stencil to the stencil list */
@@ -188,6 +191,16 @@ Grob::get_system () const
   return 0;
 }
 
+/* This version of get_system is more reliable than this->get_system ()
+   before line-breaking has been done, at which point there is only
+   one system in the whole score and we can find it just by following
+   parent pointers. */
+System *
+Grob::get_system(Grob *me)
+{
+  Grob *p = me->get_parent (X_AXIS);
+  return p ? get_system (p) : dynamic_cast<System *>(me);
+}
 
 void
 Grob::handle_broken_dependencies ()
@@ -448,10 +461,7 @@ Grob::extent (Grob *refp, Axis a) const
 Interval
 Grob::pure_height (Grob *refp, int start, int end)
 {
-  SCM proc = get_property_data (ly_symbol2scm ("Y-extent"));
-  SCM iv_scm = call_pure_function (proc,
-                                  scm_list_1 (self_scm ()),
-                                  start, end);
+  SCM iv_scm = get_pure_property ("Y-extent", start, end);
   Interval iv = robust_scm2interval (iv_scm, Interval (0, 0));
   Real offset = pure_relative_y_coordinate (refp, start, end);
 
@@ -482,6 +492,19 @@ Grob::spanned_rank_interval () const
   return Interval_t<int> (-1, 0);
 }
 
+bool
+Grob::pure_is_visible (int start, int end) const
+{
+  return true;
+}
+
+/* Sort grobs according to their starting column. */
+bool
+Grob::less (Grob *g1, Grob *g2)
+{
+  return g1->spanned_rank_interval ()[LEFT] < g2->spanned_rank_interval ()[LEFT];
+}
+
 /****************************************************************
   REFPOINTS
 ****************************************************************/