/* volta-spanner.cc -- implement Volta_spanner source file of the GNU LilyPond music typesetter (c) 1997--2000 Jan Nieuwenhuizen */ #include "box.hh" #include "debug.hh" #include "font-interface.hh" #include "molecule.hh" #include "paper-column.hh" #include "paper-def.hh" #include "text-item.hh" #include "volta-spanner.hh" #include "group-interface.hh" #include "side-position-interface.hh" #include "directional-element-interface.hh" void Volta_spanner::set_interface (Grob*) { } /* this is too complicated. Yet another version of side-positioning, badly implemented. -- * Should look for system_start_delim to find left edge of staff. */ MAKE_SCHEME_CALLBACK(Volta_spanner,brew_molecule,1); SCM Volta_spanner::brew_molecule (SCM smob) { Grob *me = unsmob_grob (smob); Link_array bar_arr = Pointer_group_interface__extract_elements (me, (Item*)0, "bars"); if (!bar_arr.size ()) return SCM_EOL; bool no_vertical_start = false; bool no_vertical_end = to_boolean (me->get_grob_property ("last-volta")); Spanner *orig_span = dynamic_cast (me->original_l_); if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)me)) no_vertical_start = true; if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)me)) no_vertical_end = true; #if 0 // FIXME if (bar_arr.top ()->me->get_grob_property (type_str_.length_i () > 1) no_vertical_end = false; #endif Real staff_thick = me->paper_l ()->get_var ("stafflinethickness"); Real half_space = 0.5; /* the volta spanner is attached to the bar-line, which is moved to the right. We don't need to compensate for the left edge. */ Real left = 0.0; Real w = dynamic_cast(me)->spanner_length () - left - half_space; Real h = gh_scm2double (me->get_grob_property ("height")); Real t = staff_thick * gh_scm2double (me->get_grob_property ("thickness")); /* ugh: should build from line segments. */ SCM at = (gh_list (ly_symbol2scm ("volta"), gh_double2scm (h), gh_double2scm (w), gh_double2scm (t), gh_int2scm (no_vertical_start), gh_int2scm (no_vertical_end), SCM_UNDEFINED)); Box b (Interval (0, w), Interval (0, h)); Molecule mol (b, at); SCM text = me->get_grob_property("text"); SCM properties = gh_list (me->mutable_property_alist_, me->immutable_property_alist_,SCM_UNDEFINED); Molecule num = Text_item::text2molecule (me, text, properties); mol.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length () - 1.0); mol.translate_axis (left, X_AXIS); return mol.smobbed_copy (); } void Volta_spanner::add_bar (Grob *me, Item* b) { Pointer_group_interface::add_element(me, "bars",b); Side_position::add_support (me,b); add_bound_item (dynamic_cast(me), b); } void Volta_spanner::add_column (Grob*me, Grob* c) { Side_position::add_support (me,c); }