From 494716082b964917ca284fad248b1fdee3b40986 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Mon, 19 Dec 2005 12:24:35 +0000 Subject: [PATCH] * 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. --- ChangeLog | 9 +++++++++ lily/dimension-cache.cc | 8 ++++++++ lily/grob.cc | 24 ++++++++++++++---------- lily/include/dimension-cache.hh | 3 ++- 4 files changed, 33 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef6b3f6320..e7883fe539 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2005-12-19 Han-Wen Nienhuys + + * 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 * lily/main.cc: Nitpick: relocation is not based on path, but on diff --git a/lily/dimension-cache.cc b/lily/dimension-cache.cc index fa5c3d0dbc..a84cdacadc 100644 --- a/lily/dimension-cache.cc +++ b/lily/dimension-cache.cc @@ -33,7 +33,15 @@ Dimension_cache::init () } Dimension_cache::~Dimension_cache () +{ + clear (); +} + +void +Dimension_cache::clear () { delete extent_; delete offset_; + extent_ = 0; + offset_ = 0; } diff --git a/lily/grob.cc b/lily/grob.cc index 97784f2bf7..8d0529b410 100644 --- a/lily/grob.cc +++ b/lily/grob.cc @@ -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); } diff --git a/lily/include/dimension-cache.hh b/lily/include/dimension-cache.hh index 4853203025..21f2708e5f 100644 --- a/lily/include/dimension-cache.hh +++ b/lily/include/dimension-cache.hh @@ -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 */ -- 2.39.2