]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/grob.cc
Fix #230
[lilypond.git] / lily / grob.cc
index 4e7a3e196ebe352fee72f34985742d8d3e54e9e6..02bf6a1b50a5062057a181132eb3eccd5f7e33eb 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include "grob.hh"
@@ -59,7 +59,16 @@ Grob::Grob (SCM basicprops,
 
   SCM meta = get_property ("meta");
   if (scm_is_pair (meta))
-    interfaces_ = scm_cdr (scm_assq (ly_symbol2scm ("interfaces"), meta));
+    {
+      interfaces_ = scm_cdr (scm_assq (ly_symbol2scm ("interfaces"), meta));
+
+      SCM object_cbs = scm_assq (ly_symbol2scm ("object-callbacks"), meta);
+      if (scm_is_pair (object_cbs))
+       {
+         for (SCM s = scm_cdr (object_cbs); scm_is_pair (s); s = scm_cdr (s))
+           set_object (scm_caar (s), scm_cdar (s)); 
+       }
+    }
   
   if (get_property_data ("X-extent") == SCM_EOL)
     set_property ("X-extent", Grob::stencil_width_proc);
@@ -70,7 +79,7 @@ Grob::Grob (SCM basicprops,
 Grob::Grob (Grob const &s, int copy_index)
   : dim_cache_ (s.dim_cache_)
 {
-  key_ = (use_object_keys) ? new Copied_key (s.key_, copy_index) : 0;
+  key_ = 0; // (use_object_keys) ? new Copied_key (s.key_, copy_index) : 0;
   original_ = (Grob *) & s;
   self_scm_ = SCM_EOL;
 
@@ -309,13 +318,15 @@ Grob::pure_relative_y_coordinate (Grob const *refp, int start, int end)
      it probably means that the Alignment was fixed and it has already been
      calculated.
   */
-  Grob *p = get_parent (Y_AXIS);
-  Real trans = 0;
-  if (Align_interface::has_interface (p) && !dim_cache_[Y_AXIS].offset_)
-    trans = Align_interface::get_pure_child_y_translation (p, this, start, end);
+  if (Grob *p = get_parent (Y_AXIS))
+    {
+      Real trans = 0;
+      if (Align_interface::has_interface (p) && !dim_cache_[Y_AXIS].offset_)
+       trans = Align_interface::get_pure_child_y_translation (p, this, start, end);
 
-  return off + trans
-    + dim_cache_[Y_AXIS].parent_->pure_relative_y_coordinate (refp, start, end);
+      return off + trans + p->pure_relative_y_coordinate (refp, start, end);
+    }
+  return off;
 }
 
 /* Invoke callbacks to get offset relative to parent.  */
@@ -418,11 +429,11 @@ 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"));
-  Interval iv = robust_scm2interval (call_pure_function (proc,
-                                                        scm_list_1 (self_scm ()),
-                                                        start, end),
-                                    Interval (0, 0));
+  SCM proc = get_property_data (ly_symbol2scm ("Y-extent"));
+  SCM iv_scm = call_pure_function (proc,
+                                  scm_list_1 (self_scm ()),
+                                  start, end);
+  Interval iv = robust_scm2interval (iv_scm, Interval (0, 0));
   Real offset = pure_relative_y_coordinate (refp, start, end);
 
   SCM min_ext = get_property ("minimum-Y-extent");
@@ -621,6 +632,8 @@ ADD_INTERFACE (Grob,
               "meta "
               "minimum-X-extent "
               "minimum-Y-extent "
+              "outside-staff-horizontal-padding "
+              "outside-staff-padding "
               "outside-staff-priority "
               "rotation "
               "springs-and-rods "
@@ -629,15 +642,10 @@ ADD_INTERFACE (Grob,
               "transparent "
               );
 
-
-
-
-
 /****************************************************************
   CALLBACKS
 ****************************************************************/
 
-
 static SCM
 grob_stencil_extent (Grob *me, Axis a)
 {