2 volta-spanner.cc -- implement Volta_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 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"
21 #include "pointer.tcc"
23 Volta_spanner::Volta_spanner ()
29 Volta_spanner::do_brew_molecule_p () const
31 Molecule
* mol_p
= new Molecule
;
33 if (!bar_arr_
.size ())
36 bool no_vertical_start
= false;
37 bool no_vertical_end
= last_b_
;
38 Spanner
*orig_span
= dynamic_cast<Spanner
*> (original_l_
);
39 if (orig_span
&& orig_span
->broken_into_l_arr_
[0] != this)
40 no_vertical_start
= true;
41 if (orig_span
&& orig_span
->broken_into_l_arr_
.top () != this)
42 no_vertical_end
= true;
43 if (bar_arr_
.top ()->type_str_
.length_i () > 1)
44 no_vertical_end
= false;
46 Real interline_f
= paper_l ()->get_realvar (interline_scm_sym
);
47 Real internote_f
= interline_f
/2;
48 Real t
= paper_l ()->get_realvar (volta_thick_scm_sym
);
50 Real dx
= internote_f
;
51 Real w
= extent (X_AXIS
).length () - dx
;
52 Real h
= paper_l()->get_var ("volta_spanner_height");
53 Molecule
volta (lookup_l ()->volta (h
, w
, t
, no_vertical_start
, no_vertical_end
));
56 Molecule
num (lookup_l ()->text ("volta", number_str_
, paper_l ()));
57 Real dy
= bar_arr_
.top ()->extent (Y_AXIS
) [UP
] >
58 bar_arr_
[0]->extent (Y_AXIS
) [UP
];
61 for (int i
= 0; i
< note_column_arr_
.size (); i
++)
62 dy
= dy
>? note_column_arr_
[i
]->extent (Y_AXIS
)[BIGGER
];
65 Molecule
two (lookup_l ()->text ("number", "2", paper_l ()));
66 Real gap
= two
.dim_
.x ().length () / 2;
67 Offset
off (num
.dim_
.x ().length () + gap
,
68 h
/ internote_f
- gap
);
70 mol_p
->add_molecule (volta
);
71 mol_p
->add_molecule (num
);
72 mol_p
->translate (Offset (0, dy
));
77 Volta_spanner::do_add_processing ()
81 set_bounds (LEFT
, bar_arr_
[0]);
82 set_bounds (RIGHT
, bar_arr_
.top ());
87 Volta_spanner::do_height () const
90 in most cases, it's a lot better not no have height...
97 Volta_spanner::do_post_processing ()
100 translate_axis (bar_arr_
[0]->extent (Y_AXIS
)[UP
], Y_AXIS
);
104 Volta_spanner::do_substitute_element_pointer (Score_element
* o
, Score_element
* n
)
106 if (Note_column
* c
= dynamic_cast <Note_column
*> (o
))
107 note_column_arr_
.substitute (c
, dynamic_cast<Note_column
*> (n
));
108 else if (Bar
* c
= dynamic_cast <Bar
*> (o
))
109 bar_arr_
.substitute (c
, dynamic_cast<Bar
*> (n
));
113 Volta_spanner::add_bar (Bar
* c
)
120 Volta_spanner::add_column (Note_column
* c
)
122 note_column_arr_
.push (c
);