X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-spanner.cc;h=3046205792b03c30032affb687206d779f40e467;hb=4b40ecf0af9b4ff3fcf4287ae685ac1a9cc89523;hp=b0c5ea4b7de8e8663f0430cc7c12526e59cae74f;hpb=27b7a223db56f4b39f73268d0ee20a3b90c0944b;p=lilypond.git diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index b0c5ea4b7d..3046205792 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -3,126 +3,109 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Jan Nieuwenhuizen + (c) 1997--2000 Jan Nieuwenhuizen */ -#include "atom.hh" + #include "box.hh" #include "debug.hh" -#include "lookup.hh" +#include "font-interface.hh" #include "molecule.hh" -#include "note-column.hh" -#include "p-col.hh" // urg -#include "bar.hh" -#include "p-col.hh" +#include "paper-column.hh" #include "paper-def.hh" +#include "text-item.hh" #include "volta-spanner.hh" -#include "stem.hh" -#include "text-def.hh" +#include "group-interface.hh" +#include "side-position-interface.hh" +#include "directional-element-interface.hh" + -Volta_spanner::Volta_spanner () +void +Volta_spanner::set_interface (Grob*) { - last_b_ = false; - number_p_.set_p (new Text_def); - number_p_->align_dir_ = LEFT; - dot_p_.set_p (new Text_def); - dot_p_->align_dir_ = LEFT; } -Molecule* -Volta_spanner::do_brew_molecule_p () const +/* + 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) { - Molecule* mol_p = new Molecule; - - if (!column_arr_.size ()) - return mol_p; - - Real internote_f = paper ()->internote_f (); - Real dx = internote_f; - Real w = extent (X_AXIS).length () - 2 * dx; - Atom volta (lookup_l ()->volta (w, last_b_)); - Real h = volta.dim_.y ().length (); - Atom num (number_p_->get_atom (paper (), LEFT)); - Atom dot (dot_p_->get_atom (paper (), LEFT)); - Real dy = column_arr_.top ()->extent (Y_AXIS) [UP] > - column_arr_[0]->extent (Y_AXIS) [UP]; - dy += 2 * h; + 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; /* - UGH. Must use extent ()[dir_] + 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. */ - for (int i = 0; i < note_column_arr_.size (); i++) - dy = dy >? note_column_arr_[i]->extent (Y_AXIS).max (); - dy -= h; - - Real gap = num.dim_.x ().length () / 2; - Offset off (num.dim_.x ().length () + gap, - (h - num.dim_.y ().length ()) / internote_f - gap); - num.translate (off); - Real dotheight = dot.dim_.y ().length () / 7; - off -= Offset (0, dotheight); - dot.translate (off); - mol_p->add_atom (volta); - mol_p->add_atom (num); - mol_p->add_atom (dot); - mol_p->translate (Offset (dx, dy)); - return mol_p; -} - -void -Volta_spanner::do_add_processing () -{ - if (column_arr_.size ()) - { - set_bounds (LEFT, column_arr_[0]); - // set_bounds (RIGHT, column_arr_.top ()); - // huh? - // array.top () == last element?? - // list.top () == first element - set_bounds (RIGHT, column_arr_[column_arr_.size () - 1]); - } - number_p_->style_str_ = "number-1"; - dot_p_->text_str_ = "."; - dot_p_->style_str_ = "bold"; -} - -Interval -Volta_spanner::do_height () const -{ + 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")); + /* - in most cases, it's a lot better not no have height... - */ - Interval i; - return i; -} + 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)); -void -Volta_spanner::do_post_processing () -{ - if (column_arr_.size()) - translate_axis (column_arr_[0]->extent (Y_AXIS)[UP], Y_AXIS); -} + 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); -void -Volta_spanner::do_substitute_dependency (Score_element* o, Score_element* n) -{ - if (Note_column* c = dynamic_cast (o)) - note_column_arr_.substitute (c, dynamic_cast (n)); - else if (Bar* c = dynamic_cast (o)) - column_arr_.substitute (c, dynamic_cast (n)); + 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_column (Bar* c) +Volta_spanner::add_bar (Grob *me, Item* b) { - column_arr_.push (c); - add_dependency (c); + 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 (Note_column* c) +Volta_spanner::add_column (Grob*me, Grob* c) { - note_column_arr_.push (c); - add_dependency (c); + Side_position::add_support (me,c); } -