X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-spanner.cc;h=ac0973f9e5954f210780934254de57346042b2fd;hb=d26be70e8f3942df6f13e25a7f79321b9b98d1a8;hp=86a16e1c324fb04026d01fb23042f05192ba62de;hpb=fc81e281674f9d3cb627ef84e8597f14ac78a046;p=lilypond.git diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index 86a16e1c32..ac0973f9e5 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -3,101 +3,147 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Jan Nieuwenhuizen + (c) 1997--1999 Jan Nieuwenhuizen */ -#include "atom.hh" + #include "box.hh" #include "debug.hh" #include "lookup.hh" #include "molecule.hh" -//#include "note-column.hh" -#include "p-col.hh" // urg +#include "note-column.hh" +#include "paper-column.hh" #include "bar.hh" -#include "p-col.hh" #include "paper-def.hh" #include "volta-spanner.hh" #include "stem.hh" -#include "text-def.hh" - -/* - Hmm, should probably make generic Bracket_spanner, - or and derive Plet and volta spanner from that. - */ +#include "dimension-cache.hh" +#include "group-interface.hh" Volta_spanner::Volta_spanner () { - dir_ = UP; 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; + dim_cache_ [Y_AXIS]->set_callback (dim_callback); + set_elt_property ("bars", SCM_EOL); + set_elt_property ("note-columns", SCM_EOL); } Molecule* -Volta_spanner::brew_molecule_p () const +Volta_spanner::do_brew_molecule_p () const { Molecule* mol_p = new Molecule; - if (column_arr_.size ()){ - Real dx = paper ()->internote_f (); - Real w = width ().length () - 2 * dx; - Real dy = column_arr_.top ()->extent (Y_AXIS) [dir_] > - column_arr_[0]->extent (Y_AXIS) [dir_]; - dy += 4; - - Atom num (number_p_->get_atom (paper (), LEFT)); - Atom dot (dot_p_->get_atom (paper (), LEFT)); - Real gap = num.dim_.x ().length () / 2; - Offset off (num.dim_.x ().length () + gap, - num.dim_.y ().length () - 4 - gap / paper ()->internote_f ()); - // urg? - off -= Offset (0, num.dim_.y ().length () + gap / paper ()->internote_f ()); - num.translate (off); - dot.translate (off); - mol_p->add_atom (num); - mol_p->add_atom (dot); - mol_p->add_atom (lookup_l ()->volta (w, last_b_)); - mol_p->translate (Offset (dx, dy)); - } + Link_array bar_arr + = Group_interface__extract_elements (this, (Bar*)0, "bars"); + + if (!bar_arr.size ()) + return mol_p; + + Link_array note_column_arr + = Group_interface__extract_elements (this, (Bar*)0, "note-columns"); + + + bool no_vertical_start = false; + bool no_vertical_end = last_b_; + Spanner *orig_span = dynamic_cast (original_l_); + if (orig_span && (orig_span->broken_into_l_arr_[0] != (Spanner*)this)) + no_vertical_start = true; + if (orig_span && (orig_span->broken_into_l_arr_.top () != (Spanner*)this)) + no_vertical_end = true; + if (bar_arr.top ()->type_str_.length_i () > 1) + no_vertical_end = false; + + Real interline_f = paper_l ()->get_var ("interline"); + Real internote_f = interline_f/2; + Real t = paper_l ()->get_var ("volta_thick"); + + Real dx = internote_f; + Real w = spanner_length() - dx - get_broken_left_end_align (); + Real h = paper_l()->get_var ("volta_spanner_height"); + Molecule volta (lookup_l ()->volta (h, w, t, no_vertical_start, no_vertical_end)); + + + Molecule num (lookup_l ()->text ("volta", number_str_, paper_l ())); + Real dy = bar_arr.top ()->extent (Y_AXIS) [UP] > + bar_arr[0]->extent (Y_AXIS) [UP]; + dy += 2 * h; + + for (int i = 0; i < note_column_arr.size (); i++) + dy = dy >? note_column_arr[i]->extent (Y_AXIS)[BIGGER]; + dy -= h; + + Molecule two (lookup_l ()->text ("number", "2", paper_l ())); + Real gap = two.dim_.x ().length () / 2; + Offset off (num.dim_.x ().length () + gap, + h / internote_f - gap); + num.translate (off); + mol_p->add_molecule (volta); + mol_p->add_molecule (num); + mol_p->translate (Offset (0, dy)); return mol_p; } void Volta_spanner::do_add_processing () { - if (column_arr_.size ()) + + Link_array bar_arr + = Group_interface__extract_elements (this, (Bar*)0, "bars"); + + if (bar_arr.size ()) { - set_bounds (LEFT, column_arr_[0]); - set_bounds (RIGHT, column_arr_.top ()); + set_bounds (LEFT, bar_arr[0]); + set_bounds (RIGHT, bar_arr.top ()); } - number_p_->style_str_ = "number-1"; - dot_p_->text_str_ = "."; - dot_p_->style_str_ = "bold"; } - + +/* + Originally the following comment existed here + "in most cases, it's a lot better not no have height...", + but problems existed with collision between volta spanner + and above staff or lyrics for multi-staff music, so the proper + height is now being returned. Additional space should still + be added elsewhere so lyrics from above staff do not sit on + volta spanner. (Roy R. Rankin) +*/ +Interval +Volta_spanner::dim_callback (Dimension_cache const *c) +{ + Volta_spanner * v = dynamic_cast (c->element_l ()); + Real h = v->paper_l()->get_var ("volta_spanner_height") * 2.; + return Interval (0., h); +} + void Volta_spanner::do_post_processing () { - if (column_arr_.size()) - translate_axis (column_arr_[0]->extent (Y_AXIS)[dir_], Y_AXIS); + + Link_array bar_arr + = Group_interface__extract_elements (this, (Bar*)0, "bars"); + + if (bar_arr.size()) + translate_axis (bar_arr[0]->extent (Y_AXIS)[UP], Y_AXIS); + translate_axis (get_broken_left_end_align (), X_AXIS); } + + void -Volta_spanner::do_substitute_dependency (Score_element* o, Score_element* n) +Volta_spanner::add_bar (Bar* c) { -// if (Note_column* c = dynamic_cast (o)) -// column_arr_.substitute (c, dynamic_cast (n)); - if (Bar* c = dynamic_cast (o)) - column_arr_.substitute (c, dynamic_cast (n)); + Group_interface gi(this, "bars"); + gi.add_element (c); + + add_dependency (c); } - + void -//Volta_spanner::add_column (Note_column* c) -Volta_spanner::add_column (Bar* c) +Volta_spanner::add_column (Note_column* c) { - column_arr_.push (c); + Group_interface gi(this, "note-columns"); + gi.add_element (c); + add_dependency (c); } +