]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/spanner.cc
Web-ja: update introduction
[lilypond.git] / lily / spanner.cc
index 84752313213c5df7c3c8ff6e03473cae3e8c1e53..f73657afe184bfec6820190186c53759d0c04458 100644 (file)
@@ -210,7 +210,7 @@ Spanner::set_bound (Direction d, Grob *s)
       original parent for alignment.
       This happens e.g. for MultiMeasureRestNumbers and PercentRepeatCounters.
     */
-    if (!dynamic_cast <Spanner *> (this->get_parent (X_AXIS)))
+    if (!dynamic_cast <Spanner *> (get_parent (X_AXIS)))
       set_parent (i, X_AXIS);
 
   /*
@@ -224,19 +224,22 @@ Spanner::set_bound (Direction d, Grob *s)
     Pointer_group_interface::add_grob (i, ly_symbol2scm ("bounded-by-me"), this);
 }
 
+Preinit_Spanner::Preinit_Spanner ()
+{
+  spanned_drul_.set (0, 0);
+  pure_property_cache_ = SCM_UNDEFINED;
+}
+
 Spanner::Spanner (SCM s)
   : Grob (s)
 {
   break_index_ = 0;
-  spanned_drul_.set (0, 0);
-  pure_property_cache_ = SCM_UNDEFINED;
 }
 
 Spanner::Spanner (Spanner const &s)
   : Grob (s)
 {
-  spanned_drul_.set (0, 0);
-  pure_property_cache_ = SCM_UNDEFINED;
+  break_index_ = 0;
 }
 
 /*
@@ -341,8 +344,11 @@ Spanner::derived_mark () const
       scm_gc_mark (spanned_drul_[d]->self_scm ());
   ;
 
-  for (vsize i = broken_intos_.size (); i--;)
-    scm_gc_mark (broken_intos_[i]->self_scm ());
+  // If break_index_ is -1, broken_intos_ might not yet have run its
+  // constructor and any access might break things.
+  if (break_index_ != (vsize)-1)
+    for (vsize i = broken_intos_.size (); i--;)
+      scm_gc_mark (broken_intos_[i]->self_scm ());
 }
 
 /*
@@ -364,7 +370,7 @@ MAKE_SCHEME_CALLBACK (Spanner, set_spacing_rods, 1);
 SCM
 Spanner::set_spacing_rods (SCM smob)
 {
-  Grob *me = Grob::unsmob (smob);
+  Grob *me = unsmob<Grob> (smob);
   SCM num_length = me->get_property ("minimum-length");
   SCM broken_length = me->get_property ("minimum-length-after-break");
   if (scm_is_number (num_length)
@@ -437,7 +443,7 @@ MAKE_SCHEME_CALLBACK (Spanner, calc_normalized_endpoints, 1);
 SCM
 Spanner::calc_normalized_endpoints (SCM smob)
 {
-  Spanner *me = Spanner::unsmob (smob);
+  Spanner *me = unsmob<Spanner> (smob);
   SCM result = SCM_EOL;
 
   Spanner *orig = dynamic_cast<Spanner *> (me->original ());
@@ -449,11 +455,8 @@ Spanner::calc_normalized_endpoints (SCM smob)
       Real total_width = 0.0;
       vector<Real> span_data;
 
-      if (!orig->is_broken ())
-        span_data.push_back (orig->spanner_length ());
-      else
-        for (vsize i = 0; i < orig->broken_intos_.size (); i++)
-          span_data.push_back (orig->broken_intos_[i]->spanner_length ());
+      for (vsize i = 0; i < orig->broken_intos_.size (); i++)
+        span_data.push_back (orig->broken_intos_[i]->spanner_length ());
 
       vector<Interval> unnormalized_endpoints;
 
@@ -484,7 +487,7 @@ MAKE_SCHEME_CALLBACK (Spanner, bounds_width, 1);
 SCM
 Spanner::bounds_width (SCM grob)
 {
-  Spanner *me = Spanner::unsmob (grob);
+  Spanner *me = unsmob<Spanner> (grob);
 
   Grob *common = me->get_bound (LEFT)->common_refpoint (me->get_bound (RIGHT), X_AXIS);
 
@@ -500,7 +503,7 @@ MAKE_SCHEME_CALLBACK (Spanner, kill_zero_spanned_time, 1);
 SCM
 Spanner::kill_zero_spanned_time (SCM grob)
 {
-  Spanner *me = Spanner::unsmob (grob);
+  Spanner *me = unsmob<Spanner> (grob);
   /*
     Remove the line or hairpin at the start of the line.  For
     piano voice indicators, it makes no sense to have them at
@@ -533,7 +536,7 @@ Spanner::get_cached_pure_property (SCM sym, int start, int end)
   // The pure property cache is indexed by (name start . end), where name is
   // a symbol, and start and end are numbers referring to the starting and
   // ending column ranks of the current line.
-  if (scm_hash_table_p (pure_property_cache_) == SCM_BOOL_F)
+  if (scm_is_false (scm_hash_table_p (pure_property_cache_)))
     return SCM_UNDEFINED;
 
   SCM key = scm_cons (sym, scm_cons (scm_from_int (start), scm_from_int (end)));
@@ -543,7 +546,7 @@ Spanner::get_cached_pure_property (SCM sym, int start, int end)
 void
 Spanner::cache_pure_property (SCM sym, int start, int end, SCM val)
 {
-  if (scm_hash_table_p (pure_property_cache_) == SCM_BOOL_F)
+  if (scm_is_false (scm_hash_table_p (pure_property_cache_)))
     pure_property_cache_ = scm_c_make_hash_table (17);
 
   SCM key = scm_cons (sym, scm_cons (scm_from_int (start), scm_from_int (end)));