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);
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. */
}
-ADD_INTERFACE (Grob, "grob-interface",
+ADD_INTERFACE (Grob,
"A grob represents a piece of music notation\n"
"\n"
"All grobs have an X and Y-position on the page. These X and Y positions\n"
"Y-extent "
"Y-offset "
"after-line-breaking "
+ "avoid-slur "
"axis-group-parent-X "
"axis-group-parent-Y "
"before-line-breaking "
"meta "
"minimum-X-extent "
"minimum-Y-extent "
+ "outside-staff-horizontal-padding "
+ "outside-staff-padding "
+ "outside-staff-priority "
"rotation "
"springs-and-rods "
"staff-symbol "
"transparent "
);
-
-
-
-
/****************************************************************
CALLBACKS
****************************************************************/
-
static SCM
grob_stencil_extent (Grob *me, Axis a)
{