]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/grob.cc (suicide): clear dim_caches_.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 19 Dec 2005 12:24:35 +0000 (12:24 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 19 Dec 2005 12:24:35 +0000 (12:24 +0000)
* lily/dimension-cache.cc (clear): new function.

* lily/grob.cc (extent): swap order of min-extent and extent
calculations. This fixes hara kiri staves.

ChangeLog
lily/dimension-cache.cc
lily/grob.cc
lily/include/dimension-cache.hh

index ef6b3f63200536ed1221b720eee004b49a102f6d..e7883fe53997092b9296f5e459ba5a7dcc4ce514 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-12-19  Han-Wen Nienhuys  <hanwen@xs4all.nl>
+
+       * lily/grob.cc (suicide): clear dim_caches_.
+
+       * lily/dimension-cache.cc (clear): new function.
+
+       * lily/grob.cc (extent): swap order of min-extent and extent
+       calculations. This fixes hara kiri staves. 
+
 2005-12-19  Jan Nieuwenhuizen  <janneke@gnu.org>
 
        * lily/main.cc: Nitpick: relocation is not based on path, but on
index fa5c3d0dbc56441116f1bb9b1cba1866914982b6..a84cdacadcf20d5d51d8d124eec0ec67dcc6ccb6 100644 (file)
@@ -33,7 +33,15 @@ Dimension_cache::init ()
 }
 
 Dimension_cache::~Dimension_cache ()
+{
+  clear ();
+}
+
+void
+Dimension_cache::clear ()
 {
   delete extent_;
   delete offset_;
+  extent_ = 0;
+  offset_ = 0;
 }
index 97784f2bf765cfb911b5273e5c5dc1f4aeda92c6..8d0529b41008eb986b58a6c3025643a0f376b142 100644 (file)
@@ -210,6 +210,9 @@ Grob::suicide ()
   if (!is_live ())
     return;
 
+  for (int a = X_AXIS; a < NO_AXES; a++)
+    dim_cache_[a].clear ();
+
   mutable_property_alist_ = SCM_EOL;
   object_alist_ = SCM_EOL;
   immutable_property_alist_ = SCM_EOL;
@@ -332,24 +335,25 @@ Grob::extent (Grob *refp, Axis a) const
     }
   else
     {
-      SCM min_ext_sym =
-       (a == X_AXIS)
-       ? ly_symbol2scm ("minimum-X-extent")
-       : ly_symbol2scm ("minimum-Y-extent");
-
+      /*
+       Order is significant: ?-extent may trigger suicide.
+       */
       SCM ext_sym =
        (a == X_AXIS)
        ? ly_symbol2scm ("X-extent")
        : ly_symbol2scm ("Y-extent");
-  
-      SCM min_ext = internal_get_property (min_ext_sym);
-      SCM ext = internal_get_property (ext_sym);
 
-      if (is_number_pair (min_ext))
-       real_ext.unite (ly_scm2interval (min_ext));
+      SCM ext = internal_get_property (ext_sym);
       if (is_number_pair (ext))
        real_ext.unite (ly_scm2interval (ext));
 
+      SCM min_ext_sym =
+       (a == X_AXIS)
+       ? ly_symbol2scm ("minimum-X-extent")
+       : ly_symbol2scm ("minimum-Y-extent");
+      SCM min_ext = internal_get_property (min_ext_sym);
+      if (is_number_pair (min_ext))
+       real_ext.unite (ly_scm2interval (min_ext));
       ((Grob*)this)->del_property (ext_sym);
       ((Grob*)this)->dim_cache_[a].extent_ = new Interval (real_ext);  
     }
index 48532030258b7cc51319aa0ceb1d30538fc43855..21f2708e5f7bbaa006da6574c91fe3239fc8a3bd 100644 (file)
@@ -22,13 +22,14 @@ class Dimension_cache
   Interval *extent_;
   Real *offset_;
   Grob *parent_;
+  void init ();
+  void clear ();
   
   friend class Grob;
   
   Dimension_cache (Dimension_cache const &);
   ~Dimension_cache ();
   Dimension_cache ();
-  void init ();
 };
 
 #endif /* DIMENSION_CACHE_HH */