2 volta-spanner.cc -- implement Volta_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2000 Jan Nieuwenhuizen <janneke@gnu.org>
13 #include "molecule.hh"
14 #include "note-column.hh"
15 #include "paper-column.hh"
17 #include "paper-def.hh"
18 #include "volta-spanner.hh"
20 #include "dimension-cache.hh"
21 #include "group-interface.hh"
25 Volta_spanner::Volta_spanner ()
27 dim_cache_
[Y_AXIS
]->set_callback (dim_callback
);
28 set_elt_property ("bars", SCM_EOL
);
29 set_elt_property ("note-columns", SCM_EOL
);
33 FIXME: too complicated.
36 Volta_spanner::do_brew_molecule_p () const
38 Molecule
* mol_p
= new Molecule
;
40 Link_array
<Bar
> bar_arr
41 = Group_interface__extract_elements (this, (Bar
*)0, "bars");
46 Link_array
<Score_element
> note_column_arr
47 = Group_interface__extract_elements (this, (Score_element
*)0, "note-columns");
49 bool no_vertical_start
= false;
50 bool no_vertical_end
= to_boolean (get_elt_property ("last-volta"));
51 Spanner
*orig_span
= dynamic_cast<Spanner
*> (original_l_
);
52 if (orig_span
&& (orig_span
->broken_into_l_arr_
[0] != (Spanner
*)this))
53 no_vertical_start
= true;
54 if (orig_span
&& (orig_span
->broken_into_l_arr_
.top () != (Spanner
*)this))
55 no_vertical_end
= true;
59 if (bar_arr
.top ()->get_elt_property (type_str_
.length_i () > 1)
60 no_vertical_end
= false;
63 Real staff_space
= paper_l ()->get_var ("interline");
64 Real half_staff_space
= staff_space
/2;
65 Real t
= paper_l ()->get_var ("volta_thick");
67 Real dx
= half_staff_space
;
68 Real w
= spanner_length() - dx
- get_broken_left_end_align ();
69 Real h
= paper_l()->get_var ("volta_spanner_height");
73 SCM at
= (gh_list (ly_symbol2scm ("volta"),
77 gh_int2scm (no_vertical_start
),
78 gh_int2scm (no_vertical_end
),
81 volta
.dim_
[Y_AXIS
] = Interval (- h
/2, h
/2);
82 volta
.dim_
[X_AXIS
] = Interval (0, w
);
85 Molecule
num (lookup_l ()->text ("volta",
86 ly_scm2string (get_elt_property("text")),
88 Real dy
= bar_arr
.top ()->extent (Y_AXIS
) [UP
] >?
89 bar_arr
[0]->extent (Y_AXIS
) [UP
];
95 FIXME (see axis-group-elt, side-pos interface.)
97 for (int i
= 0; i
< note_column_arr
.size (); i
++)
98 dy
= dy
>? note_column_arr
[i
]->extent (Y_AXIS
)[BIGGER
];
101 Molecule
two (lookup_l ()->text ("volta", "2", paper_l ()));
102 Real gap
= two
.dim_
.x ().length () / 2;
103 Offset
off (num
.dim_
.x ().length () + gap
,
104 h
/ half_staff_space
- gap
);
106 mol_p
->add_molecule (volta
);
107 mol_p
->add_molecule (num
);
108 mol_p
->translate (Offset (0, dy
));
113 Volta_spanner::do_add_processing ()
116 Link_array
<Bar
> bar_arr
117 = Group_interface__extract_elements (this, (Bar
*)0, "bars");
121 set_bounds (LEFT
, bar_arr
[0]);
122 set_bounds (RIGHT
, bar_arr
.top ());
127 Originally the following comment existed here
128 "in most cases, it's a lot better not no have height...",
129 but problems existed with collision between volta spanner
130 and above staff or lyrics for multi-staff music, so the proper
131 height is now being returned. Additional space should still
132 be added elsewhere so lyrics from above staff do not sit on
133 volta spanner. (Roy R. Rankin)
136 Volta_spanner::dim_callback (Dimension_cache
const *c
)
138 Volta_spanner
* v
= dynamic_cast<Volta_spanner
*> (c
->element_l ());
139 Real h
= v
->paper_l()->get_var ("volta_spanner_height") * 2.;
140 return Interval (0., h
);
144 Volta_spanner::do_post_processing ()
146 Link_array
<Bar
> bar_arr
147 = Group_interface__extract_elements (this, (Bar
*)0, "bars");
150 translate_axis (bar_arr
[0]->extent (Y_AXIS
)[UP
], Y_AXIS
);
151 translate_axis (get_broken_left_end_align (), X_AXIS
);
155 Volta_spanner::add_bar (Bar
* c
)
157 Group_interface
gi(this, "bars");
164 Volta_spanner::add_column (Note_column
* c
)
166 Group_interface
gi(this, "note-columns");